IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Filtre Elaboré : Sélection >= sur 1 date ne fonctionne pas [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut Filtre Elaboré : Sélection >= sur 1 date ne fonctionne pas
    Bonjour,

    j'ai un fichier importé du Web contenant des champs dates formattés comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                        TheCell.Offset(iOffsetL).NumberFormat = "mm/dd/yyyy"
    Dans un autre feuille j'ai un cellule initialisée par Access avec la date limite pour le traitement.
    Le champ date est exporté depuis Access comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        'Date limite pour filtrage
        .Sheets(2).Range("A3") = tabls(4)
    J'ai besoin de faire un filtré élaboré sur un sélection >= à ma date.

    Comment puis-je faire cela.
    je n'obtiens aucun résultat.

    Quand je laisse le champ limite de date comme sélection, j'obtiens bien les record pour cette valeur.

    Donc ceci marche (mais ne correspond pas à ma demande
    LevelTestAssignation_ExpireAt
    2011-03-31
    ceci ne marche pas mais est la formalisation de ce que je cherche.
    LevelTestAssignation_ExpireAt
    >=2011-03-31
    le code que j'ai utilisé pour tester est tout simple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ub test()
        Sheets(1).Range("A1:BS925").AdvancedFilter _
            Action:=xlFilterCopy, CriteriaRange:=Sheets(2).Range("A3:A4") _
            , CopyToRange:=Range("A1"), Unique:=False
    End Sub
    Comment combiner la date et >= ?

  2. #2
    Membre habitué
    Inscrit en
    Janvier 2011
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 63

    Informations forums :
    Inscription : Janvier 2011
    Messages : 106
    Points : 153
    Points
    153
    Par défaut
    Bonjour,

    les deux "formalismes" 2011-03-31 ou >=2011-03-31 fonctionnent, chez moi.
    Question, dès lors: les données dans ton tableau sont-elles bien reconnues comme des dates?? Si tu sélectionnes les dates et que tu remplaces le format actuel par une autre format, toutes les dates sont-elles "impactées"?

  3. #3
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonjour,

    je n'ai malheureusement pas réussi à faire fonctionner ta solution . je n'aipas pu trouver le moyen de mettre cette solution en oeuvre, et vu les contraintes de temps qui m'étaient imposées, je m'était rabattu sur la solution suivante :
    a° recherche de la colonne en question (nom de la zone) via la méthode find sur la ligne 1 de la feuille complète (draft)
    b° Scanne de la feuille draft de 1 a end(xlup) avec copy des lignes répondant au critère de la feuille draft vers la feuille data
    c° Import des données dans Access depuis la feuille data.

    merci à U. milité pour sa réponse.

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Bonjour,
    Étonné que tu laisse tomber aussi facilement (j'exagère ) et recourir aux boucles.
    Personnellement, je n'ai pas compris la disposition de tes données et le filtrage que tu souhaite.
    Une question, un filtre automatique ne ferait pas l'affaire?

  5. #5
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonjour Mercatog,

    tuas raison sur toute la ligne, mais , honte sur moi, comme je n'ai jamais codé le traitement de données filtrées (eh non ) et que je n'avais vraiment pas le temps, j'ai fait comme je connaissais.

    Le but est le suivant

    Tout se passe depuis Access.

    Je doit récupérer les scores d'étudiants sur un site de testing de compétence et les insérer dans ma DB Access.
    4 problèmes :
    1) Le site de compétence comprend des infos périmées (ex test d'années précédentes)
    2) le site de compétence travaille à l'email comme clé et donc si plusieurs étudiants dans la même famille, écrasement des résultats et ... rien à en tirer.
    3) On n'est jamais certains qu'il y ai des info à récupérer pour chaque étudiant
    4) Quand je vais importer juste après les données dans Access, je ne veux que la sélection des enregistrement qui collent avec le critère de date.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, From_Table, document, True, Import_data_Sheet & "!"
    Qwazerty m'a constitué un code génial pour lire le site Web et extraire les info sous excel. .

    Cet extract reprend aussi les données périmées car dans l'SQL de lecture du site, la date de sélection n'est pas prévnue.

    Donc, je me suis mis à faire la sélection comme suit :

    1) Je passe à mon code d'import sous excel entre autres parms, la date de sélection, et le nom de la zone qui le contient.

    2) Je copie les données rapatriées dans une feuille Draft vers la feuille finale si le critère de date est respecté (>= date limite)

    Voici la partie du code qui fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
         'Copy Titres
          Sheet_Found.Rows(1).Copy _
            Destination:=Sheet_final.Rows(1)
     
     
     
        'Recherche de la colonne de la zone de date de sélection
        With Sheet_Found.Range("A1:" & Cells(1, Sheet_Found.Columns.Count).End(xlToLeft).Address)
            Set c = .Find(What:=Ws_Tool.Range("A4").Value, LookIn:=xlValues)
            If Not c Is Nothing Then
                Ws_Tool.Range("A10") = c.Address
                Sel_column = c.Column
     
                'Copy Reportings with date >= date Limite vers feuille final results
     
                IFinal = 2
     
                'Copy details
                For ILine = 2 To iOffsetL - 1
                    If Sheet_Found.Cells(ILine, Sel_column) >= Ws_Tool.Range("A3") Then
                      Sheet_Found.Rows(ILine).Copy _
                        Destination:=Sheet_final.Rows(IFinal)
                      IFinal = IFinal + 1
                    End If
                Next ILine
              Else
                Ws_Tool.Range("A10") = "Not found " & Ws_Tool.Range("A4").Value & " " & Cells(1, Sheet_Found.Columns.Count).End(xlToLeft).Address
            End If
        End With
    Ce code est dans un Userform dont j'ai besoin pour me logger sur le site qui est sécurisé.

    la feuille "draft" est Sheet_Found
    la feuille "finale" est Sheet_Final
    la feuille avec la date limite est "A3" et la zone de sélection de la limite en "A4" est Ws_tool

  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    à l'aide d'un filtre automatique sur un fichier test (peut être non conforme au tien)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Sub test()
    Dim LastLig As Long
    Dim LastCol As Integer, Sel_column As Integer
    Dim Plage As Range, c As Range
    'Debut test: ici pour mon test
    Dim Sheet_Final As Worksheet, Sheet_Found As Worksheet, Ws_Tool As Worksheet
     
    Set Sheet_Final = Worksheets("final")
    Set Sheet_Found = Worksheets("found")
    Set Ws_Tool = Worksheets("tools")
    'Ici fin de mon test: tu as déjà tes variables
     
    Application.ScreenUpdating = False
    Sheet_Final.UsedRange.Clear
    With Sheet_Found
        'Recherche de la colonne de la zone de date de sélection
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row    'Dernière ligne remplie de colonne A (par exemple)
        Set Plage = .Range("A1:" & .Cells(1, LastCol).Address)
        Set c = Plage.Find(Ws_Tool.Range("A4").Value, LookIn:=xlValues, lookat:=xlWhole)
        If Not c Is Nothing Then
            Ws_Tool.Range("A10") = c.Address
            Sel_column = c.Column
            .AutoFilterMode = False
            Set Plage = .Range("A1:" & .Cells(LastLig, LastCol).Address)
            Plage.AutoFilter field:=Sel_column, Criteria1:=">=" & CLng(Ws_Tool.Range("A3").Value)
            Plage.SpecialCells(xlCellTypeVisible).Rows.Copy Sheet_Final.Range("A1")
            .AutoFilterMode = False
            Set Plage = Nothing
            Set c = Nothing
        Else
            Ws_Tool.Range("A10") = "Not found"
        End If
    End With
    End Sub

  7. #7
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Mercatog,

    ca marche nickel.

    Je prend bonne note de la technique.

    merci encore.

  8. #8
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonjour,

    il me reste un problème sur le filtrage.

    Sur mon excel UK, pas de soucis, sur une version française, je rencontre le problème suivant :

    1) Les données sont rapatriées de IE et les dates formattées comme suit /
    Merci à QWAZERTY pour ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                    'On regarde si la valeur doit etre mise en forme (cas des dates)
                    If Left(StrValue, 9) = "\\\/Date(" Then
                        dSeconde = CLng(Mid(StrValue, 10, 10)) '1270018722 000 On garde que les secondes
                        StrValue = Round(DateAdd("s", dSeconde, DateSerial(1970, 1, 1)), 0)
                        'On en profite pour changer le format de la cellule
                        TheCell.Offset(iOffsetL).NumberFormat = "m/d/yyyy"
                    End If
    2) La clé pour la limite de filtrage est récupéree depuis un paramètre passé depuis Access comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With Ws_Tool
        'Date limite pour filtrage
        .Range("A3") = tabls(4)
        .Range("A3").NumberFormat = "m/d/yyyy"
    End With
    3) Le filtrage est effectué par ce code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
        With Sheet_Found
            'Recherche de la colonne de la zone de date de sélection
            LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
            LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row    'Dernière ligne remplie de colonne A (par exemple)
            Set Plage = .Range("A1:" & .Cells(1, LastCol).Address)
            Set c = Plage.Find(Ws_Tool.Range("A4").Value, LookIn:=xlValues, lookat:=xlWhole)
            If Not c Is Nothing Then
                Ws_Tool.Range("A10") = c.Address
                Sel_column = c.Column
                .AutoFilterMode = False
                Set Plage = .Range("A1:" & .Cells(LastLig, LastCol).Address)
                Plage.AutoFilter field:=Sel_column, Criteria1:=">=" & CLng(Ws_Tool.Range("A3").Value)
                Plage.SpecialCells(xlCellTypeVisible).Rows.Copy Sheet_final.Range("A1")
                .AutoFilterMode = False
                Set Plage = Nothing
                Set c = Nothing
    4) Sur Excel Anglais, les dates apparaissent en format YYYY-MM-DD et la sélection est de 115 lignes.
    5) Sur Excel Français, les dates apparaissent en format JJ-MM-AAAA et la sélection est de 75 lignes seulement.
    De plus quand j'affiche les résultats faits sur 1 excel français sur mon excel Anglais, certaines dates ne sont pas reconnues comme telles et apparaissent comme string, cadré à gauche dans la cellule (car les 2 premiers chiffres sont > 12).

    Exemples :
    User_Time
    14/04/2010
    18/04/2010
    18/04/2010
    18/04/2010
    2010-11-04
    2010-09-04
    13/04/2010
    14/04/2010
    15/04/2010
    28/04/2010
    2010-10-04
    2010-04-05
    15/04/2010
    24/05/2010
    24/05/2010
    2010-10-04
    Que faire, changer le format de mes dates et de ma clé de sélection . mais comment ?

    Ou bien abandonner le format date et convertir tout en String Format YYYYMMDD à la fois sur les data et sur le paramètre. ? je suis certain que cela marche, mais c'est idiot quelquepart.

  9. #9
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Je ne sais pas et sans garantie, mais si tu essaies ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TheCell.Offset(iOffsetL) = cdate(StrValue)

  10. #10
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Merci Mercatog,

    J'essaie cela et je reviens avec le résultat.

    ----------Edit------------
    Voilà,
    pas moyen de faire fonctionner ce code avec Excel FR alors qu'avec la version UK pas de problème.
    J'ai pèté ma case car ras le bol de me prendre la tête la dessus.

    Je l'ai fait à la hussarde et ai converti la date en valeur numérique via :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StrValue = Year(CDate(StrValue)) * 10000 + Month(CDate(StrValue)) * 100 + Day(CDate(StrValue))
    Et là... problème

    Grrrrrrr la dates et les versions linguistiques différentes. grrrrrrrr.

    Merci à tous pour votre aide encore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD18] Requête SQL sélection condition sur 2 Dates
    Par zouzoukha dans le forum WinDev
    Réponses: 2
    Dernier message: 25/07/2014, 11h32
  2. [XL-2003] Filtre Elaboré : multiple plages sur 1 zone + 1 valeur sur une autre
    Par Godzestla dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/09/2010, 11h48
  3. Req SQL sur champ texte = date ne fonctionne pas acd "/"
    Par chapeau_melon dans le forum WinDev
    Réponses: 2
    Dernier message: 07/03/2008, 09h24
  4. Réponses: 9
    Dernier message: 18/02/2008, 11h00
  5. Mon test sur la date ne marche pas
    Par dachir dans le forum Access
    Réponses: 7
    Dernier message: 12/08/2006, 10h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo