Visual Basic,VBA数组循环

我用http://www.homeandlearn.org/arrays_and_loops.html来帮助我。

我有过滤到一个表的数据连接。 不幸的是,当程序将文件导出到Excel时,其中一个源随机地将错误的数据(通常是date)放在错误的列(客户端列)中。 我想要做的是类似于索引/匹配function。 我想检查这个主表(A)中的每个预留号码与同一工作簿中的另一个表(B)。 如果来自其他工作表(B)的预订号码与主表(A)中的预留号码相匹配,则希望将正确的客户端值input到主表(A)中。 我还是很新的VBA所以任何帮助表示赞赏。 我试图修改我的代码,但无济于事。 另外,我原本是在没有真实数据的情况下将其作为练习来使用,所以我没有搞乱我的原始文件。 我试图添加适当的语法来引用其他工作表,而不是所以我想这也可能input不正确。 这里是我提出的最接近的原始代码:

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 

我不记得这个错误,因为代码不完全如上,但接近它。 我相信它遇到的问题是当ivariables超过19时,系统找不到数组> 19.我需要VBA来检查当前在3k +的行数不断变化的19个数组。 我试图添加另一个variables,如果我保持variables分离,我可以让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。 在网上search时,我发现可能是因为我有2个“For”,一个if语句,if语句中的“next”语句,然后另一个“next”语句。 我认为必须这样做,这样B列中的每个单元格都将被检查以反映所有数组的可能性。

看下面的图片。 我需要从工作表中的列P(实际帐单名称)的值:TMRtoSPIde在工作表:TMRtoSPIde的列K中的预留编号与工作表中的预留:工程数据相匹配时,在工作表上input到列D(出具发票名称)的原始数据:原始数据。 您会注意到工作表:RawData在“帐单名称”列中有一个错误的5位序列date。 这些是我想要取代的。

在这里输入图像说明

在这里输入图像说明

字典和集合是匹配唯一值的理想select。 在这个例子中,我使用一个Scripting.Dictionary来存储唯一的ID和引用它们被find的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 

你的循环可能应该是这样的:

 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