在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