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

时间:2017-05-15 08:13:57

标签: arrays excel vba excel-vba excel-formula

我现在只使用VBA几周了,所以请耐心等待。

我正在尝试更改宏,以便从数组而不是范围中读取。我需要更改的部分之一使用.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

提前致谢!

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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