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 :

Tester si valeur d'une cellule est contenue dans une plage


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2015
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de base de données

    Informations forums :
    Inscription : Mars 2015
    Messages : 57
    Points : 26
    Points
    26
    Par défaut Tester si valeur d'une cellule est contenue dans une plage
    Bonjour,


    Je cherche à supprimer toutes les colonnes inutiles d'une base de données qui en contient 100 et dont les entêtes de colonne se trouvent en ("A1:A100").

    Je dois donc supprimer 90 colonnes et ne laisser que les 10 colonnes utiles.

    Pour ce faire, je teste le nom de chaque entête de colonne. Si l'entête de colonne se retrouve dans MaPlage (qui contient les 10 noms de colonne que je veux conserver), alors ne rien faire, sinon supprimer la colonne et tester le nom de la suivante.

    Mais je patauge un peu ...


    Quelqu'un aurait-il un début de solution ?

    Merci d'avance.

    Fabert

  2. #2
    Membre habitué
    Inscrit en
    Décembre 2008
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 115
    Points : 180
    Points
    180
    Par défaut
    Bonjour

    Perso, je testerai la présence du nom de la colonne via un cellule Excel avec le résultat dans une autre cellule ("MonTest")via une formule du genre :
    =SI(ESTNA(EQUIV(MaRecherche;MaPlage;0));FAUX;VRAI)

    Donc :
    Début Sub
    Pour toutes les entêtes de colonnes
    Chargement du nom de colonne cherchée dans une cellule nommée "MaRecherche"
    (Récupération du résultat dans dans la cellule "MonTest")
    Si "MonTest"=FAUX Alors Sélection de la colonne
    Fin Pour
    Effacement de la sélection
    Fin Sub

    Cordialement

  3. #3
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Points : 3 666
    Points
    3 666
    Par défaut
    Bonjour,

    une façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub suppCol()
        Dim dict, lig As Long, col As Long, pl() As Variant
        Set dict = CreateObject("Scripting.Dictionary")
        pl = [maPlage].Value
        For lig = 1 To UBound(pl)
            If pl(lig, 1) <> "" Then dict(pl(lig, 1)) = pl(lig, 1)
         Next lig
        Application.ScreenUpdating = False
        For col = Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1
            If Not dict.exists(Cells(1, col).Value) Then Columns(col).Delete
        Next col
    End Sub
    eric

  4. #4
    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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut heu
    Bonjour

    au premier abord la question semble simple mais c'est un peu ambiguë

    quand tu parle d'entête du parle bien de la 1 ere cellule de colonne ??

    si c'est ca c'est pas bien compliqué


    ta liste est en colonne A de 1 a 100

    ta base de donne c'est le reste si j'ai bien compris

    donc on testera la 1 cellule de chaque colonne
    je n'ai pas tester mais ca doit faire un truc comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test()
    With ActiveSheet
    Application.ScreenUpdating = False
    For I = 2 To .Cells(1, Columns.Count).End(xlToLeft).Column
    If .Range("A1:A100").Find(.Cells(1, I)) Is Nothing Then
    .Columns(I).Delete Shift:=xlToLeft
    End If
    next
    End With
    End Sub

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2015
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de base de données

    Informations forums :
    Inscription : Mars 2015
    Messages : 57
    Points : 26
    Points
    26
    Par défaut
    Un grand merci à chacun pour vos solutions.


    Je pense pouvoir trouver mon bonheur grâce à vos réponses.

    Voilà, j'ai utilisé la solution de Patricktoulon que j'ai légèrement modifiée afin de tester le nom des colonnes et de les supprimer de la droite vers la gauche.

    J'ai tenté de comprendre la solution de Eriiic qui était probablement bonne aussi, mais j'avoue que je n'ai pas tout compris ;-(

    Merci en tout cas à chacun pour votre aide.

    Fabert

    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
    Sub test()
     
        With ActiveSheet
     
            For I = .Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1
     
                If Sheets("Feuil2").Range("A1:C1").Find(.Cells(1, I)) Is Nothing Then
     
                    .Columns(I).Delete Shift:=xlToLeft
     
                End If
     
            Next
     
        End With
     
    End Sub

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Points : 3 666
    Points
    3 666
    Par défaut
    En fait dans un premier temps je met en mémoire les titres à supprimer (dictionary) puis je supprime.
    eric

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2015
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de base de données

    Informations forums :
    Inscription : Mars 2015
    Messages : 57
    Points : 26
    Points
    26
    Par défaut
    OK. Merci Eric.

    Je vais étudier de façon plus approfondie ta solution.

    C'est toujours iintéressant d'apprendre d'autres techniques.

    Bonne journée.

    Fabert

  8. #8
    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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Re
    Pour une fois que ca n'est pas moi qui emboucane avec mes dicos

  9. #9
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 141
    Points : 9 979
    Points
    9 979
    Billets dans le blog
    5
    Par défaut
    Bonjour à tous,

    Patrick, je me suis dis la même chose hier soir quand j'ai lu cette discussion
    " mais purée, Patrick va être jaloux, on a utilisé ses Dicos à sa place"

    reste à voir ce qui est le plus rapide : mettre tout dans un dico OU appeler un Find

    je pense que le Find sera le plus rapide ... on attend gnain pour ses tests de rapidité (moi je suis fainéant )

  10. #10
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut


    Bonjour,

    dans ce cas je n'aurais opté ni pour l'un ni pour l'autre :

    • une p'tite variable tableau unidimensionnelle contenant les titres des colonnes à conserver

    • une boucle à rebours de la dernière colonne vers la première pour comparer via la fonction EQUIV d'EXCEL (Match en VBA) …


    _____________________________________________________________________________________________________
    Je suis Charlie - Je suis Bardo

  11. #11
    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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    re
    Marc pour obtenir un tablo unidimentionel il te faut boucler sur les cellule references

    tandis qu'un tableau a 1 colonne se fait comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tablo= range("A1:A100").value
     pour tester c'est 
    for i= 1 to ubound(tablo)
     if tablo(i,1) ......
    next
    tandis qu'un tablo uni...
    c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i= 1 to 100
    tablo(i)=cel(i,1)
    next
    et une autre boucle pour tester 
    for e= 1 to uboud(tablo)
    if tablo(e)=....
    next
    hein !!!

  12. #12
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut




    Ah non, non, non ‼
    Une boucle est inutile pour comparer la variable tableau avec la fonction EQUIV d'Excel, penser Excel avant VBA …
    La boucle à rebours parcourt les titres de chaque colonne, EQUIV compare sans boucle un titre avec la variable tableau.

    J'ai la flemme de créer un classeur, si Fabert est intéressé, joindre alors un classeur exemple sans macro en .xlsx …


    _____________________________________________________________________________________________________
    Si déboguer est l’art de corriger les bogues, alors programmer est l’art d’en faire !

  13. #13
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Points : 3 666
    Points
    3 666
    Par défaut
    Bonjour à tous,

    reste à voir ce qui est le plus rapide : mettre tout dans un dico OU appeler un Find
    Heuuu, pour 90 colonnes à supprimer peu importe les µsecondes ;-)
    J'avoue, le dico est sans doute superflu, mais bon, les réflexes... :-)
    eric

  14. #14
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut




    Je conserve à l'esprit la possibilité d'utiliser un objet Dictionary mais j'en suis un peu revenu …

    Toujours utile pour de gros volumes à traiter avec des concaténations ou des cumuls mais inexistant sur Mac,
    sachant que la fonction EQUIV d'Excel combinée à une variable tableau peut remplacer la méthode Exists de Dictionary

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

Discussions similaires

  1. [XL-2007] Sélectionner une feuille dont le nom est contenu dans une cellule
    Par Nonno 94 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/06/2014, 21h47
  2. Réponses: 4
    Dernier message: 27/08/2013, 20h21
  3. Réponses: 1
    Dernier message: 26/12/2010, 22h20
  4. Réponses: 5
    Dernier message: 20/08/2010, 11h01
  5. [VBA-E] Savoir si une cellule est contenue dans une plage
    Par psych0o0 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/05/2006, 15h12

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