簡體   English   中英

Visual Basic,VBA數組循環

[英]Visual Basic, VBA array loop

我使用http://www.homeandlearn.org/arrays_and_loops.html來幫助我。

我有過濾到一張桌子的數據連接。 不幸的是,當程序將文件導出到Excel時,其中一個來源隨機將錯誤的數據(通常是日期)放置在錯誤的列(“客戶”列)中。 我想做的事情類似於索引/匹配函數。 我想對照同一工作簿中的另一個表(B)檢查此主表(A)中的每個預訂號。 如果另一張紙(B)上的保留號與主表(A)中的保留號匹配,我想在主表(A)中輸入正確的“客戶”值。 我對VBA還是很陌生,因此不勝感激。 我試圖在這里和那里修改我的代碼,但無濟於事。 另外,我最初是在沒有實際數據的情況下將此操作作為練習,所以我沒有弄亂我的原始文件。 我試圖添加適當的語法來引用其他工作表,但我想可能也會輸入錯誤。 這是我想出的最接近的原始代碼:

Sub TransferData()
Dim MyArray(1 To 19) As Single

MyArray(1) = 81899
MyArray(2) = 87172
MyArray(3) = 87275
MyArray(4) = 87394
MyArray(5) = 87446
MyArray(6) = 87496
MyArray(7) = 87621
MyArray(8) = 87631
MyArray(9) = 87726
MyArray(10) = 87822
MyArray(11) = 87858
MyArray(12) = 88041
MyArray(13) = 88097
MyArray(14) = 88127
MyArray(15) = 88160
MyArray(16) = 88191
MyArray(17) = 88359
MyArray(18) = 88487
MyArray(19) = 88545

For i = 1 To 19
    If Worksheets("Sheet1").Range("B" & i).Value = MyArray(i) Then
       Worksheets("Sheet2").Range("P" & i).Value = _ 
       Worksheets("Sheet1").Range("E" & i).Value
    End If
Next i

End Sub

我不記得該錯誤,因為代碼與上面的代碼不完全相同,但與之接近。 我相信它遇到的問題是,當i變量超過19時,系統找不到> 19的數組。我需要VBA來檢查19k個數組,這些數組的行數不斷變化,當前為3k +。 我試圖添加另一個變量,如果我將變量分開,則可以讓VBA針對所有行檢查19個數組。 這是我為此想到的代碼。

Sub TransferData()
Dim MyArray(1 To 19) As Single

MyArray(1) = 81899
MyArray(2) = 87172
MyArray(3) = 87275
MyArray(4) = 87394
MyArray(5) = 87446
MyArray(6) = 87496
MyArray(7) = 87621
MyArray(8) = 87631
MyArray(9) = 87726
MyArray(10) = 87822
MyArray(11) = 87858
MyArray(12) = 88041
MyArray(13) = 88097
MyArray(14) = 88127
MyArray(15) = 88160
MyArray(16) = 88191
MyArray(17) = 88359
MyArray(18) = 88487
MyArray(19) = 88545

For i = 1 To 5000
For j = 1 To 19
If Worksheets("Sheet1").Range("B" & i).Value = MyArray(j) Then
    Worksheets("Sheet2").Range(i, 16).Value = Worksheets("Sheet1"). _ 
    Range(i,5).Value
    Next j
End If
Next i

End Sub

有了這段代碼,我得到編譯錯誤:沒有For的下一個。 在聯機搜索中,我發現這可能是因為我有2個“ For”,一個if語句,一個if語句內的“ next”語句,以及另一個在循環外的“ next”語句。 我以為必須這樣做,以便B列中的每個單元格都對照所有數組可能性進行檢查。

請參見下面的圖片。 當工作表:TMRtoSPIde的K列中的保留號與工作表:RawData中的保留項匹配時,我需要將工作表:TMRtoSPIde中的列P(實際計費名稱)的值輸入到工作表:RawData中的列D(計費名稱)中。 您會注意到該工作表:RawData在Billing Name列中有一個錯誤的5位數字序列日期。 這些是我要替換的。

在此處輸入圖片說明

在此處輸入圖片說明

詞典和集合是匹配唯一值的理想選擇。 在此示例中,我使用Scripting.Dictionary存儲唯一ID以及對找到的EntireRow的引用。

注意: Range().Range()將返回相對於第一個范圍對象的引用(例如Range("A10").EntireRow.Range("ZZ1").Address返回$ZZ$10 )。

僅存儲所需的值會更簡單,我只是想證明您可以將對象引用存儲在Dictionary中。 重要的是要注意,您可以將對象同時存儲為字典中的鍵和/或值。 人們常犯的一個錯誤是嘗試將范圍引用存儲為鍵dictionary.Add Cells(1,1), Cells(1,2)將存儲對Cells(1,1)的引用作為鍵和Cells(1,2)因為它很有價值。 這樣做的問題是,字典不知道如何比較單元格,因此您將無法基於那里的關鍵關系查找值。 dictionary.Add Cells(1,1).Value, Cells(1,2)是正確的語法。

Sub TransferData()
    Dim r As Range, Source As Range
    Dim d As Object
    Set d = CreateObject("Scripting.Dictionary")
    With Worksheets("TMRtoSPIde")
        For Each r In .Range("B2", .Range("B" & .Rows.Count).End(xlUp))
            If Not d.Exists(r.Value) Then d.Add r.Value, r.EntireRow
        Next
    End With

    With Worksheets("RawData")
        For Each r In .Range("B2", .Range("B" & .Rows.Count).End(xlUp))
            If d.Exists(r.Value) Then
                r.EntireRow.Range("K1").Value = d(r.Value).Range("P1").Value
            End If
        Next
    End With

End Sub

您的循環可能應該是這樣的:

For i = 1 To 5000
    For j = 1 To 19
        If Worksheets("Sheet1").Cells(i, "B").Value = MyArray(j) Then
            Worksheets("Sheet2").Cells(i, "P").Value = Worksheets("Sheet1").Cells(i, "E").Value
            'Exit from the "For j" loop if we found a match
            Exit For
        End If
    Next j
Next i

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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