2017-08-16 147 views
0

我用http://www.homeandlearn.org/arrays_and_loops.html來幫我解決這個問題。Visual Basic,VBA數組循環

我有過濾到一個表的數據連接。不幸的是,當程序將文件導出到Excel時,其中一個源隨機地將錯誤的數據(通常是日期)放在錯誤的列(客戶端列)中。我想要做的是類似於索引/匹配功能。我想在同一工作簿中檢查此主表(A)中的每個預留號碼與另一個表(B)。如果來自其他工作表(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檢查當前處於3k +的行數不斷變化的19個數組。我試圖添加另一個變量,如果我保持變量分離,我可以讓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列中的每個單元格都可以檢查所有數組的可能性。

查看下面的圖片。我需要工作表中的P列(實際帳單名稱)的值:TMRtoSPIde在工作表:TMRtoSPIde中K列中的預訂編號與工作表中的預留:RawData匹配時,可以在工作表上輸入到列D(出具發票名稱)中的RawData:RawData。您會注意到該表單:RawData在「結算名稱」列中有一個錯誤的5位數序列日期。這些是我想要取代的。

enter image description here

enter image description here

+0

如果'工作表( 「工作表Sheet」)被發現的預訂號碼。範圍( 「B2」)。Value'然後'工作表( 「Sheet 2中」)。範圍( 「P2」)。值= 工作表(「Sheet1」)。範圍(「E2」)。值。奇怪的是,您正在更新'Worksheets(「Sheet2」)上的同一行作爲'Worksheets(「Sheet1」)上的保留號''我認爲您必須在'Worksheets(「 Sheet2「)'。 – 2017-08-16 23:43:22

+0

你絕對正確。我要回到這裏的繪圖板。感謝您接受這一點。 – Craig

+0

'MyArray()'的目的是什麼?這些是您希望限制代碼使用的帳號的子集嗎?是否有其他帳號不想使用? – 2017-08-17 17:02:30

回答

1

字典和集合是理想的匹配唯一值。在這個例子中,我使用Scripting.Dictionary來存儲唯一ID,並且引用它們被發現的EntireRow

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

它會更簡單地存儲所需的值,我只是想證明您可以將對象引用存儲在字典中。請注意,您可以將對象存儲爲字典中的鍵和/或值。人們犯的一個常見錯誤是嘗試並存儲範圍參考,因爲密鑰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 
+0

由於您提到的整行內容以及在代碼中看到的內容,因此我在閱讀您的回覆後稍微更改了內容。我擔心我會轉移左邊的另一張桌子,這是我不需要的。所以我拿着綠色標題的正確桌子,放在自己的紙上,改變了編碼,以便相應地匹配它,瞧!非常感謝你的幫助。我從來沒有聽說過VBA的集合和詞典,所以我會研究它們。我對VBA還很陌生,很快就要上課了,所以感謝讓我領先一點,花時間和解決方案! – Craig

0

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

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 
+0

謝謝您關注此事。我會採取托馬斯的建議,並嘗試將其與你的配合,然後提供我的發現。 – Craig