繁体   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