我是VBA的新手,我遇到阵列和范围问题。我必须编写一个函数来选择由带有时间戳的值组成的范围部分,并在单独的范围内报告它们。
范围就像这样:
A B
1 15-May-11 23:47:40 False
2 15-May-11 23:49:10 False
3 15-May-11 23:49:10 False
4 15-May-11 23:50:52 True
5 15-May-11 23:50:52 False
6 15-May-11 23:51:56 False
7 15-May-11 23:51:56 True
8 15-May-11 23:53:24 False
9 15-May-11 23:53:24 False
我准备了这个功能:
Function selectEvents(rangeTimeValue, Val As String)
Dim outputRange() As Variant
j = 1
For i = 1 To rangeTimeValue.Height
Val_recorded = rangeTimeValue(i, 2).Value
Time_recorded = rangeTimeValue(i, 1).Value
If Val_recorded = Val Then
ReDim Preserve outputRange(j, 2) '(1)
outputRange(j, 1) = Time_recorded
outputRange(j, 2) = Val_recorded
j = j + 1
End If
Next i
selectEvents = Application.Transpose(outputRange) '(2)
End Function
现在,有两个问题:
我会感激任何帮助,谢谢!
答案 0 :(得分:0)
<强> 1。 ReDim Preserve
从VBA帮助中引用
如果您使用保留关键字,则只能调整最后一个数组维度
...当您尝试ReDim Preserve
第一个维度时。此外,ReDim Preserve
是一项昂贵的操作,除非绝对必要,否则你应该避免使用它,而不是你的情况。由于您可以计算出数组中包含的最大元素数,因此只需在代码顶部ReDim
一次。
此外,最好明确指定数组的下限,而不是让它们成为默认值,并希望获得最佳效果。
如何做这两件事的例子:
Dim nVal As Long
nVal = WorksheetFunction.CountA(rangeTimeValue.Columns(1))
ReDim outputRange(1 To nVal, 1 To 2)
<强> 2。 “粘贴”结果
我不确定你的意思,因为你不会在任何地方粘贴任何东西。这是一个错字,你的意思是pas * s * ing?或者你的意思是转置?我无法弄清楚你要用.Transpose
在那一行上做什么。我不知道。我只是在黑暗中刺伤:
如果您想将outputRange
数组的内容放在工作表上的某个位置,那么您可以这样做:
Dim rngOutput As Range
Set rngOutput = Sheet1.Range("G12") ' or wherever
rngOutput.Resize(UBound(outputRange, 1), UBound(outputRange, 2)) _
= outputRange
顺便说一下,outputRange
对于你的数组来说是一个非常可怕的名字。它不是Range
,所以这个名字可能导致混乱,我认为它确实为你做了。为什么不叫它,例如而是varOutput
,因为它是Variant
数组。