在VBA中使用数组而不是范围

我现在只用了几个星期的VBA,所以忍受着我。

我试图改变一个macros,以便它从一个数组而不是一个范围读取。 我需要改变的一个部分使用.formulaR1C1运行一个vlookup,但我很难试图解决这个问题。

下面这行是一个例子:

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

我不太确定是否可以将数组的值设置为公式,如上所述,或者必须将值存储为string,然后在打印后再编辑单元格的值该列回到工作表。

我到目前为止是如下:

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

提前致谢!

将值存储为string当然是一个有效的选项。 只需在数组中写入公式,假定它是Variant / Stringtypes,并且当您将数据放回到工作表中时,可以使用Cell(Range)对象上的.FormulaR1C1将其应用为公式。

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

我相信这种方法可能是您最有效和最容易维护的方法。 正如你正在学习,并似乎好奇什么是可能的,这里有更多的例子,你可以如何处理这个,有一些进一步的解释。


.FormulaR1C1是一个Range对象方法,所以如果该项目是一个Range对象,那么它可以在Array项目上调用的唯一方法。

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

请注意,因为范围是一个对象(引用types),所以此操作将直接影响数组中指定的范围。 在上面的例子中,公式“= 2 + 2”将被放置在单元格A1 。 您可以在这里了解更多关于Reference和Valuetypes的区别。


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

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

与编写代码的任何东西一样, WorksheetFunction方法需要一些试验和错误来让他们工作,你的期望是什么,但以我的经验来说,这些方法可能是一个棘手的实现,但有些情况下,他们可以是非常有用的!

你可以在这里阅读更多关于VLookup方法。

您可以尝试使用.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 

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

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