【问题标题】:Redimension and paste dynamic ranges in VBA在 VBA 中重新调整和粘贴动态范围
【发布时间】:2011-09-21 05:50:04
【问题描述】:

我是 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) 因为 范围应该在我之前定义 猜,但我找不到 传递范围维度的方法 参数化方式

如果有任何帮助,我将不胜感激,谢谢!

【问题讨论】:

  • rangeTimeValue的类型是什么?

标签: arrays vba dynamic range


【解决方案1】:

1.重新调整保留

引用 VBA 帮助

如果使用 Preserve 关键字,则只能调整最后一个数组维度的大小

...当您尝试ReDim Preserve 第一个维度时。此外,ReDim Preserve 是一项昂贵的操作,除非绝对必要,否则您应该避免它,而您的情况并非如此。由于您可以计算出数组将包含的最大元素数,因此只需将 ReDim 放在代码顶部一次即可。

此外,明确指定数组的下限是一种很好的做法,而不是让它们成为默认值并希望得到最好的结果。

如何做这两件事的例子:

Dim nVal As Long
nVal = WorksheetFunction.CountA(rangeTimeValue.Columns(1))
ReDim outputRange(1 To nVal, 1 To 2)

2。 “粘贴”结果

我不确定你在这里的意思,因为你没有在任何地方粘贴任何东西。这是您的意思是通过*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 数组。

【讨论】:

  • 谢谢,但我在 'rngOutput.Resize(UBound(outputRange, 1), UBound(outputRange, 2)) = outputRange' 行仍然有错误
  • “一个错误”...你没有给我太多的工作,是吗。究竟是什么错误? nVal 的值是多少? outputRange 在您将其放在工作表上之前的内容是什么?你觉得这个答案有用吗?
  • 对不起,我刚刚修复它,这是代码中变量声明的问题。我想我们可以考虑结案。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多