【问题标题】:Using array instead of ranges in VBA在 VBA 中使用数组而不是范围
【发布时间】:2017-05-15 08:13:56
【问题描述】:

我现在才使用 VBA 几个星期,所以请耐心等待。

我正在尝试更改宏,以便它从数组而不是范围中读取。我需要更改的部分之一使用 .formulaR1C1 来运行 vlookup,但我很难弄清楚如何使用数组完成此操作。

下面这行就是一个例子:

.Range("M2:L" & lastrow).FormulaR1C1 = "=VLOOKUP(RC[-1], Sheet2!R1C1:R4C10, 3, 0)"

我不太确定是否可以将数组的值设置为公式,就像我在上面所做的那样,或者我是否必须将值存储为字符串然后编辑单元格的值稍后将列打印回工作表时。

到目前为止我所拥有的如下:

For i = 2 To lastrow
arr(i, 13).FormulaR1C1 = "=VLOOKUP(RC[-1],Sheet2!R1C1:R4C10,3,0)"
Next

提前致谢!

【问题讨论】:

  • 您不能将数组设置为等于公式。您可以将其设置为包含公式,例如arr(i,13) = "=VLOOKUP(RC[-1],WMSPAM!R1C1:R4C10,3,0)" 然后,当您将数组写回工作表时,您可以将cell.FormulaR1C1 属性设置为等于数组公式。
  • 谢谢汤姆!这几乎就是我需要知道的
  • 您可以使用 Application.Evaluate 在数组中设置公式的结果,但是我不确定您是否可以使用非显式 R1C1 表示法来实现它(例如 RC[-1]
  • 为什么首先需要对数组进行此操作?
  • 嗨 Omega,这只是代码的一小部分,它经常运行在数万行之上,所以使用数组是一种性能提升。

标签: arrays vba excel excel-formula


【解决方案1】:

将值存储为字符串肯定是一个有效的选择。只需在数组中写入公式,假设它是 Variant / String 类型,当您将数据放回工作表时,您可以在单元格(范围)对象上使用 .FormulaR1C1 将其作为公式应用。

arr(i, 13) = "=VLOOKUP(RC[-1],WMSPAM!R1C1:R4C10,3,0)"
...
Range("M2").FormulaR1C1 = Arr(1,13)

我相信这种方法对您来说可能是最有效且最容易维护的。当您正在学习并且似乎对什么是可能的感到好奇时,这里有几个示例说明您可以如何解决这个问题,并提供一些进一步的解释。


.FormulaR1C1 是 Range 对象方法,因此在 Array 项上调用它的唯一方法是该项是 Range 对象。

Dim arr(0 To 10) As Range
Set arr(0) = Range("A1")
arr(0).FormulaR1C1 = "=2+2"

请注意,由于 Ranges 是一个 Object(引用类型),因此此操作将直接影响数组中指定的 Range。在上面的例子中,公式“=2+2”将被放入单元格A1。您可以详细了解引用类型和值类型之间的区别here


如果你的数组只包含值,另一种实现你需要的方法是使用WorksheetFunction 对象。使用此对象,您可以在 VBA 中访问将在工作表中使用的公式函数。

WorksheetFunction.VLookup(Arg1, Arg2, Arg3, Arg4)

与编写代码的任何事情一样,WorksheetFunction 方法需要一些试验和错误才能让它们按照您的预期工作,但根据我的经验,这些具体实现起来可能很棘手,但在某些情况下它们可以很有用!

您可以阅读有关VLookup 方法here 的更多信息。

【讨论】:

  • 看来我会选择第一个选项。这类似于我脑海中的“解决方法”,但我不确定如何将笔放在纸上。感谢您花时间解释!
  • @DMI 没问题,感谢您花时间在您的问题中正确解释您的问题和想法。很高兴回答一个不仅仅是“这是我的代码,请为我修复它”的问题,不幸的是,这在 VBA 标记中似乎太常见了。
【解决方案2】:

您可以尝试使用.Offset():

Sub Test()

    lastrow = 11
    With Sheets(1)
        Set Rng = .Range("M2:L" & lastrow)
    End With

    For i = 0 To Rng.Rows.Count - 1
        Rng.Offset(i, 12).FormulaR1C1 = "=VLOOKUP(RC[-1],Sheet2!R1C1:R4C10,3,0)"
    Next

End Sub

【讨论】:

  • 嗨欧米茄,感谢您的建议。我使用范围的代码有效,我只是想找到一种方法让它使用数组来工作
【解决方案3】:

我不确定你在问什么。您的第一个代码行以最有效的方式将公式写入两列范围,您的第二个 sn-p 显示了当时在一个单元格中执行此操作的效率较低的方式。如果目标是使用 vlookup 填充单元格然后处理公式,那么一种有效的方法是:

.Range("M2:L" & lastrow).FormulaR1C1 = "=VLOOKUP(RC[-1], Sheet2!R1C1:R4C10, 3, 0)"
.Range("M2:L" & lastrow).Value2 = .Range("M2:L" & lastrow).Value2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    相关资源
    最近更新 更多