请测试下一个代码:
Private Sub ComboBox1_Change()
Dim sh As Worksheet, lastR As Long, arr, arrFin, count As Long, i As Long, j As Long, k As Long
Set sh = ActiveSheet 'use here the necessary one
lastR = sh.Range("A" & sh.rows.count).End(xlUp).Row
arr = sh.Range("A2:F" & lastR).value 'place the range in an array for faster processing
count = WorksheetFunction.CountIf(sh.Range("A2:A" & lastR), ComboBox1.value) 'count the specific string occurrences
If count > 0 Then
ReDim arrFin(1 To count, 1 To UBound(arr, 2) - 1) 'redim the final aray
For i = 1 To UBound(arr)
If arr(i, 1) = ComboBox1.value Then
k = k + 1
For j = 1 To UBound(arrFin, 2)
If j = UBound(arrFin, 2) Then
arrFin(k, j) = Format(arr(i, j + 1) - arr(i, j), "hh:mm:ss")
Else
arrFin(k, j) = arr(i, j)
End If
Next j
End If
Next i
Else
listBox1.Clear
End If
With listBox1
.ColumnCount = UBound(arrFin, 2)
.List = arrFin
End With
End Sub
当然,你必须根据你的需要设置每列的宽度。
Edited:
下一个版本也将在第六列(当前月份)上过滤返回的数组,同时也会引入第七列。请注意 G:G 列中包含 STRINGS 月份名称:
Private Sub ComboBox1_Change()
Dim sh As Worksheet, lastR As Long, arr, arrFin, count As Long, i As Long, j As Long, k As Long
Dim arrMonths: arrMonths = Split("January,February,March,April,May,June,July,August,September,October,November,December", ",")
Dim curMonth As String: curMonth = arrMonths(Month(Date) - 1)
Set sh = ActiveSheet 'use here the necessary one
lastR = sh.Range("A" & sh.Rows.count).End(xlUp).Row 'last row in the range to be processed
arr = sh.Range("A2:G" & lastR).Value 'place the range in an array for faster processing
'calculate the necessary array elements:
count = WorksheetFunction.CountIfs(sh.Range("A2:A" & lastR), ComboBox1.Value, sh.Range("F2:F" & lastR), curMonth)
If count > 0 Then
ReDim arrFin(1 To count, 1 To UBound(arr, 2) - 1) 'redim the necessary array to keep the rows to be loaded in list box
For i = 1 To UBound(arr)
If arr(i, 1) = ComboBox1.Value And arr(i, 6) = curMonth Then
k = k + 1
For j = 1 To UBound(arrFin, 2)
If j = UBound(arrFin, 2) - 2 Then
arrFin(k, j) = Format(arr(i, j + 1) - arr(i, j), "hh:mm:ss")
ElseIf j = UBound(arrFin, 2) - 1 Then
arrFin(k, UBound(arrFin, 2) - 1) = curMonth
ElseIf j = UBound(arrFin, 2) Then
arrFin(k, UBound(arrFin, 2)) = arr(i, j + 1)
Else
arrFin(k, j) = arr(i, j)
End If
Next j
End If
Next i
Else
ListBox1.Clear: Exit Sub
End If
With ListBox1
.ColumnCount = UBound(arrFin, 2)
.List = arrFin
End With
End Sub
如果您需要收集更多列,请将它们放在最后四列之前。根据问题设计了一段代码。如果必须返回一个新列,代码可以相对容易地进行调整,但是如果您想要再返回一个,然后再返回另外两个,则处理起来会很困难。
如果您将所有这些添加到最后四个之前,如上所述,那么在仅调整下一个问题后它将运行良好:
- 将要处理的范围扩展到最后一列(
arr = sh.Range("A2:x" & lastR).value
)
- 识别保留月份名称的列并在第二部分中使用它
count
计算 (sh.Range("x2:x" & lastR), curMonth
)
- 在数组处理中使用上述列 NUMBER (
arr(i, colNo) = curMonth
).