我已经坚持了一段时间,我真的可以使用一些帮助。我有这个子搜索五个工作表(B,E,L,I,T)中标题为“帐户”的列。当找到匹配时,它会执行vlookup以将整个列的值带入spread中的另一个工作表(MasterTab)。它很棒。但我需要使它成为一个循环,以便它可以使用550个变量的数组执行此过程(这些是其他列标题)。
我对循环很新,并且理解基本的例子,但这个似乎很复杂,因为
mf_x_TEXT
变量(我的匹配函数的字符串),以及每个mf_x
变量(匹配功能本身)。而且由于代码本身就是一个循环,这就是三个循环。mf_x
变量依赖于mf_x_TEXT
变量,所以我真的不知道如何设置它以便循环正确地将正确的TEXT
变量放入右mf_x
匹配功能。这是我的潜艇工作,没有任何尝试得到我正在谈论的工作。如果我告诉你我做循环的尝试,它会让事情变得更加混乱。 mf_Account
和mf_Account_TEXT
是两组550+变量中的一个示例。
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函数中而不必将其变为变量,因为这将消除所需的循环之一。但我无法让vlookup以这种方式工作。我能够做到的唯一方法是将match函数声明为变量,然后将变量放在vlookup的index_col_num
部分。
我知道程序员不会手动写入550次,所以必须有一种超出我目前理解的方式。如果可以,请帮忙,这让我疯了。
答案 0 :(得分:0)
这将从主表中获取“变量”名称。将它们全部放在第2行,从第2列开始。假设在其他工作表中查找的值位于主工作表和其他工作表的第一列中。
如果查找值和列在多个工作表中,那么这将使用稍后在数组中列出的工作表覆盖该值。例如,如果查找值“12345”和列名称“帐户”同时位于工作表“B”和工作表“T”中,则工作表“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
希望这有帮助。
答案 1 :(得分:0)
虽然我不能权威地回答VBA特定的问题,但我可以提供一般的编程建议。
如果要迭代的值已经在工作表中,则可以从工作表中收集值。如果没有,您可以创建另一个工作表来存储值列表。
如果由于某种原因您无法外部化数据,则只需创建一个变量(或常量)即可将值存储在集合中。根据您的使用情况,您可以使用列表(顺序)或映射(键值对)类型来存储它们。这将使您能够分别遍历列表或键集。