使用Range.Find方法遍歷一個範圍中的每個值以查看它是否存在於另一個範圍中。問題在於兩個範圍的格式都不相同(但所有值都是表面上的日期),這導致了許多「錯誤否定」(即,值在它們應該是時不匹配)。是否有可能控制輸入和搜索範圍的數據類型,以便系統將蘋果與蘋果進行比較併成功識別匹配?VBA。查找,日期,序列號日期和數據類型屬性(.Text,.Value,.Value2)
下面是數據和代碼:
Sheet1 (custom format, "yyyy-mm-dd")
A1 2016-01-01
A2 2016-01-02
A3 2016-01-03
A4 2016-01-04
A5 2016-01-05
Sheet2 (text format)
A1 2016-01-01
A2 2016-01-03
A3 2016-01-05
Sheet3 (display as "yyyy-mm-dd")
[NO DATA]
Sheet4 (display as "yyyy-mm-dd")
[NO DATA]
代碼:
Sub FindTest()
Dim inputRange As Range
Dim searchRange As Range
Dim found As Range
Set inputRange = Worksheets(1).Cells(1, 1).Resize(7, 1)
Set searchRange = Worksheets(2).Cells(1, 1).Resize(5, 1)
For Each i In inputRange
Set found = searchRange.Find _
(What:=i, _
after:=Cells(1, 1), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False, _
SearchFormat:=False)
If Not (found Is Nothing) Then
Worksheets(3).Cells(i.Row, i.Column) = i
Else
Worksheets(4).Cells(i.Row, i.Column) = i
End If
Next i
End Sub
對於這項工作,我認爲我需要inputRange和searchRange所有的值作爲被比較.Text,但我不確定到那裏。
你有沒有考慮修復數據,以便蘋果蘋果和桔子不? – Jeeped
而不是Searchrange.Find使用WHILE循環並逐個比較單元格,然後比較將相同的日期格式轉換爲日期格式,然後進行比較。我認爲你的問題將通過這個解決... –
@Jeeped - 我們已經嘗試過這種方法,但一直未能弄清楚如何使用PowerQuery持續強制執行所需的格式。在生產中,結果是無論我們如何在PowerQuery中定義日期,生成的Excel表都無法反映這些格式,而VBA將數據作爲日期序列號讀取,這意味着它無法將其與相同日期相匹配格式爲yyyy-mm-dd。 –