VBA - 如何循环遍历列并插入数组公式

时间:2016-08-23 13:54:21

标签: excel vba excel-vba

我有以下冗余代码:

Sheets("Data").Range("D8").FormulaArray = "=IFERROR(INDEX(data_range, MATCH(D3&$C8, client_range & date_range, 0),MATCH(D2, name_range, 0)), ""Error"")"

Sheets("Data").Range("E8").FormulaArray = "=IFERROR(INDEX(data_range, MATCH(E3&$C8, client_range & date_range, 0),MATCH(E2, name_range, 0)), ""Error"")"

Sheets("Data").Range("F8").FormulaArray = "=IFERROR(INDEX(data_range, MATCH(F3&$C8, client_range & date_range, 0),MATCH(F2, name_range, 0)), ""Error"")"

Sheets("Data").Range("G8").FormulaArray = "=IFERROR(INDEX(data_range, MATCH(G3&$C8, client_range & date_range, 0),MATCH(G2, name_range, 0)), ""Error"")"

Sheets("Data").Range("H8").FormulaArray = "=IFERROR(INDEX(data_range, MATCH(H3&$C8, client_range & date_range, 0),MATCH(H2, name_range, 0)), ""Error"")"

Sheets("Data").Range("I8").FormulaArray = "=IFERROR(INDEX(data_range, MATCH(I3&$C8, client_range & date_range, 0),MATCH(I2, name_range, 0)), ""Error"")"

Sheets("Data").Range("J8").FormulaArray = "=IFERROR(INDEX(data_range, MATCH(J3&$C8, client_range & date_range, 0),MATCH(J2, name_range, 0)), ""Error"")"

Sheets("Data").Range("K8").FormulaArray = "=IFERROR(INDEX(data_range, MATCH(K3&$C8, client_range & date_range, 0),MATCH(K2, name_range, 0)), ""Error"")"

Sheets("Data").Range("L8").FormulaArray = "=IFERROR(INDEX(data_range, MATCH(L3&$C8, client_range & date_range, 0),MATCH(L2, name_range, 0)), ""Error"")"

Sheets("Data").Range("M8").FormulaArray = "=IFERROR(INDEX(data_range, MATCH(M3&$C8, client_range & date_range, 0),MATCH(M2, name_range, 0)), ""Error"")"

有没有办法可以通过循环遍历列来使这段代码更紧凑和可维护?

谢谢!

4 个答案:

答案 0 :(得分:1)

这是一种方法。有问题请问:

Sub DoSomething()
    Dim sRange1 As String, sRange2 As String, sRange3 As String
    Dim i As Integer

    For i = 4 To 13
        sRange1 = Cells(8, i).Address
        sRange2 = Cells(3, i).Address
        sRange3 = Cells(2, i).Address
        Sheets("Data").Range(sRange1).FormulaArray = "=IFERROR(INDEX(data_range, MATCH(" & sRange2 & "&$C8, client_range & date_range, 0),MATCH(" & sRange3 & ", name_range, 0)), ""Error"")"
    Next i
End Sub

答案 1 :(得分:1)

您需要使用Cells而不是Range作为FormulaArray和Address的父级来动态计算公式:

Dim C As Long: For C = 4 To 13 ' Column 'D' = Column 4
    Sheets("Data").Cells(8,C).FormulaArray = "=IFERROR(INDEX(data_range, MATCH(" & Sheets("Data").Columns(3,C).Address(False, False) & "&$C8, client_range & date_range, 0),MATCH(" & Sheets("Data").Columns(2,C).Address(False, False) & ", name_range, 0)), ""Error"")"
Next C

修订代码:

Dim C As Long: For C = 4 To 13 ' Column 'D' = Column 4
    ActiveSheet.Cells(C, 8).FormulaArray = "=IFERROR(INDEX(data_range, MATCH(" & ActiveSheet.Cells(C, 3).Address(False, False) & "&$C8, client_range & date_range, 0),MATCH(" & ActiveSheet.Cells(C, 2).Address(False, False) & ", name_range, 0)), ""Error"")"
Next C

当然,您可能希望使用Sheets(" Data")而不是ActiveSheet,具体取决于您的工作环境。

答案 2 :(得分:0)

我使用范围属性偏移量,如https://msdn.microsoft.com/en-us/library/office/ff840060.aspx所示。根据循环的增量对其进行偏移 编辑:

 for i = 0 to range.("d8").end(xlRight)
 Sheets("Data").range("d8").offset(0, i).FormulaArray = "=IFERROR(INDEX(data_range, match(Sheets("Data").range("d8").offset(-5,i) & Sheets("Data").range("c8"), client_range & date_range, 0), Match(Sheets("Data").range("d8").offset(-6,i), name_range, 0)), ""Error"")"    next i

该功能从单元格D8开始,并在列中不断将其偏移1;所以它在第一次迭代时将公式放入d8,在第二次迭代时放入e8,将f8放在第三次,依此类推。

似乎在每次迭代中,您都在寻找位于该列第三行(第一次迭代时的IE D3)和第二行(第二次迭代时的IE D2)的数据。基本上我提出的解决方案用

替换每个单元格引用

表("数据&#34)范围内。(" D8&#34)。偏移量(X,i)的

其中X根据您要从中检索信息的行而更改;在你写的第8行(X = 0),第3行(x = -5)或第2行(x = -6)

的情况下

答案 3 :(得分:-1)

我认为你不需要循环。 .Formula调整不具有$

的相对行和列
Sheets("Data").Range("D8:M8").FormulaArray = "=IFERROR(INDEX(data_range, MATCH(D3&$C8, client_range & date_range, 0),MATCH(D2, name_range, 0)), ""Error"")"

<强>更新

For Each c in Split("D E F G H I J K L M")
    Sheets("Data").Range(c & "8").FormulaArray = "=IFERROR(INDEX(data_range, MATCH(" & c & _
        "3&$C8, client_range & date_range, 0),MATCH(" & c & "2, name_range, 0)), ""Error"")"
Next

For Each cell in Sheets("Data").Range("D8:M8")
    c = Chr(64 + cell.column)  ' Asc("A") is 65  ' or c = Left(cell.Address(0,0))
    cell.FormulaArray = "=IFERROR(INDEX(data_range, MATCH(" & c & _
        "3&$C8, client_range & date_range, 0),MATCH(" & c & "2, name_range, 0)), ""Error"")"
Next