【问题标题】:Writing 2nd dimension to Range from a 2D variant without looping in VBA将二维变量从二维变量写入范围而不在 VBA 中循环
【发布时间】:2013-09-20 08:25:04
【问题描述】:

我有一个变体变量,并像这样将以下范围值传递给它。

Option Base 1
Dim varEmployees As Variant

varEmployees = Range("A1:B5").Value

这个 2D 变体现在在第 1 维中具有员工 ID,在第 2 维中具有员工姓名。所以我们得到类似下面的东西。

varEmployees(1,1) = 1234    varEmployees(1,2) = John Doe
varEmployees(2,1) = 5678    varEmployees(2,2) = Jane Smith
varEmployees(3,1) = 9012    varEmployees(3,2) = Mary Major
varEmployees(4,1) = 3456    varEmployees(4,2) = Judy Stiles
varEmployees(5,1) = 7890    varEmployees(5,2) = Richard Miles

我只想在不使用循环的情况下将第二维写回一个范围,但是当我使用以下代码时...

Range("D1:D5") = varEmployees

我只得到实际结果下显示的第一个维度,但我想要的是我想要的结果(只有第二个维度)。

Actual Results       Desired Results
--------------       ---------------
    1234             John Doe
    5678             Jane Smith
    9012             Mary Major
    3456             Judy Stiles
    7890             Richard Miles

有没有办法做到这一点,或者是否有我不知道的关于变体数组的规则。

【问题讨论】:

标签: excel vba range variants


【解决方案1】:

使用someRange.Value 获得的变体数组始终是从 1 开始的,因此您实际上并不需要 Option Base 1

这是一种可以满足您的要求的方法:

Sub Test()

    Dim a As Variant, b As Variant
    a = Range("A1:B5").Value

    'get a specific column
    b = Application.Index(a, 0, 2) '0="all rows"
    With Range("D10")
        .Resize(UBound(b), 1).Value = b
    End With

    'get a specific row
    b = Application.Index(a, 2, 0) '0="all cols"
    With Range("D21")
        .Resize(1, UBound(b)).Value = b
    End With        
End Sub

【讨论】:

  • +1!我不知道Application.Index 可以从数组中切出一行/列。
  • 谢谢。我也不知道我们可以这样使用Application.Index。猜猜我必须声明另一个变体变量才能使其工作。无论如何,再次感谢你。我查了Application.Index,得到了这个有趣的网站VBA Trick
  • 你可以不用中间数组来做——我只是为了让代码更容易理解而包含它。
猜你喜欢
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
相关资源
最近更新 更多