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 :

Résultat avec un critère dans un array, est-ce possible ?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut Résultat avec un critère dans un array, est-ce possible ?
    Bonjour a vous,


    J'ai un code qui est utilisé, il fonctionne a merveille mais il est trop lent, vraiment beaucoup. Comme ils s'agit d'information transposé dans un autre endroit j'ai essayé de copie des row ou des range. J'ai fait quelque tentative infructueuse et en fouillant que je devrais utilisé les array. J'ai vu un video sur le web de wiseowl tutoriel et aussi lu celui de silkyroad. Étant donné que je suis vraiment novice en terme de concept de Array, je vous solicite pour votre aide. Tous les exemple que j'ai vu ne correspondent pas vraiment a ma situation et je ne comprends pas toute a fais a 100% le concept et l'utilisation de celui-ci. Je me retrouve donc avec une piste de solution sans la comprendre. Pour la dimension je ne sais pas si c'Est une seul et unique ou 2. Comme vous voyez je part de loins

    TOus les exemple que j'ai vu prenait un tableau effectuais des tri et le copiais entièrement dans une nouvelle emplacement. Je n'ai malheureusement pas vu de cas auquel on appliquais un critère pour le resultats. Donc est ce possible ou avez vous une idée autre afin d'amélioré le code
    'on copie les données dans la feuille correspondantes
    qui est le boulet de ma sub ???




    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    Sub genere_onglets_etablissement()
     
    '    On Error GoTo errorhandler:
     
        Dim x As Integer
        Dim LettreVoulue As String
        LettreVoulue = TrouveLettreColonne([acronyme_etab])
        Dim nom_etablissement As Variant
        Dim entete As Range
        Dim start As Single
        Dim finish As Single
     
        start = Timer
     
        Application.ScreenUpdating = False
     
    'nettoie le nom des etablissements provenant du LAC afin d'éviter d'avoir 2 onglets
     
        Range(LettreVoulue & 2, LettreVoulue & LastLignUsedInSheet("R_MoulinetteAValider")).Select
        nettoyerseul
     
    'détruire onglet si ré-exécution de la macro
     
        detruire_onglet_etablissement
     
    'création des feuilles selon le nom des etablissement
     
        For Each nom_etablissement In Sheets("R_MoulinetteAValider").Range(LettreVoulue & 2, LettreVoulue & LastLignUsedInColumn(LettreVoulue))
     
        x = x + 1
     
            If Cells(x + 1, [valider_etablissement].Column) = "x" Or Cells(x + 1, [valider_etablissement].Column) = "X" Then
     
                    If sheetExists(nom_etablissement.value) = True Then
     
                    Else
     
                        Sheets.Add.Name = nom_etablissement
                        Sheets("R_MoulinetteAValider").[ID_titre].Copy Sheets(nom_etablissement.value).Range("a1")
                        Sheets("R_MoulinetteAValider").[seq_titre].Copy Sheets(nom_etablissement.value).Range("b1")
                        Sheets("R_MoulinetteAValider").[pair_impair_titre].Copy Sheets(nom_etablissement.value).Range("c1")
                        Sheets("R_MoulinetteAValider").[etab_titre].Copy Sheets(nom_etablissement.value).Range("d1")
                        Sheets("R_MoulinetteAValider").[acronyme_etab_titre].Copy Sheets(nom_etablissement.value).Range("e1")
                        Sheets("R_MoulinetteAValider").[item_etab_moulinette_titre].Copy Sheets(nom_etablissement.value).Range("f1")
                        Sheets("R_MoulinetteAValider").[item_etab_titre].Copy Sheets(nom_etablissement.value).Range("g1")
                        Sheets("R_MoulinetteAValider").[descr_etab_titre].Copy Sheets(nom_etablissement.value).Range("h1")
                        Sheets("R_MoulinetteAValider").[couleur_etab_titre].Copy Sheets(nom_etablissement.value).Range("i1")
                        Sheets("R_MoulinetteAValider").[four_etab_titre].Copy Sheets(nom_etablissement.value).Range("j1")
                        Sheets("R_MoulinetteAValider").[fournisseur_titre].Copy Sheets(nom_etablissement.value).Range("k1")
                        Sheets("R_MoulinetteAValider").[marque_etab_titre].Copy Sheets(nom_etablissement.value).Range("l1")
                        Sheets("R_MoulinetteAValider").[cat_etab_titre].Copy Sheets(nom_etablissement.value).Range("m1")
                        Sheets("R_MoulinetteAValider").[format_contrat_titre].Copy Sheets(nom_etablissement.value).Range("n1")
                        Sheets("R_MoulinetteAValider").[qte_an_titre].Copy Sheets(nom_etablissement.value).Range("o1")
                        Sheets("R_MoulinetteAValider").[prix_contrat_titre].Copy Sheets(nom_etablissement.value).Range("p1")
                        Sheets("R_MoulinetteAValider").[valider_etablissement_titre].Copy Sheets(nom_etablissement.value).Range("q1")
                        Sheets("R_MoulinetteAValider").[commentaire_etablissement_titre].Copy Sheets(nom_etablissement.value).Range("r1")
                        Sheets("R_MoulinetteAValider").[commentaire_etablissement_titre].Copy Sheets(nom_etablissement.value).Range("s1")
     
                         Range("s1").value = "Reponse de l'etablissement"
                         Columns("a:C").ColumnWidth = 6.11
                         Columns("D").ColumnWidth = 8.33
                         Columns("E").ColumnWidth = 15.78
                         Columns("F").ColumnWidth = 11.89
                         Columns("G").ColumnWidth = 15.78
                         Columns("H").ColumnWidth = 40
                         Columns("I:P").ColumnWidth = 15.78
                         Columns("Q").ColumnWidth = 11.89
                         Columns("R:U").ColumnWidth = 40
     
                         Range("a2").Activate
     
                    End If
     
     'on copie les données dans la feuille correspondantes
     
                        Sheets("R_MoulinetteAValider").Cells(x + 1, [ID].Column).Copy Sheets(nom_etablissement.value).Cells(x + 1, 1)
                        Sheets("R_MoulinetteAValider").Cells(x + 1, [seq].Column).Copy Sheets(nom_etablissement.value).Cells(x + 1, 2)
                        Sheets("R_MoulinetteAValider").Cells(x + 1, [pair_impair].Column).Copy Sheets(nom_etablissement.value).Cells(x + 1, 3)
                        Sheets("R_MoulinetteAValider").Cells(x + 1, [etab].Column).Copy Sheets(nom_etablissement.value).Cells(x + 1, 4)
                        Sheets("R_MoulinetteAValider").Cells(x + 1, [acronyme_etab].Column).Copy Sheets(nom_etablissement.value).Cells(x + 1, 5)
                        Sheets("R_MoulinetteAValider").Cells(x + 1, [item_etab_moulinette].Column).Copy Sheets(nom_etablissement.value).Cells(x + 1, 6)
                        Sheets("R_MoulinetteAValider").Cells(x + 1, [item_etab].Column).Copy Sheets(nom_etablissement.value).Cells(x + 1, 7)
                        Sheets("R_MoulinetteAValider").Cells(x + 1, [descr_etab].Column).Copy Sheets(nom_etablissement.value).Cells(x + 1, 8)
                        Sheets("R_MoulinetteAValider").Cells(x + 1, [couleur_etab].Column).Copy Sheets(nom_etablissement.value).Cells(x + 1, 9)
                        Sheets("R_MoulinetteAValider").Cells(x + 1, [fourn_etab].Column).Copy Sheets(nom_etablissement.value).Cells(x + 1, 10)
                        Sheets("R_MoulinetteAValider").Cells(x + 1, [Fournisseur].Column).Copy Sheets(nom_etablissement.value).Cells(x + 1, 11)
                        Sheets("R_MoulinetteAValider").Cells(x + 1, [marque_etab].Column).Copy Sheets(nom_etablissement.value).Cells(x + 1, 12)
                        Sheets("R_MoulinetteAValider").Cells(x + 1, [cat_etab].Column).Copy Sheets(nom_etablissement.value).Cells(x + 1, 13)
                        Sheets("R_MoulinetteAValider").Cells(x + 1, [format_contrat].Column).Copy Sheets(nom_etablissement.value).Cells(x + 1, 14)
                        Sheets("R_MoulinetteAValider").Cells(x + 1, [qte_an].Column).Copy Sheets(nom_etablissement.value).Cells(x + 1, 15)
                        Sheets("R_MoulinetteAValider").Cells(x + 1, [prix_contrat].Column).Copy Sheets(nom_etablissement.value).Cells(x + 1, 16)
                        Sheets("R_MoulinetteAValider").Cells(x + 1, [valider_etablissement].Column).Copy Sheets(nom_etablissement.value).Cells(x + 1, 17)
                        Sheets("R_MoulinetteAValider").Cells(x + 1, [commentaire_etablissement].Column).Copy Sheets(nom_etablissement.value).Cells(x + 1, 18)
     
    'on supprime les lignes vides si bien sur les feuilles ont été créés
     
                        Sheets(nom_etablissement.value).Select
                        Range("A2").EntireRow.Insert
                        Sheets(nom_etablissement.value).Range("b1:B" & LastLignUsedInColumn("B")).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
                        With ActiveSheet.Tab
                            .ThemeColor = xlThemeColorAccent3
                            .TintAndShade = 0.399975585192419
                        End With
            End If
     
        Sheets("R_MoulinetteAValider").Select
     
        Next nom_etablissement
     
    finish = Timer
     
    MsgBox "durée du traitement: " & finish - start & " secondes"
     
    Exit Sub
     
    errorhandler:
    MsgBox "Erreur d'exécution, la procédure va se terminer !", vbCritical
     
    End Sub


    merci encore pour votre aide, commentaires, références a d'autre ouvrage et surtout votre temps !!!



    amicalement JP
      0  0

  2. #2
    Membre émérite
    Homme Profil pro
    Responsable des études(en disponibilité)
    Inscrit en
    Juin 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable des études(en disponibilité)
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 367
    Par défaut
    Bonjour

    En passant par une variable tableau.
      1  1

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour
    sans ton classeur avec le peu de precisions que tu donnes sur la structure de ton classeur(de tes données) on va pas aller bien loin

    cependant si tes cellules de base sont contigues tu peux remplacer tes lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Sheets("R_MoulinetteAValider").[ID_titre].Copy Sheets(nom_etablissement.Value).Range("a1")
                        Sheets("R_MoulinetteAValider").[seq_titre].Copy Sheets(nom_etablissement.Value).Range("b1")
                        Sheets("R_MoulinetteAValider").[pair_impair_titre].Copy Sheets(nom_etablissement.Value).Range("c1")
                      'etc...
                      'etc....
                      'etc....
    par ceci :

    Si c'est une ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(nom_etablissement.Value).Range("a1").Resize(1, 19) .value= Sheets("R_MoulinetteAValider").[ID_titre].Resize(1, 19).value
    Si c'est une colonne(donc transposition)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(nom_etablissement.Value).Range("a1").Resize(1, 19).value = Sheets("R_MoulinetteAValider").[ID_titre].Resize(19, 1).value
    a noter que je n'utilise meme pas copy
    et combien meme le Sheets(nom_etablissement.Value) ne serait pas activé ca fonctionnerait quand meme
    on fait donc sauter en un coup tout les activates générés par copy destination

    si tes cellule de base ne sont pas contigues tu pourrais créer un array et l'injecter dans le resize de destination
    la encore pas de activate
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter
      1  1

  4. #4
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Merci beaucoup pour vos conseilles et réponses !!!!


    Intéressant ce que vous dites monsieur Toulon a propos du transfert de donné sans copy, c'Est sur que je vais utilisé le tout dans le future !!!


    J'aurais mis habituellement des imprimes écrans mais le tableau est tellement large que si je le rapetisse, le tout deviens illisible. Donc le texte sera le medium d'explication


    Afin d’être un peu plus explicite sur la structure du fichier voici de l'information sur ma feuille source, elle a des donnés de la colonnes "A" à "AT". Au niveau des rangées, c'Est variable selon le fichier dont la feuille porte toujours le même nom sois R_MoulinetteAValider. Donc je veux copier le contenue des cellules "A" à "P" et "AC" et "AD" dans les feuilles correspondant à la valeur de "K" (qui est la le nom du fournisseur), lors que la valeur X ou x est dans la colonne "AC". En bon français retourne l'information de l'établissement voulus dans la feuille correspondant a son nom si j'ai cocher un X dans une colonne et ce pour toute les lignes.


    Où que je frappe un mur avec une variable tableau c'est que tous les documents de formations (vidéo, texte), c'est que l'On copie 100% des données sources dans une destinations sans en enlever. Donc je ne sais pas si je dois faire un tableau avec tous les données et trouvé une solution afin de pouvoir chercher seulement celles désirée selon les critères voulues. L'autre possibilité serais de seulement de mettre les valeuirs voulus du fichier source (je frappe un mur dans cette situation lorsque je tente de populé la dimension connu avec inconnu, je n'ai pas vu d'exemple) ou l'autre que je vois possiblement moins efficace 2 tableaux sois pour les 2 groupes de données contigue mais cette dernière semble moins efficace (faire 2 array quand on peut en faire 1).


    En resumé, tous les outils de formation que j'ai vu ne précise pas si les données de l'array (tableau) source dois seulement contenir les données voulues ou si elle peut en contenir plus et si c'Est le cas, comment seulement chercher ceux voulues. Mon cas nécessite une recherche ou boucle ou tri, bref là également je suis sur que vous pouvez m'éclairé.




    merci pour votre temps et je vous l'assure c'est vraiment apprécié et j'en suis recommencé !!!
      0  0

  5. #5
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    J'ai réussi a "populé" (je ne connais malheureusement le bon terme en français) le tableau avec les données seulement voulu


    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
     
        Dim tableau() As Variant
     
     
     
     
        tableau = Union(Range(TrouveLettreColonne([ID_titre]) & 2, TrouveLettreColonne([ID_titre]) & LastLignUsedInSheet("R_MoulinetteAValider")), _
             Range(TrouveLettreColonne([seq_titre]) & 2, TrouveLettreColonne([seq_titre]) & LastLignUsedInSheet("R_MoulinetteAValider")), _
             Range(TrouveLettreColonne([pair_impair_titre]) & 2, TrouveLettreColonne([pair_impair_titre]) & LastLignUsedInSheet("R_MoulinetteAValider")), _
             Range(TrouveLettreColonne([etab_titre]) & 2, TrouveLettreColonne([etab_titre]) & LastLignUsedInSheet("R_MoulinetteAValider")), _
             Range(TrouveLettreColonne([acronyme_etab_titre]) & 2, TrouveLettreColonne([acronyme_etab_titre]) & LastLignUsedInSheet("R_MoulinetteAValider")), _
             Range(TrouveLettreColonne([item_etab_moulinette_titre]) & 2, TrouveLettreColonne([item_etab_moulinette_titre]) & LastLignUsedInSheet("R_MoulinetteAValider")), _
             Range(TrouveLettreColonne([item_etab_titre]) & 2, TrouveLettreColonne([item_etab_titre]) & LastLignUsedInSheet("R_MoulinetteAValider")), _
             Range(TrouveLettreColonne([descr_etab_titre]) & 2, TrouveLettreColonne([descr_etab_titre]) & LastLignUsedInSheet("R_MoulinetteAValider")), _
             Range(TrouveLettreColonne([couleur_etab_titre]) & 2, TrouveLettreColonne([couleur_etab_titre]) & LastLignUsedInSheet("R_MoulinetteAValider")), _
             Range(TrouveLettreColonne([four_etab_titre]) & 2, TrouveLettreColonne([four_etab_titre]) & LastLignUsedInSheet("R_MoulinetteAValider")), _
             Range(TrouveLettreColonne([fournisseur_titre]) & 2, TrouveLettreColonne([fournisseur_titre]) & LastLignUsedInSheet("R_MoulinetteAValider")), _
             Range(TrouveLettreColonne([marque_etab_titre]) & 2, TrouveLettreColonne([marque_etab_titre]) & LastLignUsedInSheet("R_MoulinetteAValider")), _
             Range(TrouveLettreColonne([cat_etab_titre]) & 2, TrouveLettreColonne([cat_etab_titre]) & LastLignUsedInSheet("R_MoulinetteAValider")), _
             Range(TrouveLettreColonne([format_contrat_titre]) & 2, TrouveLettreColonne([format_contrat_titre]) & LastLignUsedInSheet("R_MoulinetteAValider")), _
             Range(TrouveLettreColonne([qte_an_titre]) & 2, TrouveLettreColonne([qte_an_titre]) & LastLignUsedInSheet("R_MoulinetteAValider")), _
             Range(TrouveLettreColonne([prix_contrat_titre]) & 2, TrouveLettreColonne([prix_contrat_titre]) & LastLignUsedInSheet("R_MoulinetteAValider")), _
             Range(TrouveLettreColonne([valider_etablissement_titre]) & 2, TrouveLettreColonne([valider_etablissement_titre]) & LastLignUsedInSheet("R_MoulinetteAValider")), _
             Range(TrouveLettreColonne([commentaire_etablissement_titre]) & 2, TrouveLettreColonne([commentaire_etablissement_titre]) & LastLignUsedInSheet("R_MoulinetteAValider")))

    Il me reste seulement a trouvé une façon de cherché sur l'array la cellule contenant le fameux X ... je continue encore et encore de chercher sur le web.
      0  0

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    est que toutes ces cellules sont contigues ou pas ??
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter
      0  1

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Merci Philippe
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------
      1  1

  8. #8
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Relisez svp

    Car en post 22 je propose aussi les filtres avancés…
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)
      1  1

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut AdvancedFilter - Filtre avancé d'excel
    Bonjour,
    Un dessin vaut mieux qu'un long discours

    Manuellement
    Nom : 181001 AdvancedFilter DialogBox.png
