Arrays 在VBA中使用数组而不是范围
我现在只使用VBA几个星期了,所以请容忍我 我正在尝试更改宏,以便它从数组而不是范围中读取。其中一个部分我需要改变uses.formulaR1C1来运行一个vlookup,但是我很难弄清楚如何使用数组来实现这一点 这方面的一个例子如下所示:Arrays 在VBA中使用数组而不是范围,arrays,vba,excel,excel-formula,Arrays,Vba,Excel,Excel Formula,我现在只使用VBA几个星期了,所以请容忍我 我正在尝试更改宏,以便它从数组而不是范围中读取。其中一个部分我需要改变uses.formulaR1C1来运行一个vlookup,但是我很难弄清楚如何使用数组来实现这一点 这方面的一个例子如下所示: .Range("M2:L" & lastrow).FormulaR1C1 = "=VLOOKUP(RC[-1], Sheet2!R1C1:R4C10, 3, 0)" 我不太确定是否可以像上面那样将数组的值设置为公式,或者是否必须将值存储为字符串,然
.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
提前谢谢 您可以尝试使用
.Offset()
:
子测试()
最后一行=11
附页(1)
设置Rng=.Range(“M2:L”和lastrow)
以
对于i=0到Rng.Rows.Count-1
Rng.Offset(i,12).公式R1C1=“=VLOOKUP(RC[-1],表2!R1C1:R4C10,3,0)”
下一个
端接头
将值存储为字符串肯定是一个有效的选项。只需在数组中写入公式,假定它是Variant/String类型,当您将数据放回工作表时,您可以使用Cell(Range)对象上的.FormulaR1C1
将其作为公式应用
arr(i, 13) = "=VLOOKUP(RC[-1],WMSPAM!R1C1:R4C10,3,0)"
...
Range("M2").FormulaR1C1 = Arr(1,13)
我相信这种方法对您来说可能是最有效、最容易维护的方法。当你正在学习并且似乎对什么是可能的感到好奇时,这里有一些更多的例子说明你可以如何处理这个问题,并给出一些进一步的解释
.formula1c1
是一个范围对象方法,因此对数组项调用它的唯一方法是如果该项是范围对象
Dim arr(0 To 10) As Range
Set arr(0) = Range("A1")
arr(0).FormulaR1C1 = "=2+2"
请注意,由于范围是一个对象(引用类型),此操作将直接影响数组中指定的范围。在上述示例中,公式“=2+2”将被放入单元格A1
。您可以进一步了解引用类型和值类型之间的区别
如果数组仅包含值,则实现所需的另一种方法是使用
工作表函数
对象。使用此对象,您可以访问VBA中工作表中使用的公式函数
WorksheetFunction.VLookup(Arg1, Arg2, Arg3, Arg4)
与任何编写代码的方法一样,WorksheetFunction
方法需要反复尝试才能让它们按预期的方式工作,但根据我的经验,这些方法可能很难实现,尽管在某些情况下它们非常有用
您可以阅读有关
VLookup
方法的更多信息 我不知道你在问什么。您的第一行代码以目前最有效的方式将公式写入两列范围,而第二行代码片段则以一次一个单元格的方式将公式写入两列范围。如果目标是使用vlookup填充单元格,然后处理公式,一种有效的方法是:
.Range("M2:L" & lastrow).FormulaR1C1 = "=VLOOKUP(RC[-1], Sheet2!R1C1:R4C10, 3, 0)"
.Range("M2:L" & lastrow).Value2 = .Range("M2:L" & lastrow).Value2
不能将数组设置为等于公式。您可以将其设置为包含公式,例如,
arr(i,13)=“=VLOOKUP(RC[-1],WMSPAM!R1C1:R4C10,3,0)”
然后当您将数组写回工作表时,您可以将单元格。FormulaR1C1
属性设置为数组公式。谢谢Tom!这正是我需要知道的。您可以使用应用程序。计算来设置数组中公式的结果,但是我不确定您是否可以使用非显式R1C1表示法(例如RC[-1]
)来实现它。为什么您首先需要对数组执行此操作?嗨,Omega,这只是代码的一小部分,而且它经常在数万行上运行,所以使用数组可以提高性能。嗨,omega,谢谢你的建议。我用ranges编写的代码是有效的,我只是想找到一种方法,使用arrayLooks让它工作,就像我将使用第一个选项一样。这类似于我头脑中的“变通方法”,但我不知道如何把笔写在纸上。谢谢你花时间解释@DMI没问题,谢谢你花时间在问题中恰当地解释你的问题和想法。很高兴能回答一个问题,这个问题不仅仅是“这是我的代码,请为我修复它”,不幸的是,这在VBA标记中似乎太常见了。