web-dev-qa-db-ja.com

列を日付としてフォーマットしたオートフィルター

ExcelのVBAでオートフィルターを使用していますが、日付としてフォーマットされた列ではなく、通常のフィルターで機能します。

手動でフィルタリングできます。コードを実行した場合、フィルターは何もフィルターされず、フィルターをチェックして[ok]をクリックするだけです(フィルター基準に変更は適用されません)。正しくフィルターされます。

これが私のコードです:

ws.ListObjects(SheetName).Range.AutoFilter Field:=3, Criteria1 _
        :=">" & CDate([datecell]), Operator:=xlAnd, Criteria2:= _
        "<=" & CDate(WorksheetFunction.EoMonth([datecell], 3))

よくある問題のようですが、解決策が見つかりません。

記録したマクロを実行しても、機能しません。

11
Spurious

Excel VBAオートフィルターでは日付が扱いにくい場合があります。フィルター処理する配列をループするだけの方が簡単な場合もあります。

特に「間の日付」を処理する場合は特に、日付の数値を使用できることがわかりました

Criteria1:= ">" & CDbl([datecell])
Criteria2:= "<=" & CDbl(WorksheetFunction.EoMonth([datecell], 3))

上記は「実際の日付」である必要があり、日付のように見える文字列ではないことに注意してください。 「文字列の日付」が1つでもあると、状況が台無しになります。

17
Ron Rosenfeld

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の使用に関する規則( 国際問題

  1. 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
10
Makah

">"&Format([datecell]、 "mm/dd/yyyy")のように、形式をアメリカの形式に変換する必要があります。VBAは別の形式を認識しません。

3
Karlos Henrique

この構文は私にとってはうまくいきます:

.AutoFilter Field:=2, Operator:=xlFilterValues, Criteria2:=Array(2, Format(Now, "yyyy-mm-dd"))

マクロ登録で取得したヒント

1
Mago Fabian

日付で列をフィルタリングするときに、同様の問題が発生しました。システムの日付形式を01/01/2020に変更すると、基準フィールドで日付が2020年1月1日に変換されました。私の解決策は、関数に設定するときに引数をstrに変換することでした。

0
Piotr Kotarba

1つの解決策は、ターゲット列のフォーマットを正しく設定することです。 「カスタム」としてフォーマットされている場合、日付のように見えても機能しません。

VBAに日付に基づいてフィルタリングするように依頼しているため、列の形式も日付である必要があります。

0
Andrés Roldán

SOこれはかなりきれいに働いた

ActiveSheet.Range("$A$1:$K$35727").AutoFilter Field:=1, Criteria1:= _
        ">=" & Range("G1"), Operator:=xlAnd, Criteria2:="<=" & Range("H1")

あなたもこれを試すことができます

予想される出力はG1セルの開始日で、終了日はH1セルになります。

0
Sudhanshu Soni

「dd-mm-yyyy」を列のフォーマットに一致させるため、ソースデータのフォーマットとして「16-Aug-16」がある場合は、フィルターを「dd-mm-yyyy」として作成します。

0
Graham P

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")

ありがとう。

0
pmyk