Excel VBA で match() を機能させるのに問題があります。コードは次のとおりです。
x = Application.Match("Sep 2008", Range("F1:F1"), 0)
セル F1 の値は 2008 年 9 月 1 日です。
2008 年 9 月を 2008 年 9 月 1 日に変更しても、値は返されません。
それを修正する方法はありますか?
その理由Even if I changed Sep 2008 to 9/1/2008, it still doesn't return any value.
Excelに日付がある場合、Excelはその日付を自動的に数値に変換するためです。本当に検索したいのは次のとおりです。
39692
9/1/2008
この数値は、1900 年 1 月 1 日のExcel の既定値との間の日数です。
Excel のすべての日付は、このような値で保存されます。したがって、これを処理する最も簡単な方法は、日付として表示されるものを、 を使用して Excel が日付として表示するものに変換することですCDate()
。
これだけでは、vba がプロパティを取得できないという役に立たないエラーが発生します。
これは、Lookup_value が値 (数値、テキスト、または論理値) であるか、数値、テキスト、または論理値へのセル参照である可能性があるためです。日付ではないので、単純に現在の日付の値を数値に変換して、次を使用してリスト内の一致する数値を検索します。CLng()
これを試してみると、検索の代替手段を使用するよりもはるかに高速になります。
x = WorksheetFunction.Match(CLng(CDate("Sep 2008")), Range("F1:F1"), 0)
これにより、期待される結果が得られるはずです
一致が見つからない場合に処理するには、次のサブを試してください。
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
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
この投稿が古いことは知っていますが、同じ問題があり、答えが見つかりました。
これを機能させるには、まず、Excel スプレッドシートに表示されるのと同じデータ形式を VBA に表示させる必要があります。
YourVar = Format("YourDate","mmm-yyyy") YourResult = Application.match(Clng(Cdate(YourVar)), YourRange, 0)
よろしく
ジル