我遇到了Excel VBA .find函数的实际问题。
除了解决下面的问题之外,有人能给我一个(低级)理解Range和Cells函数究竟返回的内容吗?我认为它可以容纳一系列细胞,但显然它只是保留了第一个细胞而只是其余细胞的范围值? (现在对我来说有点糊涂了,对不起!)
无论如何,我试图通过将它与文件的旧版本进行比较来检查一行是否存在,是否存在或是否已在更新的文件中更新。两个文件具有相同的列/列名称,但行当然是不同的数据集
我遍历了较新文件中的主键列,并搜索了旧文件中的每个键。如果它存在,我检查该行是否已经更新,如果不存在,我认为它是一个新插入的行。
这很好用,但是当我尝试实现二级密钥功能时,我似乎无法使用.find函数遍历第二个文件的主键子集。我从较新的文件中获取第一个主键和辅助键,在旧文件中找到主键集并遍历每个键以查找是否有任何键具有相应的辅助键。如果确实如此,那就是匹配!但是我的循环是无限的'因为在向二级键列中搜索值后,它会回到顶部(换行)并继续再次搜索这些键!
我尝试过使用.find和After:=以及.findNext函数但无济于事!
我希望这至少有点意义。如果你知道一个更好的方法来实现我想要告诉我的东西,我会非常感激找到一个更简单的解决方案!
Else 'Sheet uses a secondary key
Dim secondKeyFound As Boolean
secondKeyFound = False
While Not primkeyInOldFile Is Nothing
If TodayWorkSheet.Cells(todayRow, secondKeyAt) = YestWorkSheet.Cells(primkeyInOldFile.row, secondKeyAt) Then 'Keys already exist, check for update
secondKeyFound = True
For i = todayCol To TodayWorkSheet.UsedRange.Columns.count
If Not TodayWorkSheet.Cells(todayRow, i) = YestWorkSheet.Cells(primkeyInOldFile.row, i) Then
TodayWorkSheet.Rows(todayRow).Copy newWorkSheet.Rows(finalSheetRows)
newWorkSheet.Cells(finalSheetRows, statusCodeAt).Value = "U"
newWorkSheet.Cells(finalSheetRows, statusCodeAt).EntireRow.Interior.ColorIndex = 36
finalSheetRows = finalSheetRows + 1
Exit For
End If
Next i
End If
Dim downwardRange As Range
Range(primkeyInOldFile.Cells(primkeyInOldFile.row, primKeyAt), primkeyInOldFile.Cells(primkeyInOldFile.row, primKeyAt).End(xlDown)).Select
Set downwardRange = Selection
Set primkeyInOldFile = downwardRange.Find(What:=TodayWorkSheet.Cells(todayRow, primKeyAt).Text, After:=primkeyInOldFile.Cells(primkeyInOldFile.row, primkeyInOldFile.Column), LookIn:=xlFormulas, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
Wend
If Not secondKeyFound Then 'Prim-Second key combo not found, line is a new insert.
TodayWorkSheet.Rows(todayRow).Copy newWorkSheet.Rows(finalSheetRows)
newWorkSheet.Cells(finalSheetRows, statusCodeAt).Value = "I"
newWorkSheet.Cells(finalSheetRows, statusCodeAt).EntireRow.Interior.ColorIndex = 43
finalSheetRows = finalSheetRows + 1
End If
End If
todayRow = todayRow + 1