VBA VLookup动态范围

时间:2018-07-18 14:16:13

标签: excel vba excel-vba

首先出发:
在sheet1上,我在A列上有一组数据,在F列上有一种数据类型。
在sheet2上,我有一个庞大的列表,其中的列A与上列F具有相同的数据,列B具有相同的数据类型。在A列中的每个数据点都在B列中设置了数据类型

现在我的问题:
我编写的代码将sheet2(A2:A2978)中的数据与sheet1(A3:A271)中的数据进行了比较。
如果它们不相同,则会给我一个带有错误的MsgBox,然后转到下一个数据点。
如果它们相同,则继续检查sheet2(B2:B2978)是否与sheet1(F3:F271)相同。
如果它们不相同,则会再次显示错误,然后继续。
如果它们相同,则仅转到A列中的下一个数据点。

此代码目前适用。问题是我想使sheet1和2处于动态范围,因为我想稍后更改代码,所以我可以在行数不同的不同excel文件以及从中获取数据的主文件中使用它变化。
我尝试这样做:

Set refRng = Tabelle2.Range("A1", Range("A" & Rows.count).End(xlUp))

代替

Set refRng = Tabelle2.Range("A2:A2978")  

但是,一旦我这样做,代码就不再进入下一个循环,而是停留在compare A列中。
VLookup如下所示:

strTextSearch = WorksheetFunction.VLookup(c.Value, refRng, 1, False)  

这是整个代码,除了动态范围外,都可以很好地工作:

Sub CompareData()    
    Dim strTextSearch        As String
    Dim strTextMain          As String
    Dim strText              As String
    Dim count                As Long
    Dim refRng               As Range
    Dim tarRng               As Range

    On Error Resume Next

    '// Change range to data you want to target
    Set tarRng = Tabelle1.Range(Cells(3, 2), Cells(271, 2))

    For Each c In tarRng       
        With c
            count = count + 1

            Set refRng = Tabelle2.Range("A2:A2978")

            'c.value is the value you compare to
            strTextSearch = WorksheetFunction.VLookup(c.Value, refRng, 1, False)

            'If the values match
            If c.Value <> vbNullString And strTextSearch = c.Value Then
                Call CompareDataType(count, c)
            Else
                MsgBox "Error First Loop: " + c
                Call CompareDataType(count, c)
            End If
        End With
    Next
End Sub


Sub CompareDataType(count, c)
    Dim strTextSearchDT        As String
    Dim strTextMainDT         As String
    Dim strTextDT              As String
    Dim cd                As Excel.Range

    On Error Resume Next

    '// Change range to data you want to compare
    For Each cd In Tabelle1.Range(Cells(count + 2, 6), Cells(271, 6))
        With cd
            'Set the range from where you take the data
            strTextSearchDT = WorksheetFunction.VLookup(cd.Value, Tabelle2.Range("B2:B2978"), 1, False)

            'If the values match
            If cd.Value <> vbNullString And strTextSearchDT = cd.Value Then
                'MsgBox "Success i guess: " + cd
                Exit For
            Else
                MsgBox "Group Data Type Wrong: " + c + " " + cd
                Exit For          
            End If     
        End With
    Next
End Sub

很抱歉,我删除了所有的debug.Print,看起来有点怪异。
希望您能对我有所帮助,或者给我一个提示,让我如何使它动态化,我尝试在不使用单元格的情况下进行此操作,但是一旦我使用.row.count进行设置,它便将不再起作用。

EDIT1:如果我摆脱On Error Resume Next,则会收到错误400
在此,使用已定义的A:A值进行调试的样子

count 1 
count 2 
count 3 
count 4 
c.Value: CellBalAhSumNvm
count 5 
c.Value: BalCurrAvgPerCellNvm
count 6 
c.Value: CellBalAhSumAvgNvm

动态图片如下:

count 1 
count 2 
count 3 
count 4 
count 5 

它只是与A列相连,甚至不考虑转到第二个函数,似乎c.value没有得到正确的值或类似的东西。

关于, Mathias

1 个答案:

答案 0 :(得分:0)

我自己找到了答案:

要获取范围变量,请按以下步骤操作:

 Dim Lastrow              As Integer


         Lastrow = Tabelle2.Cells(Rows.count, 2).End(xlUp).Row
         Set refRng = Tabelle2.Range("A2:A" & Lastrow)

由于某种原因,它实际上移到第二个函数,因为它在c.value中找到了与Cells参数不兼容的值。

相关问题