我在使用excel VBA时匹配()工作时遇到问题。代码是:
x = Application.Match("Sep 2008", Range("F1:F1"), 0)
单元格F1中的值是9/1/2008。
即使我将2008年9月更改为9/1/2008,它仍然不会返回任何值。
知道怎么解决吗?
答案 0 :(得分:12)
Even if I changed Sep 2008 to 9/1/2008, it still doesn't return any value.
因为当Excel中有日期时,Excel会自动将该日期转换为数字值,您真正想要搜索的是:
39692
此数字是9/1/2008
和excel默认值1/1/1900之间的天数
excel中的每个日期都存储有这样的值。因此,处理此问题的最简单方法是使用CDate()
将您看到的日期转换为excel看作日期的内容。
这本身就会给你一个无用的错误,即vba无法获得该属性。
这是因为Lookup_value可以是值(数字,文本或逻辑值)或对数字,文本或逻辑值的单元格引用。不是日期,只需将现在日期值转换为数字,即可使用CLng()
给它一个镜头它也会比使用查找替代方法快得多:
x = WorksheetFunction.Match(CLng(CDate("Sep 2008")), Range("F1:F1"), 0)
这应该会给你预期的结果
要在未找到匹配项时进行处理,请尝试使用此Sub:
Sub MatchDate()
Dim myvalue As Double
Dim LastRow As Long
LastRow = Cells(Rows.Count, "F").End(xlUp)
On Error GoTo NotFound
myvalue = WorksheetFunction.Match(CLng(CDate("Sep 2008")), Range("F1:F" & LastRow), 0)
MsgBox (myvalue)
End
NotFound:
MsgBox ("No Match Was Found")
End
End:
End Sub
答案 1 :(得分:5)
最好的办法是使用.Find()
。如果找到,会返回range
,如果没有,则会nothing
。
Set x = Range("F1:F1").Find(CDate("Sept 2008"), , , xlWhole)
如果您想要列号:
x = Range("F1:F1").Find(CDate("Sept 2008"), , , xlWhole).Column
捕获未找到
Sub test()
Dim y As Date, x As Variant, c As Long
y = CDate("Sep 2008")
Set x = Range("1:1").Find(y, , , xlWhole)
If Not x Is Nothing Then
c = x.Column '<~~found
Else
Exit Sub 'not found
End If
End Sub
答案 2 :(得分:2)
底线:
使用WorksheetFunction.Match(CDbl(date), range, 0)
或者,使用Date
单元格Value2
属性(也将是Double
)代替搜索键Value
。
CLng
会丢弃date
的时间部分。
Currency
数据类型存在同样的问题,但您无法使用CDbl
(请参阅下面的选项)。
Range.Value2 Property (Excel)文章表明Date
和Currency
类型是&#34;特殊&#34;因为他们有一个内部代表和#34;这与显示的价值形成鲜明对比。事实上:
显然,出于性能原因,Match
会比较这些内部值。因此,我们必须确保它们而不是可读的表示形式完全匹配。
由于Date
内部已经是浮点数,CDbl(date)
实际上并未实际更改数据。
对于Currency
类型,CDbl
确实会更改数据,因此无法解决问题。所以要么
Round
)如果要比较的值来自其他地方和/或您只需要等于2个小数位数答案 3 :(得分:1)
这种方式可以使用这种方法:
Nbr,L, C
为整数
Datedeb
作为日期
nbr = WorksheetFunction.Match(CLng(CDate(Datedeb)), Range(Cells(L, C), Cells(L + 100, C)), 0)
答案 4 :(得分:0)
我想我可以放心地假设F1中的值是一个日期。你的代码“Sep 2008”是一个字符串。只要数据类型不一致,您就永远无法获得成功的匹配。 如果您要查找日期,请确保第一个参数是日期。
Dim dSearchSDate As Date
dSearchSDate = "01/Sept/2008"
x = Application.Match(dSearchSDate, Range("F1:F1"), 0)
这是另一种可行的方法。
Sub temp()
Dim x
Dim dSearchSDate As Date
dSearchSDate = "01/Sept/2008"
If ThisWorkbook.Worksheets(1).Range("F1:F1").Value = dSearchSDate Then
Debug.Print "Found it!"
Else
Debug.Print "Doh!!"
End If
End Sub
答案 5 :(得分:0)
我知道这篇文章很老,但我遇到了同样的问题,并找到了答案。
要使其正常工作,首先需要让VBA看到与Excel电子表格中显示的数据格式相同的数据格式:
YourVar =格式(“YourDate”,“mmm-yyyy”) YourResult = Application.match(Clng(Cdate(YourVar)),YourRange,0)
此致
吉勒