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 :

comment faire varier une variable [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 19
    Par défaut comment faire varier une variable
    bonjour,
    je voudrai effectuer un test entre une variable valeur (qui peut prendre n'importe quelle valeur entre la cellule C5 et C407) et ma variable code qui a été demandé précédemment. En fonction de si elles sont égales ou différente je voudrai supprimer l'intégralité de la ligne en gros si oui je conserve que les lignes ou valeur=code ni non je supprime toute les lignes où valeur=code. Or ne n'arrive pas a faire varier ma variable valeur. Pour l'instant j'ai testé ça :
    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
    Sub trie_bom_1()
    Dim Code As String
    Dim Valeur As String
             Code = InputBox("Entrez le code produit à 10 chiffres.", "demande de code", "exemple : 4612091900")
             If Len(Code) = 10 And IsNumeric(Code) Then
                      If MsgBox("Voulez-vous conserver ou supprimer les lignes contenant ce code ?" & Chr(10) & "oui pour conserver" & Chr(10) & "non pour supprimer", vbYesNo, choix) = vbYes Then
                      Range (Cells(5, 3)) < Valeur > Range(Cells(407, 3))
                               If Valeur = Code Then
                               MsgBox ("Seul les lignes contenant le code ont été conservé.")
                               Else
                               Range("valeur").Select
                               Selection.Delete Shift:=xlUp
                               MsgBox ("Seul les lignes contenant le code ont été conservé.")
                               MsgBox ("Seul les lignes contenant le code ont été conservé.")
                                Else
                               'meme chose sauf que j'inverse le then et le else'
                      MsgBox ("Seul les lignes contenant le code ont été suprimmé.")
                      End If
             Else
                     MsgBox ("Opération annulé, le code ne contient pas 10 chiffres ou vous avez appuyé sur annuler. ")
             End If
    End Sub
    merci de votre aide (je tiens à préciser que j'ai un niveau plus que faible en vba donc désolé si j'ai écris de grosses bourdes) dsl j'ai pas réussi a mettre les alinéas comme dans vba pourtant je les ai bien tapé

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    La ligne qui déconne, c'est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range (Cells(5, 3)) < Valeur > Range(Cells(407, 3))
    C'est de la programmation par requête. Or VBA est un langage impératif, il ne fait qu'obéir aux ordres. Tu ne peux pas travailler comme ça(même si parfois ça serait bien pratique)

    un exemple de code pour selectionner plusieurs colonnes, renvoyé par l'éditeur de macros, c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Range("19:19,22:22,23:23,24:24,27:27,28:28").Select
    Evidemment, tu ne peux pas taper en dur les numéros de colonne, tu dois les récupérer en dynamique. Exemple(pourri mais qui devrait marcher) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim ii as Integer, ss as String
    ss = ""
    For ii = 5 to 407
        if Cells(ii, 3) = Valeur Then
            If ss <> "" Then ss = ss & ","
            ss = ss & Cstr(ii)
        End If
    Next ii
    Range(ss).Select
    Et là, normalement, tu as selectionné toutes les lignes contenant ta Valeur. Après, à toi d'en faire ce que tu veux.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 19
    Par défaut
    merci de ta réponse je me doutais bien que c’était cette ligne qui n’était pas bonne. j'ai intégrer ton code mais ca me dit erreur d'exécution 1004 et ca me souligne range(ss).select
    ps tu fais comment pour afficher le code correctement dans les message ?

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    (1) Oups, j'ai été trop vite, il faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ss = ss & CStr(ii) & ":" & CStr(ii)
    au lieu de Tout simplement parceque je générais "6,8,10" au lieu de "6:6,8:8,10:10" qui est la bonne syntaxe. J'ai testé, ça marche.

    (par contre, il y a semble-t-il une limite au nombre de lignes disjointes selectionnables, à vérifier que tu n'en selectionne pas 200 - si tu en as beaucoup, alors il faut selectionner les lignes une à une, et agir dessus une à une).

    (2) Tu utilises la balise code - avec le bouton [#] présent au-dessus de la zone ou tu tapes ton texte. Le texte présent entre CODE et /CODE(avec les [] autour pour que ça marche)

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 19
    Par défaut
    merci beaucoup de ton aide
    le message d'erreur intervient toujours sur la même ligne

    code
    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
    [Sub trie_bom_1()
    Dim Code As String
    Dim Valeur As String
    Dim x As Long
    Dim y As String
        Code = InputBox("Entrez le code produit à 10 chiffres.", "demande de code", "exemple : 4612091900")
        If Len(Code) = 10 And IsNumeric(Code) Then
            If MsgBox("Voulez-vous conserver ou supprimer les lignes contenant ce code ?" & Chr(10) & "oui pour conserver" & Chr(10) & "non pour supprimer", vbYesNo, choix) = vbYes Then
                y = ""
                For x = 5 To 407
                    If Cells(x, 3) = Valeur Then
                        If y <> "" Then y = y & ","
                        y = y & CStr(x) & ":" & CStr(x)
                    End If
                Next x
                Range(y).Select
     
            Else
                y = ""
                For x = 5 To 407
                    If Cells(x, 3) = Valeur Then
                        If y <> "" Then y = y & ","
                        y = y & CStr(x) & ":" & CStr(x)
                    End If
                Next x
                Range(y).Select
                Selection.Delete Shift:=xlUp
                MsgBox ("Seul les lignes contenant le code ont été suprimmé.")
            End If
        Else
            MsgBox ("Opération annulé, le code ne contient pas 10 chiffres ou vous avez appuyé sur annuler. ")
        End If
    End Sub]
    par contre je comprend pas ce que veut dire ":"

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    Tu as beaucoup de lignes correspondant à ta valeur? C'est probablement le problème(parceque sinon, chez moi, ça passe très bien).

    Donc il faut ruser. Par exemple, en remplaçant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For x = 5 To 407
                    If Cells(x, 3) = Valeur Then
                        If y <> "" Then y = y & ","
                        y = y & CStr(x) & ":" & CStr(x)
                    End If
                Next x
                Range(y).Select
                Selection.Delete Shift:=xlUp
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            For x = 407 To 5 Step -1
                If Cells(x, 3) = Valeur Then
                    Rows(CStr(x)).Delete Shift:=xlUp
                End If
            Next x
    Testé, ça marche.

    Comme ça, on se débarrasse complètement des select. Ca permet de gagner en performance et en lisibilité

    Il est important de commencer par la fin, quand on supprime ligne à ligne, pour éviter de louper des effacements. En effet, si les lignes 67 et 68 sont à effacer et que j'efface la 67 d'abord, la 68 va monter en 67...et ne pas être effacée, puisqu'à ce moment, le compteur est à 68. Alors que si on efface la 68 d'abord, le compteur est ensuite en 67...et on peut l'effacer aussi. C'est pourquoi je pars du dernier vers le premier(et je dois aussi mettre step -1, sinon il ne devine pas que je vais en arrière, et ne fait rien du tout).

    A noter que ça, c'est si tu veux effacer les éléments de cette valeur. Pour le cas ou tu veuilles garder les lignes de cette valeur, et supprimer les autres, alors il te faudra remplacer If Cells(x, 3) = Valeur par If Cells(x, 3) <> Valeur.

    Par contre, ça m'amène au 407. C'est une donnée fixe, ou tu as un nombre de lignes variables? Si tu dois traiter toutes les lignes sans savoir combien il y en a, il y a alors la formule magique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For x = Range("C" & Rows.Count).End(xlUp).Row To 5 Step -1
    suivi des autres lignes. Comme ça, tu sais que tu prends toutes les lignes.

    mais si les 407 est pertinent dans ton cas, alors garde-le.

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

Discussions similaires

  1. [Macro de Recherche] Comment faire varier une 4eme variable
    Par Vin_SuFu_R@T dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 15/01/2008, 12h35
  2. [JMeter]Comment faire suivre une variable ?
    Par cobios dans le forum Outils
    Réponses: 2
    Dernier message: 15/06/2007, 14h57
  3. [XSL FO]Comment faire évoluer une variable
    Par Little_flower dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 31/05/2007, 15h03
  4. Réponses: 1
    Dernier message: 20/10/2006, 18h46
  5. Réponses: 15
    Dernier message: 25/04/2006, 17h59

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