Excel VBA循环内带有variables的多个循环

我一直坚持这一段时间,我真的可以用一些帮助。 我有这个子在五个工作表(B,E,L,I,T)内search标题为“Account”的列。 当它find一个匹配的时候,它会做一个vlookup,把整个列的值放到spread中的另一个表格(MasterTab)中。 它工作很好。 但是我需要使它成为一个循环,以便它可以用550个variables(这些是其他列标题)的数组执行此过程。

我很新,循环和理解基本的例子,但这似乎很复杂,因为

  1. 我(想我)需要在一个循环内做一个循环,因为我必须为每个mf_x_TEXTvariables(匹配函数的string)以及每个mf_xvariables(匹配函数本身) mf_x 。 而且由于代码本身就是一个循环,那就是三个循环。
  2. mf_xvariables依赖于mf_x_TEXTvariables的工作,所以我真的不知道如何设置它,以便循环正确地将正确的TEXTvariables放入正确的mf_x匹配函数。

这是我的小工具,没有任何企图得到我正在谈论的工作。 如果我向你展示我在做循环的尝试,它会让事情变得更加混乱。 mf_Accountmf_Account_TEXT是两组550+variables的一个例子。

 Sub GetInfoAltVersion() ' Dim wsMaster As Worksheet: Set wsMaster = Workbooks("LBImportMacroTemplate.xlsm").Worksheets("MasterTab") Dim vWSs As Variant: vWSs = Array("B", "E", "L", "I", "T") ' Dim v As Long Dim Mrange As Range Dim Vrange As Range ' With Workbooks("LBImportMacroTemplate.xlsm") Set Mrange = Nothing Set Vrange = Nothing With ActiveSheet lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row MsgBox lastrow End With ' Dim mf_Account_TEXT As String: mf_Account_TEXT = "Account" 'ETC, THERE ARE MANY MORE VARIABLES JUST LIKE THIS, BUT WITH DIFFERENT STRINGS ' 'THIS IS THE PART THAT I NEED TO LOOP FOR EACH VARIABLE For v = LBound(vWSs) To UBound(vWSs) If CBool(Application.CountIf(.Sheets(vWSs(v)).Range("A2:ZA2"), mf_Account_TEXT)) Then Set Mrange = .Sheets(vWSs(v)).Range("A2:ZA2") Set Vrange = .Sheets(vWSs(v)).Range("A:ZA") mf_Account = Application.Match(mf_Account_TEXT, Mrange, 0) ' For i = 2 To lastrow wsMaster.Cells(i, 2) = Application.VLookup(wsMaster.Cells(i, 1), Vrange, mf_Account, 0) Next i Exit For End If Next v Set Mrange = Nothing Set Vrange = Nothing ' End With End Sub 

有一件事可以帮助的是,如果我可以将application.Match函数放在vlookup函数中,而不必将其变成一个variables,因为这将消除所需的一个循环。 但是我无法通过这种方式来使用vlookup。 我能做到的唯一方法是将匹配函数声明为一个variables,然后将variables放在index_col_num部分。

我知道一个程序员不会手动写这个550次,所以一定有一种超出我目前理解的方式。 请帮忙,如果可以的话,这是让我疯狂。

这将从主表获得“可变”名称。 把它们全部放在第1行,从第2列开始。假定在其他工作表中查找的值在主表单和其他表单的第一列中。

如果查找值和列位于多个工作表中,则将使用稍后在数组中列出的工作表覆盖该值。 例如,如果在工作表“B”和工作表“T”中查找值“12345”和列名“帐户”,则工作表“T”中的值将是数据中显示的值。 如果您需要来自其他工作表的值,请重新排列数组以将最重要的工作表放在最后,否则需要修改代码。

请注意,这可能不是最有效的方法,但它应该工作。

 Sub GetInfoAltVersion() Dim xlWb As Workbook Dim wsMaster As Worksheet Dim vWSs As Variant: vWSs = Array("B", "E", "L", "I", "T") Dim v As Long Dim Mrange As Range Dim Vrange As Range Dim colName As String Dim lastCol As Integer Dim LastRow As Long Dim AccountCol As Integer Dim CurrSheet As Worksheet Set xlWb = Workbooks("LBImportMacroTemplate.xlsm") Set wsMaster = xlWb.Worksheets("MasterTab") LastRow = wsMaster.Cells(wsMaster.Rows.Count, "A").End(xlUp).Row MsgBox LastRow lastCol = wsMaster.Cells(1, wsMaster.Columns.Count).End(xlToLeft).Column MsgBox lastCol For j = 2 To lastCol colName = wsMaster.Cells(1, j).Value For v = LBound(vWSs) To UBound(vWSs) CurrSheet = xlWb.Sheets(vWSs(v)) If CBool(Application.CountIf(CurrSheet.Range("A2:ZA2"), colName)) Then Set Mrange = CurrSheet.Range("A2:ZA2") Set Vrange = CurrSheet.Range("A:ZA") AccountCol = Application.Match(j, Mrange, 0) ' For i = 2 To LastRow wsMaster.Cells(i, j) = Application.VLookup(wsMaster.Cells(i, 1), Vrange, AccountCol, 0) Next i End If Next v Set Mrange = Nothing Set Vrange = Nothing ' Next j End Sub 

希望这可以帮助。

虽然我无法权威地回答VBA特定的问题,但我可以提供一般的编程build议。

如果要迭代的值已经在工作表中,则可以从工作表中收集值。 如果没有,您可以创build另一个工作表来存储值的列表。

如果由于某种原因你不能外部化数据,你可以简单地创build一个variables(或常量)来存储集合中的值。 根据您的使用情况,您可以使用列表(顺序)或映射(键值对)types来存储它们。 这将使您能够遍历列表或一组键。