簡體   English   中英

Excel VBA多個循環,循環中包含變量

[英]Excel VBA Multiple Loops with Variables within the Loops

我已經堅持了一段時間,我真的可以使用一些幫助。 我有這個子搜索五個工作表(B,E,L,I,T)中標題為“ Account”的列。 找到匹配項后,它將執行vlookup,以將整個列的值帶入跨頁的另一個工作表(MasterTab)中。 效果很好。 但是我需要使其循環,以便它可以使用550個變量的數組(這些是其他列標題)來完成此過程。

我對循環非常了解,並且了解基本示例,但是這一示例似乎很復雜,因為

  1. 我(想想)需要在一個循環中做一個循環,因為我必須為每個mf_x_TEXT變量(匹配函數的字符串)和每個mf_x變量(匹配函數本身) mf_x 而且由於代碼本身是一個循環,所以就是三個循環。
  2. mf_x變量依靠mf_x_TEXT變量來工作,所以我真的不知道如何設置它,以便循環將正確的TEXT變量正確地放置到正確的mf_x匹配函數中。

這是我的工作原理,無需嘗試獲取我要說的東西。 如果我向您展示我進行循環的嘗試,將會使事情更加混亂。 mf_Accountmf_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM