ExcelのVBAでオートフィルターを使用していますが、日付としてフォーマットされた列ではなく、通常のフィルターで機能します。
手動でフィルタリングできます。コードを実行した場合、フィルターは何もフィルターされず、フィルターをチェックして[ok]をクリックするだけです(フィルター基準に変更は適用されません)。正しくフィルターされます。
これが私のコードです:
ws.ListObjects(SheetName).Range.AutoFilter Field:=3, Criteria1 _
:=">" & CDate([datecell]), Operator:=xlAnd, Criteria2:= _
"<=" & CDate(WorksheetFunction.EoMonth([datecell], 3))
よくある問題のようですが、解決策が見つかりません。
記録したマクロを実行しても、機能しません。
Excel VBAオートフィルターでは日付が扱いにくい場合があります。フィルター処理する配列をループするだけの方が簡単な場合もあります。
特に「間の日付」を処理する場合は特に、日付の数値を使用できることがわかりました
Criteria1:= ">" & CDbl([datecell])
Criteria2:= "<=" & CDbl(WorksheetFunction.EoMonth([datecell], 3))
上記は「実際の日付」である必要があり、日付のように見える文字列ではないことに注意してください。 「文字列の日付」が1つでもあると、状況が台無しになります。
Autofilter()
は「ユニバーサル」形式で機能しますyyyy-mm-dd
、つまり:
Criteria1:= ">" & Format([MY_DATE],"yyyy-mm-dd")
Criteria2:= "<=" & Format([MY_DATE],"yyyy-mm-dd")
Excelはそれを間違って「理解」できないので、より良いです。 mm/dd/yyyy
またはdd/mm/yyyy
を使用する場合、Excelは02/janを01/febとして収めることができます。
参照: http://www.oaltd.co.uk/ExcelProgRef/Ch22/ProgRefCh22.htm
Excelの使用に関する規則( 国際問題 )
- Excelに渡すために数値と日付を文字列に変換する必要がある場合(オートフィルターの条件や.Formula文字列など)、常にTrim(Str(MyNumber))を使用してデータを明示的にUS形式の文字列に変換します。すべての数値および日付タイプについて、前に示したsNumToUS()関数。 Excelはそれを正しく使用し、ローカルの数値/日付形式に変換します。
編集:
次のように、Application.International
を使用してユニバーサル関数を作成できます。
Sub MySub()
Select Case application.International(xlDateOrder)
Case Is = 0
dtFormat = "mm/dd/yyyy"
Case Is = 1
dtFormat = "dd/mm/yyyy"
Case Is = 2
dtFormat = "yyyy/mm/dd"
Case Else
dtFormat = "Error"
End Select
Debug.Print (dtFormat)
...
Criteria1:= ">" & Format([MY_DATE],dtFormat)
Criteria2:= "<=" & Format([MY_DATE],dtFormat)
...
End Sub
">"&Format([datecell]、 "mm/dd/yyyy")のように、形式をアメリカの形式に変換する必要があります。VBAは別の形式を認識しません。
この構文は私にとってはうまくいきます:
.AutoFilter Field:=2, Operator:=xlFilterValues, Criteria2:=Array(2, Format(Now, "yyyy-mm-dd"))
マクロ登録で取得したヒント
日付で列をフィルタリングするときに、同様の問題が発生しました。システムの日付形式を01/01/2020に変更すると、基準フィールドで日付が2020年1月1日に変換されました。私の解決策は、関数に設定するときに引数をstrに変換することでした。
1つの解決策は、ターゲット列のフォーマットを正しく設定することです。 「カスタム」としてフォーマットされている場合、日付のように見えても機能しません。
VBAに日付に基づいてフィルタリングするように依頼しているため、列の形式も日付である必要があります。
SOこれはかなりきれいに働いた
ActiveSheet.Range("$A$1:$K$35727").AutoFilter Field:=1, Criteria1:= _
">=" & Range("G1"), Operator:=xlAnd, Criteria2:="<=" & Range("H1")
あなたもこれを試すことができます
予想される出力はG1セルの開始日で、終了日はH1セルになります。
「dd-mm-yyyy」を列のフォーマットに一致させるため、ソースデータのフォーマットとして「16-Aug-16」がある場合は、フィルターを「dd-mm-yyyy」として作成します。
Karlos Henrique、Format([datecell]、 "mm/dd/yyyy")を提案していただきありがとうございます。それは私のファイルで動作します。私の以前のコードは:
Range("A1:D" & Trim(Str(LstRec))).AutoFilter Field:=2, _
Criteria1:=">=" & StrtDt, _
Operator:=xlAnd, _
Criteria2:="<=" & EndDt
私の変更されたコードは:
Range("A1:D" & Trim(Str(LstRec))).AutoFilter Field:=2, _
Criteria1:=">=" & Format(StrtDt, "mm/dd/yyyy"), _
Operator:=xlAnd, _
Criteria2:="<=" & Format(EndDt, "mm/dd/yyyy")
ありがとう。