首先出发:
在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
答案 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参数不兼容的值。