2017-08-16 84 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