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 :

Lignes de code non comprises [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Par défaut Lignes de code non comprises
    Bonjour,

    Il y a plusieurs lignes de code que je ne comprends pas, est ce que quelqu un pourrait me les expliquer svp ? Il s'agit d'un programme pour générer un questionnaire aléatoire fait par quelqu'un d'autre. J'ai coloré tous les codes que je ne comprenais pas :

    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
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    Global nbre_question As Integer 'nombre de questions indiqué dans la feuille questionnaire
    Global nbre_total_question As Integer 'nombre total de questions existantes
    Dim comp As Integer 'indique si la question est deja presente dans le questionnaire
    Dim dern_ligne As Long 'derniere cellule remplis du questionnaire
    Dim l_verif As Integer 'variable s'incrementant pour la verification des lignes
    Dim Chaine_Recherch As String 'variable contenant la prochaine question  qui va etre ecrite (apres vérification)
    Dim Ligne_Recherch As Integer 'variable contenant le numero de la ligne de la prochaine question qui va etre ecrite
    Dim nbre_rep As Integer 'nombre de reponses possibles pour la prochaine question
    Dim colonne_repA As Integer 'numero de colonne reponse A a ecrire
    Dim ligne_cop As Integer 'numero de ligne du debut de la copie
    Dim espace As Integer 'espace entre questions
    Dim t As Integer 'boucle for question
    Dim r As Integer 'boucle for reponse
    
    
    Dim height_cell As Double 'hauteur de ligne avant cellule
    Dim height_cell_dest As Double 'hauteur de cellule de destination
    Dim height_chbx As Double 'hauteur de la checkbox
    Dim width_chbx As Double 'largeur de la checkbox
    Dim posX_chbx As Double 'position x checkbox
    Dim posY_chbx As Double 'position y checkbox
    Dim name_reps_ok As String
    
    Dim tab_Quest
    
    'fonction permettant d'obtenir le nombre de caractere "x" d'une cellule
    Function nbstr(car, cellule)
    Dim compt 'compteur nombre de caractere
    Dim n As Integer
    
    compt = 0  'RAZ compteur nombre de caractere
    'boucle pour compter les caracteres présents
    For n = 1 To Len(cellule.Value)
    If Mid$(cellule, n, 1) = car Then compt = compt + 1
    Next
    
    nbstr = compt
    End Function
    
    
    
    Sub question() 'procedure pour ecrire les questions
    
    
    nbre_question = Sheets("Questionnaire").Range("k2")
    nbre_total_question = Sheets("Questionnaire").Range("k4")
    colonne_repA = 4
    espace = 2
    
    If Sheets("Questionnaire").Range("B" & Rows.Count).End(xlUp).Row > Sheets("Questionnaire").Range("A" & Rows.Count).End(xlUp).Row Then
        dern_ligne = Sheets("Questionnaire").Range("B" & Rows.Count).End(xlUp).Row
    Else
        dern_ligne = Sheets("Questionnaire").Range("A" & Rows.Count).End(xlUp).Row
    End If
    
    ligne_cop = 1
    
    Sheets("Questionnaire").Range(Cells(2, 1), Cells(dern_ligne, 2)).ClearContents 'raz questionnaire precedent
    Sheets("Questionnaire").CheckBoxes.Delete
        
    If nbre_question > nbre_total_question Then 'vérification du nombre de questions
        MsgBox "nombre de questions trop grand"
        Sheets("Questionnaire").Range("k2").ClearContents
    Exit Sub
    End If
    
    
    For t = 1 To nbre_question 'Ecriture des Questions/reponses jusqu'au nombre de question voulus
    
        ReDim tab_Quest(t)
        
        ligne_cop = ligne_cop + 1 + espace
        l_verif = 0
       
        Ligne_Recherch = Int(Rnd * nbre_total_question) + 1
        'tab_Quest()(t)(0) = Sheets("questions").Cells(Ligne_Recherch + 1, 1)
        Chaine_Recherch = Sheets("questions").Cells(Ligne_Recherch + 1, 1)
        
        Do While l_verif < ligne_cop + t + 1 'boucle pour determiner si la question a deja été écrite
            
            'comparaison de la question nouvellement ecrite avec les questions précedentes
    
            If Chaine_Recherch.Value = tab_Quest()(l_verif)(0).Value Then
                l_verif = 0
                
                'copie d'une autre question si deja presente
                Ligne_Recherch = Int(Rnd * nbre_total_question) + 1
                Chaine_Recherch = Sheets("questions").Cells(Ligne_Recherch + 1, 1).Value
                
            Else
                l_verif = l_verif + 1
            End If
        Loop
        
    
        'copie de la question dans un questionnaire
    
        'copie de la question à la suite du questionnaire
        Sheets("Questionnaire").Cells(ligne_cop, 1).Value = Chaine_Recherch
        Sheets("Questionnaire").Cells(ligne_cop, 2).Value = "bonne reponse: " & Sheets("questions").Cells(Ligne_Recherch + 1, 3).Value
        
        'nombre de reponses possibles
        nbre_rep = Sheets("questions").Cells(Ligne_Recherch + 1, 2).Value
        
        'boucle de copie des reponses possibles
        For r = 1 To nbre_rep
            'ajout des checkbox + texte reponse
                height_cell = Range(Cells(1, 1), Cells(Sheets("Questionnaire").Cells(ligne_cop + r, 2).Row, 1)).Height 'hauteur de ligne avant cellule
                height_chbx = 10 'hauteur de la checkbox
                height_cell_dest = Sheets("Questionnaire").Cells(ligne_cop + r, 2).Height
    
                'calcul position x checkbox
                    posX_chbx = Range("k7") 'width_cell - (0.4 * width_cell_dest) + width_chbx '- (1.2 * width_chbx)
                'calcul position y checkbox
                    posY_chbx = height_cell - height_cell_dest '- (1.5 * height_chbx
    
                'nom des bonnes réponses
                name_reps_ok = 1
                
                'ajout de la checkbox (add (x,y,larg,haut)) et de la reponse
                    Sheets("Questionnaire").CheckBoxes.Add(posX_chbx, posY_chbx, width_chbx, height_chbx).Select
                    Selection.Characters.Text = Sheets("questions").Cells(Ligne_Recherch + 1, colonne_repA + r - 1)
                    Selection.Name = "Q" & Ligne_Recherch & "Rep" & r
                    Selection.Width = 500
                    
        Next
            
         'mise a jour ligne de debut de copie
         ligne_cop = ligne_cop + nbre_rep
            
            
            
            
    Next
    
    End Sub

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For n = 1 To Len(cellule.Value)
    If Mid$(cellule, n, 1) = car Then compt = compt + 1
    Next
    (au préalable, on a mis compt à zéro)
    ==>Fait boucler un compteur "n" depuis 1 jusqu'à la longueur de la chaine de caractère "cellule"
    ==>Pour chaque valeur de n(en bref, pour chaque caractère de la chaine cellule, ici identifié par sa position dans la chaine), on vérifie si il est égal à car.
    ==>Si il est égal à car, on ajoute 1 à compt
    Par exemple, si j'appelle la fonction nbstr("X", "XxXa9"), elle va
    _Mettre compt à zéro
    _Boucler n de 1 à 5(longueur de "XxXa9")
    _pour n = 1 et n = 3, ajouter 1 à compt
    _pour n = 2, 4 ou 5, ne rien faire
    _renvoyer 2, au final

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Questionnaire").Range("B" & Rows.Count).End(xlUp).Row
    astuce technique qui permet de trouver la dernière case remplie d'une colonne. Rows.Count compte les lignes utilisées par le tableau. En partant de là, et en remontant, on est sur de trouver la dernière cellule utilisée d'une colonne, sans partir de tout en bas.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Do While l_verif < ligne_cop + t + 1
    tant que le compteur l_verif est strictement inférieur à l'addition de ligne_cop, t et 1, alors on execute le code jusqu'au Loop.

    Je n'ai pas bien compris les deux autres, il y a du code en commentaires qui me parait louche.

  3. #3
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Par défaut
    Salut El slapper, merci de ta réponse, mais je n'arrive pas à comprendre les codes :
    range.end(xlup).row et range.end(xldown).row

    Concrètement, si j'ai plusieurs cellules remplies avec des trous, comment marchent ces ends ? J'ai fait plusieurs essais, mais je n'arrive pas à comprendre.

    Et pour quelle est la différence entre range("A" & rows.count).end().row et range("A:A").end().row ?

  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
    Citation Envoyé par Armays Voir le message
    Salut El slapper, merci de ta réponse, mais je n'arrive pas à comprendre les codes :
    range.end(xlup).row et range.end(xldown).row

    Concrètement, si j'ai plusieurs cellules remplies avec des trous, comment marchent ces ends ? J'ai fait plusieurs essais, mais je n'arrive pas à comprendre.
    En fait, ça correspond à l'action que tu fais quand tu est sur une case, et que tu fais [Ctrl] + [Fleche]. Par exemple, si tu te mets en A1, et que tu fais [Ctrl] + [Fleche Bas], range.end(xldown).row va te ramener la ligne de la nouvelle cellule.

    Admettons que les 4 premières cellules soient vides, les 4 suivantes pleines, et le reste vide.
    range("A1").end(xldown).row va te ramener 5 (première case remplie)
    range("A2").end(xldown).row va te ramener 5 (première case remplie)
    range("A3").end(xldown).row va te ramener 5 (première case remplie)
    range("A4").end(xldown).row va te ramener 5 (première case remplie)
    range("A5").end(xldown).row va te ramener 8 (dernière case remplie)
    range("A6").end(xldown).row va te ramener 8 (dernière case remplie)
    range("A7").end(xldown).row va te ramener 8 (dernière case remplie)
    range("A8").end(xldown).row va te ramener 8 (dernière case remplie)
    range("A9").end(xldown).row va te ramener 65535 (fin du tableau)

    C'est effectivement d'une utilité limitée si on a pas mal de trous non maitrisés. Dans ce cas, on peut partir de Range("C" & Rows.Count).End(xlUp).Row et remonter : ça permet d'avoir toutes les lignes remplies, sans exception. Par contre, il faut gérer "à la main" les cas ou les lignes sont vides.

    Citation Envoyé par Armays Voir le message
    Et pour quelle est la différence entre range("A" & rows.count).end().row et range("A:A").end().row ?
    Des essais que j'en ai fait, "A:A" fonctionne bizarrement en xlUp(quand on tape sur la flêche vers le haut). Vers le bas, ça a l'air de bien marcher. Le concept, c'est qu'on simule la selection d'une colonne entière, puis [Ctrl] + [Fleche]. Comme c'est un raccourci conçu pour partir d'une seule cellule, range("A:A").end() est plutôt aléatoire, et donc à déconseiller fortement. range("A" & rows.count).end(xlUp).row te garantit d'avoir la ligne de la dernière cellule remplie de la colonne A.

  5. #5
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Par défaut
    OK merci beaucoup el sappler !

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

Discussions similaires

  1. [XL-2007] Lignes de code non comprises
    Par benjamin_malaussene dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 18/04/2014, 14h32
  2. Réponses: 0
    Dernier message: 20/09/2010, 14h22
  3. [netbeans][Linux] Nombre de lignes de codes
    Par sylvain_neus dans le forum NetBeans
    Réponses: 5
    Dernier message: 13/08/2004, 10h09
  4. Calculeur de ligne de code
    Par Bernybon dans le forum Autres éditeurs
    Réponses: 9
    Dernier message: 05/03/2004, 16h29

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