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 :

Questions surement bêtes : True, False ? et boucles imbriquées avec vérifications


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Points : 153
    Points
    153
    Par défaut Questions surement bêtes : True, False ? et boucles imbriquées avec vérifications
    Bonjour à tous,

    Voilà j'ai récupéré ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Ligne = 2 'si deja ref existente incrementation a,b,c
        Deja = True 'mise à true de la variable déja
            Do While Cells(Ligne, 4).Value <> ""
                If Cells(Ligne, 4).Value = Cells(derL, 9).Text & (Cells(derL, 10).Text) Then
                    a = InputBox("Renommer la référence car elle existe déja", , Cells(derL, 9).Text & (Cells(derL, 10).Text))
                    Cells(derL, 4) = a
                    Deja = False
                Exit Do
                End If
                Ligne = Ligne + 1
            Loop
            If Deja = True Then Cells(derL, 4) = Cells(derL, 9).Text & (Cells(derL, 10).Text)                'Concaténation du nom du premier auteur suivi de l'année (format00) sans espace
    Je voulais savoir à quoi correspondait la valeur true ou false

    D'autre par je souhaiterai remplacer la input box par des boucles du type:

    Si la variable existe dans la colonne A alors cellule=variable & b
    Si variable & b existe dans la colonne A alors cellule=variable & c
    Si variable & c existe dans la colonne A alors cellule=variable & d
    Si variable & d existe dans la colonne A alors cellule=variable & e
    Si variable & b existe dans la colonne A alors cellule=variable & f
    Sinon cellule=variable

    Merci pour votre aide

    Bonne journée

    Vincent

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    Citation Envoyé par Vincent32 Voir le message

    Je voulais savoir à quoi correspondait la valeur true ou false

    D'autre par je souhaiterai remplacer la input box par des boucles du type:

    Si la variable existe dans la colonne A alors cellule=variable & b
    Si variable & b existe dans la colonne A alors cellule=variable & c
    Si variable & c existe dans la colonne A alors cellule=variable & d
    Si variable & d existe dans la colonne A alors cellule=variable & e
    Si variable & b existe dans la colonne A alors cellule=variable & f
    Sinon cellule=variable
    salut

    1) à la valeur d'une booléenne ! (qui te sert- ici de test de vérification)
    2) En ce qui concerne ton "d'autre part "...
    Peu compréhensible et difficilement "devinable" !
    Que veux-tu dire ? Une boucle sur quoi ? Des InputBox successifs ? autre chose (et quoi ?) ?
    Que seraient tes variables : variable, b, c,d ?
    que veut dire cette "contradiction" ;
    Si variable & b existe dans la colonne A alors cellule=variable & c
    ......
    Si variable & b existe dans la colonne A alors cellule=variable & f
    Que sont les variables figurant dans la partie droite (b,c,d,e,f) ?
    Ta question est et reste un véritable mystère que ma boule de cristal ne me permet pas d'élucider !

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Points : 153
    Points
    153
    Par défaut
    Désolé je n'ai pas été très clair:

    j'ai constitué un userform dans lequel on entre les noms des auteurs et l'année de publication. J'extrait le premier nom de la liste des auteurs, j'extrait également les 2 derniers chiffres de l'année. Je concatène le tout de la manière suivante auteur98 (ceci constitue ma variable initiale) je compare cette variable initiale à une liste. Si cette variable existe, alors je lui demande
    d'écrire auteur98b mais si auteur98b existe alors je veux écrire auteur98c et ainsi de suite jusqu'à f. Est ce que le code suivant serait correcte


    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
     'modifier pour incrémenter automatiquement de b à f
            Ligne1 = 2 'si deja ref existente incrementation b,c,d,e,f
            a = Cells(derL1, 8).Text & (Cells(derL1, 7).Text)
            Deja = True 'mise à true de la variable déja
                Do While Cells(Ligne1, 9).Value <> ""
                    If Cells(Ligne, 9).Value = Cells(derL1, 8).Text & (Cells(derL1, 7).Text) Then
                        b = a & "b"
                        Cells(derL1, 9) = b
                        Deja = False
                            Do While Cells(Ligne1, 9).Value <> ""
                                If Cells(Ligne, 9).Value = Cells(derL1, 8).Text & (Cells(derL1, 7).Text) & "b" Then
                                    c = a & "c"
                                    Cells(derL1, 9) = c
                                    Deja = False
                                        Do While Cells(Ligne1, 9).Value <> ""
                                            If Cells(Ligne, 9).Value = Cells(derL1, 8).Text & (Cells(derL1, 7).Text) & "c" Then
                                                c = a & "c"
                                                Cells(derL1, 9) = c
                                                Deja = False
                                            Exit Do
                                            Do While Cells(Ligne1, 9).Value <> ""
                                                If Cells(Ligne, 9).Value = Cells(derL1, 8).Text & (Cells(derL1, 7).Text) & "d" Then
                                                    d = a & "d"
                                                    Cells(derL1, 9) = b
                                                    Deja = False
                                                Exit Do
                                                Do While Cells(Ligne1, 9).Value <> ""
                                                    If Cells(Ligne, 9).Value = Cells(derL1, 8).Text & (Cells(derL1, 7).Text) & "e" Then
                                                        e = a & "e"
                                                        Cells(derL1, 9) = e
                                                        Deja = False
                                                    Exit Do
                                                    Do While Cells(Ligne1, 9).Value <> ""
                                                        If Cells(Ligne, 9).Value = Cells(derL1, 8).Text & (Cells(derL1, 7).Text) & "f" Then
                                                            f = a & "f"
                                                            Cells(derL1, 9) = f
                                                            Deja = False
                                                        Exit Do
                                                        End If
                                                        Ligne1 = Ligne1 + 1
                                                    Loop
                                                    If Deja = True Then Cells(derL1, 9) = Cells(derL1, 8).Text & (Cells(derL1, 7).Text) & "e"
                                                    End If
                                                    Ligne1 = Ligne1 + 1
                                                Loop
                                                If Deja = True Then Cells(derL1, 9) = Cells(derL1, 8).Text & (Cells(derL1, 7).Text) & "d"
                                                End If
                                                Ligne1 = Ligne1 + 1
                                            Loop
                                            If Deja = True Then Cells(derL1, 9) = Cells(derL1, 8).Text & (Cells(derL1, 7).Text) & "c"
                                            End If
                                            Ligne1 = Ligne1 + 1
                                        Loop
                                        If Deja = True Then Cells(derL1, 9) = Cells(derL1, 8).Text & (Cells(derL1, 7).Text) & "b"
                                Exit Do
                                End If
                                Ligne1 = Ligne1 + 1
                            Loop
                            If Deja = True Then Cells(derL1, 9) = Cells(derL1, 8).Text & (Cells(derL1, 7).Text)
                    Exit Do
                    End If
                    Ligne1 = Ligne1 + 1
                Loop
                If Deja = True Then Cells(derL1, 9) = Cells(derL1, 8).Text & (Cells(derL1, 7).Text)                'Concaténation du nom du premier auteur suivi de l'année (format00) sans espace

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    re

    je vais à ce niveau te donner deux éléments d'étude qui te permettront de réaliser ton projet dans l'esprit VBA :

    1)
    un petit test (fais-le)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim mondepart As Integer, i As Integer
      mondepart = Asc("a")
      For i = 0 To 10
        MsgBox Chr(mondepart + i)
      Next
    2) le test 1) ayant été fait, analysé et compris ;
    tu vas ouvrir ton aide VBA sur la méthode Find, appliquée à un Range

    3) tu reviens ici avec ton code d'essai de mise en application des points 1) et 2) .

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Points : 153
    Points
    153
    Par défaut
    Je comprends la signification du 1° (et ceci même si le code me met une erreur "erreur de compilation :Instruction incorrecte à l'extérieur d'une procédure" avec le a surligné).

    par contre le 2° m'est incompréhensible

    Enfin je suppose que vu ton message la méthode que j'ai utilisé à savoir des boucles imbriquées n'est pas correcte

    Merci pour ton aide

    vincent

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    Citation Envoyé par Vincent32 Voir le message
    et ceci même si le code me met une erreur "erreur de compilation :Instruction incorrecte à l'extérieur d'une procédure" avec le a surligné).
    Il est évident que le code que je t'ai demandé de tester doit, pour pouvoir être exécuté, être mis à l'intérieur d'une procédure (celle de ton choix) !
    Tu m'assoies, là !

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Points : 153
    Points
    153
    Par défaut
    Désolé de t'asseoir (de toute façon ce n'est pas très bon de faire du PC debout (ça fait mal au dos))

    Cependant je ne suis pas plus avancé, je suis un débutant et je pensais que ça se voyait. (enfin à priori maintenant ça se voie).

    Je sais surement ce que c'est qu'une procédure (un peu comme M. Jourdain qui fait de la prose sans le savoir !) mais peux tu me dire ce qu'est une procédure (afin que je puisse faire celle e mon choix)

    Merci

    Vincent

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    Elles sont la base de tout le reste !
    Si tu débutes à ce point :
    - ton aide VBA (c'est l'essentiel, à mon sens)
    mais également sur ce forum :
    - http://excel.developpez.com/cours/?p...#artinitiation
    Bon apprentissage (toute autre forme d'approche conduirait à du n'importe quoi, je le crains)
    Amitiés

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Points : 153
    Points
    153
    Par défaut
    ok j'y suis arrivé

    une procédure c'est un truc avec sub (suffisait de me le dire )

    Bon ton truc est génial, je vais pencher dessus ...

    Merci

    vincent

    j'ai du mal a imbriquer mes boucles

    la première étant :vérifier la colonne
    la seconde est si valeur trouvé alors valeur +1 et retourner dans la première boucle

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    Tu entames là un monologue ou tu consens (!) à nous montrer ce que tu as écrit (et qui utilise à la fois ce que je t'ai déjà montré et la méthode Find) ?

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Points : 153
    Points
    153
    Par défaut
    Bon voici ce que j'ai réalisé :

    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
    Private Sub CommandButton1_Click()
     
        Dim derL As Integer, mondepart As Integer, i As Integer
     
        If Cells(1, 1) = "" Then    'Détermination de la première valeur de la variable DerL (Cellule A2=2,1); "" correspond à cellule vide
                derL = 1
                Cells(1, 1) = 1    'détermination de la valeur que doit prendre la première cellule (A2) de la variable DerL (valeur=1)
            Else
                derL = Cells(Rows.Count, 1).End(xlUp).Row + 1    'incrémentation de +1 si la cellule n'est pas vide
        End If
     
        Cells(derL, 1) = TextBox1.Text 'Détermination des cellules d'insertion des différentes valeurs
     
        With Worksheets(1).Range("a1:a500")
            Set c = .Find(TextBox1, LookIn:=xlValues)
            If Not c Is Nothing Then
                firstAddress = c.Address
                Do
                    mondepart = Asc("b")
                    For i = 0 To 10
                    c.Value = TextBox1 & Chr(mondepart + i)
                    Set c = .FindNext(c)
                    Next i
                Loop While Not c Is Nothing And c.Address <> firstAddress
            End If
        End With
     
            End Sub
    mais ça ne fonctionne pas comme je le souhaiterai.

    En premier lieu si la valeur n'existe pas, au lieu de einstein42 par exemple, il va écrire einstein42l.
    En deuxième temps si la valeur existe déjà il va modifier les valeurs existantes au lieu de ne modifier que la valeur à ajouter

    Vincent

  12. #12
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    Re

    Bon (content, au moins, de t'avoir forcé à tenter tant d'utiliser Find, que de te servir de Asc). Un bon point pour cet effort.

    Alors regarde ce que fait ceci, maintenant.
    Sur une feuille de calcul, un bouton de commande CommandButton1

    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
    Private Sub CommandButton1_Click()
      Range("A1") = "AUTEURS"
      Dim plage As Range, c As Range, auteur As String, derlig As Long, lettre As String, i As Integer
      auteur = InputBox("auteur")
      derlig = Range("A" & Application.Rows.Count).End(xlUp).Row
      If derlig = 1 Then
        Range("A" & derlig + 1) = auteur
      Else
        Set plage = Range("A:A").SpecialCells(xlCellTypeConstants)
        Set c = plage.Find(auteur, LookIn:=xlValues)
        If c Is Nothing Then
          Range("A" & derlig + 1) = auteur
        Else
          For i = 0 To 26
            lettre = Chr(Asc("a") + i)
            Set c = plage.Find(auteur & lettre, LookIn:=xlValues)
            If c Is Nothing Then
              Range("A" & derlig + 1) = auteur & lettre
              Exit For
            End If
          Next
        End If
      End If
    End Sub
    Clique sur CommandButton1, renseigne l'inputbox ==>> regarde
    Recommence plusieurs fois ===>> regarde les résultats.
    Beau ? Ca te plait ? ===>> analyse ce code et joue avec en l'adaptant à ta guise

  13. #13
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Points : 153
    Points
    153
    Par défaut
    Bonjour,

    Merci énormément Babaothe

    Ton code c'est de la tuerie !!! Encore merci c'est génial !!!

    Excellente journée

    Vincent

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

Discussions similaires

  1. Une question surement bête
    Par PLoUf88 dans le forum Langage
    Réponses: 3
    Dernier message: 28/05/2007, 12h01
  2. Boucle imbriquée avec for each et while
    Par guen dans le forum Access
    Réponses: 7
    Dernier message: 01/03/2007, 17h36
  3. [Débutant]Boucle imbriquée avec des bornes différentes
    Par Hayato dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 29/08/2005, 16h23
  4. question surement bète
    Par antoineklein dans le forum Décisions SGBD
    Réponses: 11
    Dernier message: 30/05/2005, 15h43
  5. [XSL]boucle imbriquée avec condition
    Par kor dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 11/01/2005, 14h19

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