Affichages : 269
Taille : 66,0 Ko

    Correspondance VBA
    Nom : 181001 AdvancedFilter DialogBox VBA.png
Affichages : 295
Taille : 55,8 Ko

    Résultat soit manuellement soit en VBA
    Nom : 181002 - AdvancedFilter Résultat final.png
Affichages : 241
Taille : 25,3 Ko

    A lire ABSOLUMENT pour comprendre Les filtres avancés ou élaborés dans Excel

    Désolé l'image ci-dessous ne correspond pas à ce qui se trouve au-dessus mais je n'arrive pas à la supprimer
    Images attachées Images attachées  
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier
      4  0

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Le code de départ pourrait déjà être rationnalisé.


    • Travailler avec un objet Worksheet plutôt que avec Worsksheets("...")...;
    • Ne pas redimensionner les columns dans la boucle mais avoir conçu cela avant;
    • désactiver le calcul automatique;
    • calculer les index de colonne hors de la boucle;
    • Calculer la dernière ligne (LastLignUsedInSheet(...)) hors de la boucle;
    • Travailler avec des tableaux structurés (au moins pour les tableaux dans lesquels on colle);
    • ...



    Bref, penser et concevoir le projet et le classeur avant la première ligne de code, et se servir du VBA pour ce qui relève de la vraie automatisation (en gros, les copier-coller) en ayant dégrossi le travail avant.

    Je sais que cela ne va pas plaire à certains, mais c'est la seule façon profesionnnelle d'envisager ce traitement. Lorsque cela est réalisé, on regarde pour l'optimisation, qui est alors en général beaucoup plus simple à mettre en place


    Au passage, attention avec les Application.Transpose qui foutent les dates en l'air, notamment...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------
      1  0

  11. #11
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Bonjour Pierre,

    Au passage, attention avec les Application.Transpose qui foutent les dates en l'air, notamment...
    Cela tombe bien il n'y en a pas sur les données d'application transpose
    Edit : petite modif
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)
      1  1

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Ryu,

    Essaie de comprendre la substance de mes propos...

    De la réflexion, de la conception, l'utilisation des outils Excel tels que les filtres avancés et, dans 99,99% des cas, pas besoin de split et d'application.transpose et autres bazars avec des index de colonnes en dur dans le code et autres atrocités...

    Revenir aux fondamentaux en comprenant la philosophie de l'outil qu'est Excel et on se passe bien souvent de masturbation intellectuelle et de code hardcodé qui plante à la moindre modif
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------
      2  0

  13. #13
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Merci beaucoup pour vos commentaire


    J'ai pas mal de pain sur la planche !!!


    Si je prends l'expression de Ryu, il faut que je bûche un peux et en plus corde mon bois !!!



    Je vais également essayé l'avenue de monsieur Tulliez qui est très intéressant.


    merci monsieur Fauconnier.


    Comme vous pouvez le constater, je prends du poil de la bête !!! La mise en terre d'y a deux semaines ma aidé a faire mon deuil ...
      0  0

  14. #14
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Bonjour,

    Si je prends l'expression de Ryu, il faut que je bûche un peux et en plus corde mon bois !!!
    Désolé si c'est mal pris, mais j'ai donné pas mal d'éléments afin de pouvoir comprendre le code (cf liens)
    Et c'est une bonne façon d'apprendre ; après je suis toujours là si il y a un blocage / une incompréhension dans le code …
    Comme tu voulais passer par des variables tableaux …
    Et il est toujours bien de décortiquer un code en l'activant via le pas à pas afin de constater ce qui se passe dans les variables locales …

    Et non , il n'y a aucune masturbation intellectuelle et ce code n'est pas hardcodé et il ne plante pas …

    PS : j'ai qd même passé du temps pour comprendre le principe et le fonctionnement de ce que tu voulais .…
    Il peut exister plusieurs solutions pour une problématique, il faut juste choisir celle qui convient le mieux …
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)
      1  1

  15. #15
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Non mon cher Ryu,


    Je prends ca du bon coté, je suis également d'avis qu'il faut m'aidé a comprendre que me donné tout cuit dans le bec !!!


    JE dois également considéré les avenus de monsieur Tulliez,


    merci beaucoup pour ta disponibilité et volonté de m'aider, c'Est plus qu'apprécié ...


    Il reste toujours la barrière d'écriture qui n'identifie pas malheureusement l'intention et les sentiments dans les idées mais de mon côté je viens ici de façon positive et vois les intervention de façon positive.
    Il y a également le non dit qui peut choquer la personne qui demande de l'aide et les gens qui aident ces même personnes ... mais je peut composé avec.
    Également le dialecte Français qui varie d'une région et pays à l'autre. Usine a gaz est la première fois que j'attendais cette expression sur ce forum.


    Je vais donc vous faire un petit coucou lorsque j'aurais testé votre code.

    non je suis loin d'etre frustré mais vraiment heureux d'avoir es gens comme vous me donnant du support



    amicalement JP
      0  0

  16. #16
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Pierre,

    Il a été stipulé que l'on pouvait avoir x ou X
    Que donne ceci :
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)
      1  1

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Col = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 29, 30)
        With Sheets("depart")
            DL = .Cells(.Rows.Count, 1).End(xlUp).Row
            Set Plage = .Range("A2:AD" & DL)
    ...
    ...
    If UCase(VA(i, Col_X)) = "X" Then
    Pas hardcodé? Rien que la condition (hyper simpliste dans le code que tu donnes) c'est du hardcodage

    Alors qu'avec les filtres avancés, il n'y a fonctionnellement besoin d'aucun code vba et si on utilise du vba, c'est juste pour automatiser le filtre avancé...

    Il y a deux cas de figure:
    • Soit c'est une oneshot et pas besoin de VBA, les filtres avancés Excel suffisent;
    • Soit ce n'est pas un oneshot et alors il est question de [I]CONCEPTION.


    Si on a besoin de conception:
    • Dans le classeur d'analyse, on prépare le filtre avance (zone de réception des données, zone de critère formulé, formule de critère);
    • On y importe les données à traiter;
    • On applique le filtre avancé.



    C'est TOUT ce qu'il y a à faire! Ca prend cinq ou six lignes de code.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------
      1  0

  18. #18
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Mais on s'en fout du critère!!!
    Ryu,


    Essaie de comprendre le fonctionnement d'un filtre avancé, b***!

    Le critère, tu le formules. Si tu veux faire une différence de casse, tu utilises la fonction EXACT dans la formule du critère et basta!

    Le VBA n'est pas là pour pallier une méconnaissance d'Excel. Maîtrisez les outils d'Excel et utilisez le VBA uniquement pour l'automatisation des procédures....

    En quelle langue faut-il le dire pour que ça percole enfin?

    Si demain, son critère change ne serait-ce que d'un iota, ou que les colonnes changent, que ce soit dans la source ou dans la cible, avec vos solutions, il devra mettre les mains dans le cambouis alors qu'il ne maîtrise pas votre code, alors qu'avec les filtres avancés, éventuellement en VBA, il ne devra RIEN CHANGER dans son code!
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------
      4  1

  19. #19
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour Pierre,
    Essaie de comprendre le fonctionnement d'un filtre avancé, b***!

    C'est ce que je me tue à écrire depuis le début
    Il y a deux discussions actuellement sur le forum avec le même type de demande et je n'arrête pas de dire de faire des tests manuellement, j'ai référencé le tutoriel sur le sujet qui est bourré d'exemples avec un classeur qui l'accompagne.

    Je trouve que cela devient de plus en plus pénible. Tout avoir dans l'immédiat sans faire d'effort et sans essayer de comprendre.

    Le VBA n'est pas là pour pallier une méconnaissance d'Excel. Maîtrisez les outils d'Excel et utilisez le VBA uniquement pour l'automatisation des procédures....
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier
      3  1

Discussion fermée
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/10/2013, 15h40
  2. Résultat d'une boucle dans un array
    Par endoffile dans le forum Langage
    Réponses: 5
    Dernier message: 08/12/2011, 09h09
  3. [XL-2003] BDMOYENNE avec plusieurs critères dans la même colonne
    Par meliria dans le forum Excel
    Réponses: 6
    Dernier message: 19/05/2010, 22h18
  4. [MySQL] stoker le résultat d'un select dans un array
    Par hraiwen dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 04/08/2009, 14h24
  5. [PHP 5.2] Jolie NOTICE avec un string dans l'array
    Par Jonahboss dans le forum Langage
    Réponses: 4
    Dernier message: 29/07/2009, 11h38

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