VBA中的Redimension和粘贴动态范围

时间:2011-06-23 13:29:46

标签: arrays vba dynamic range

我是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

现在,有两个问题:

  1. 该函数在数组时中断 第二次重新定尺寸 (1)
  2. 我也有错误 粘贴结果(2)因为 范围应该在我之前定义 猜,但我找不到 传递范围维度的方法 参数方式
  3. 我会感激任何帮助,谢谢!

1 个答案:

答案 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数组。