[英]Excel VBA Multiple Loops with Variables within the Loops
我已經堅持了一段時間,我真的可以使用一些幫助。 我有這個子搜索五個工作表(B,E,L,I,T)中標題為“ Account”的列。 找到匹配項后,它將執行vlookup,以將整個列的值帶入跨頁的另一個工作表(MasterTab)中。 效果很好。 但是我需要使其循環,以便它可以使用550個變量的數組(這些是其他列標題)來完成此過程。
我對循環非常了解,並且了解基本示例,但是這一示例似乎很復雜,因為
mf_x_TEXT
變量(匹配函數的字符串)和每個mf_x
變量(匹配函數本身) 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函數聲明為變量,然后將變量放入index_col_num
部分。
我知道程序員不會手動編寫550次,因此必須有一種超出我當前理解的方法。 如果可以的話請幫助,這讓我發瘋。
這將從母版表中獲取“變量”名稱。 將它們全部放在第2列開始的第1行中。假定要在其他工作表中查找的值在“主表”和其他工作表的第一列中。
如果查找值和列位於多張工作表中,則將用數組后面列出的工作表覆蓋該值。 例如,如果在工作表“ 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特定的問題,但是我可以提供一般的編程建議。
如果您要遍歷的值已經在工作表中,則可以從工作表中收集值。 如果沒有,您可以創建另一個工作表來存儲值列表。
如果由於某種原因您無法外部化數據,則可以簡單地創建一個變量(或常量)以將值存儲在集合中。 根據您的用例,您可以使用列表(順序)或映射(鍵-值對)類型來存儲它們。 這將使您能夠分別遍歷列表或鍵集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.