VBA。查找,date,序列号date和数据types属性(.Text,.Value,.Value2)

使用Range.Find方法遍历一个范围内的每个值,看看它是否存在于另一个范围内。 问题是这两个范围的格式是不同的(但所有的值都是表面上的date),这导致了许多“错误的否定”(即值应该是时不匹配)。 是否有可能控制input和search范围的数据types,以便系统将比较苹果和苹果,并成功识别匹配?

这里是数据和代码:

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进行比较,但是我不确定如何到达那里。

如果您需要将数据保留为真正的date和文本 – 看起来像date那么格式化他飞行的真实date值以查找“文本date”内的匹配。

 Sub FindTest() Dim inputRange As Range, i As Range Dim searchRange As Range, found As Range Set inputRange = Worksheets(1).Cells(2, 1).Resize(99, 1) Set searchRange = Worksheets(2).Columns(1) For Each i In inputRange If IsDate(i) Then ' ▼ format into TXT here ▼ Set found = searchRange.Find(What:=Format(i.Value2, "yyyy-mm-dd"), _ after:=Cells(1), LookIn:=xlValues, LookAt:=xlWhole, _ SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False) If Not (found Is Nothing) Then With Worksheets(3) .Cells(i.Row, i.Column) = i.Address(external:=True) .Cells(i.Row, i.Column + 1) = i.Address(external:=True) End With Else With Worksheets(4) .Cells(i.Row, i.Column) = i.Address(external:=True) .Cells(i.Row, i.Column + 1) = i.Address(external:=True) End With End If End If Next i End Sub 

或者, Range.Text属性应该提供相同的答案。 应用Trim命令以确保inputRangedate未格式化为格式掩码中的尾部_)

  Set found = searchRange.Find(What:=Trim(i.Text), _ after:=Cells(1), LookIn:=xlValues, LookAt:=xlWhole, _ SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False) 

附录:

如果在searchRange存在前导或尾随空格,则将search参数更改为LookAt:=xlPart 。 虽然预先修复数据仍然是更好的select,但会忽略可能干扰成功匹配的无关字符。

如果修复数据可以被认为是一个选项,那么使用YMD xlColumnDataType对文本值进行覆盖的Range.TextToColumns方法将快速将yyyy-mm-dd dd'text -dates'转换为实际date。

  With searchRange .TextToColumns Destination: .Cells (1), DataType:=xlFixedWidth, _ FieldInfo:=Array(0, 5) End With 

这将删除前导/尾随无关字符,并留下一列真正的date。

TextToColumn代码(不成功)

 Sub FindTest() Dim inputRange As Range Dim i 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) searchRange.TextToColumns Destination:=Worksheets(2).Cells(1), DataType:=xlDelimited, FieldInfo:=Array(1, xlTextFormat) 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 

结束小组