web-dev-qa-db-fra.com

Le filtre automatique Excel VBA ne fonctionne pas avec la colonne Date

J'ai eu un problème avec AutoFilter avec VBA dans Excel.

Cela fonctionne bien pour les filtres classiques, mais filtrer la colonne de date ne fonctionne pas comme prévu . La colonne est formatée en tant que date, je peux la filtrer manuellement et de manière absurde, si je lance mon code, il ne filtre rien mais lorsque je vérifie la filtrer et ensuite seulement cliquer sur ok (aucune modification n’est appliquée aux critères de filtrage), le filtrage commence correctement.

Voici mon code:

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

Quelqu'un a une idée? Cela semble être un problème commun, mais je n’ai pas trouvé de solution.

Merci d'avance.

Edit: Juste pour ajouter, lorsque je l’enregistre en macro et que je lance la macro enregistrée, cela ne fonctionne pas non plus.

10
Spurious

Les dates peuvent être délicates avec Excel VBA AutoFilter. Certains trouvent plus facile de simplement parcourir le tableau à filtrer.

Parfois, j'ai trouvé que l'on pouvait utiliser la valeur numérique de la date, en particulier lorsqu'il s'agissait de "dates entre"

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

Notez que ce qui précède doit être "des dates réelles" et non des chaînes qui ressemblent à des dates. Même une seule "date de chaîne" va tout gâcher.

15
Ron Rosenfeld

Autofilter() fonctionne avec le format 'universel' yyyy-mm-dd, c'est-à-dire:

Criteria1:= ">" & Format([MY_DATE],"yyyy-mm-dd")
Criteria2:= "<=" & Format([MY_DATE],"yyyy-mm-dd")

C'est mieux car Excel ne peut pas «comprendre» le problème. Si vous utilisez mm/dd/yyyy ou dd/mm/yyyy, Excel peut contenir 02/jan et 01/fév.

voir: http://www.oaltd.co.uk/ExcelProgRef/Ch22/ProgRefCh22.htm

Les règles d'utilisation d'Excel ( Problème international )

  1. Lorsque vous devez convertir des nombres et des dates en chaînes pour les transmettre à Excel (comme dans les critères des chaînes de filtre automatique ou .Formula), convertissez toujours explicitement les données en chaîne au format américain, à l'aide de Fonction sNumToUS () indiquée précédemment, pour tous les types de numéro et de date. Excel l'utilisera ensuite correctement et le convertira au format de numéro/date local.

Modifier:

Nous pouvons créer une fonction universelle en utilisant Application.International comme:

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
9
Makah

vous devez convertir le format au format américain, tel que: ">" & Format ([datecell], "mm/jj/aaaa") VBA ne comprend pas un autre format.

2
Karlos Henrique

Cette syntaxe fonctionne pour moi:

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

Astuce obtenue par un enregistrement de macro

1
Mago Fabian

Une solution consiste à configurer correctement le format de la colonne cible. Si sa mise en forme en tant que "personnalisé", même si cela ressemble à une date, cela ne fonctionnera pas.

Vous demandez à VBA de filtrer en fonction d'une date. Par conséquent, le format des colonnes doit également être une date.

0
Andrés Roldán

Faites correspondre votre "jj-mm-aaaa" avec le format de la colonne. Si vous avez "16 août 16" comme format de données source, définissez le filtre comme suit: "jj-mm-aaaa"

0
Graham P

Karlos Henrique, Merci de nous avoir suggéré Format ([datecell], "mm/jj/aaaa") . Il fonctionne dans mon fichier .

Range("A1:D" & Trim(Str(LstRec))).AutoFilter Field:=2, _
  Criteria1:=">=" & StrtDt, _
  Operator:=xlAnd, _
  Criteria2:="<=" & EndDt

Mon code modifié est:

Range("A1:D" & Trim(Str(LstRec))).AutoFilter Field:=2, _
  Criteria1:=">=" & Format(StrtDt, "mm/dd/yyyy"), _
  Operator:=xlAnd, _
  Criteria2:="<=" & Format(EndDt, "mm/dd/yyyy")

Merci.

0
pmyk