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 :

Débutant - Générer boucle : onglet -> remplit tableau


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
    Secteur construction
    Inscrit en
    Juin 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gard (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2018
    Messages : 22
    Par défaut Débutant - Générer boucle : onglet -> remplit tableau
    Bonjour,

    Je suis tout débutant en VBA je rencontre donc des problèmes de raisonnement en termes de codage pour les rapports que je souhaite générer.

    A partir de mes rapports de forage, puisque c’est ce dont il s’agit, je souhaite remplir un tableau. Rien de très compliqué donc…
    Mais je ne sais pas comment faire le code (la boucle) qui : lorsqu’elle est déclenchée rempli :
    - la dernière ligne vide du tableau
    - cela en fonction de l’ordre des onglets, et jusqu’au dernier de mes onglets rapports (stop boucle).

    Et j’ai un problème pour ma condition de case cochée ou non. Il ne prend pas la condition je ne sais pas pourquoi, j’ai essayé avec 10 syntaxes différentes, avec true avec l’enregistreur de macro avec ci avec ca… Je veux simplement faire « si case cochée, alors ta-ta-ta » ca ne me semble pourtant pas si compliqué?
    (Sur le web je n'ai trouvé que du "si ta-ta-ta, alors coche la case")


    Voila ou j'en suis, c'est-à-dire pas très avancé, ma variable i n'est pas correctement utilisée, il faudrait l'utilisée pour le nombre d'onglets je me trompe? Bref je ne m'attends pas à ce que vous me pondiez un résultat mais que vous me donniez des pistes.

    Sub rapport()


    For i = 9 To 20 'ou 1000 peu importe

    With Sheets("Rapport global")
    .Range("A" & i) = Sheets("2-6A").Range("Y7")
    .Range("B" & i) = Sheets("2-6A").Range("Q2")
    .Range("C" & i) = Sheets("2-6A").Range("X2")
    '........................................
    '........................................
    '....et toutes les autres cellules à remplir

    End With

    Next

    If Sheets("2-6A").Shapes.Range(Array("Check Box 3")).Value = xlOn Then 'Ce code me pose problème avec la condition de la case cochée ou non

    Sheets("Rapport global").Range("E" & i) = Sheets("2-6A").Range("W11")

    End If




    'Je sais qu'il est possible d'aller chercher la dernière ligne avec un code similaire à
    'celui ci, mais je ne sais pas comment l'intégrer la haut :
    'Dim derligne As Integer
    'derligne = Range("A" & Rows.Count).End(xlUp).Row

    '.Range("A" & i+derlign) ?

    End Sub
    - Sheets("2-6A") est l'un de mes nombreux onglets rapports
    - Sheets("Rapport global") est l'onglet qui contient le tableau que je veux remplir avec les onglets rapports



    Merci d'avance!

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 682
    Par défaut
    Bonjour,

    Utilise plutôt les balises code (bouton #) c'est plus lisible

    Et j’ai un problème pour ma condition de case cochée ou non. Il ne prend pas la condition je ne sais pas pourquoi, j’ai essayé avec 10 syntaxes différentes, avec true avec l’enregistreur de macro avec ci avec ca…
    Peux tu poster le code donner par l'enregistreur de macro de macro ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .Range("A" & i) = Sheets("2-6A").Range("Y7")
     .Range("B" & i) = Sheets("2-6A").Range("Q2")
     .Range("C" & i) = Sheets("2-6A").Range("X2")
    Le premier utilise la ligne 7 et les suivants la deux c'est normal ? c'est pareil pour tout les autres onglets ?

    Mais je ne sais pas comment faire le code (la boucle) qui : lorsqu’elle est déclenchée rempli :
    - la dernière ligne vide du tableau
    - cela en fonction de l’ordre des onglets, et jusqu’au dernier de mes onglets rapports (stop boucle).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    For i = 9 To 20 'ou 1000 peu importe
     
     With Sheets("Rapport global")
     .Range("A" & i)
    La tu vas remplir les cellules de A9 a A20 et tu ne boucle pas sur tes onglets

    Il faudrait plutôt faire une boucle for each sur les onglets (worksheets)
    et utiliser le calcul de la dernière ligne comme tu l'as toi même mit en commentaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim derligne As Integer
     derligne = Range("A" & Rows.Count).End(xlUp).Row
    .Range("A" & derlign +1)
    Attention j'ai ajouté +1 a derlign car sinon tu vas écrasé a chaque itération ta ligne plutôt que d'écrire en dessous.

  3. #3
    Membre averti
    Homme Profil pro
    Secteur construction
    Inscrit en
    Juin 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gard (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2018
    Messages : 22
    Par défaut
    Peux tu poster le code donner par l'enregistreur de macro de macro ?
    Le code pour cocher / décocher la case.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        ActiveSheet.Shapes.Range(Array("Check Box 3")).Select
        With Selection
            .Value = xlOn
            .LinkedCell = ""
            .Display3DShading = False
        End With
        With Selection
            .Value = xlOff
            .LinkedCell = ""
            .Display3DShading = False
        End With
    End Sub
    Le premier utilise la ligne 7 et les suivants la deux c'est normal ? c'est pareil pour tout les autres onglets ?
    Oui tout à fait c'est la mise en page qui veut ça, il y a des cellules un peu partout.
    Et oui c'est pareil pour tous les onglets.


    La tu vas remplir les cellules de A9 a A20 et tu ne boucle pas sur tes onglets

    Il faudrait plutôt faire une boucle for each sur les onglets (worksheets)
    et utiliser le calcul de la dernière ligne comme tu l'as toi même mit en commentaire:
    Ok, donc j'ai trouvé un bout sur le net, mais ça ne fonctionne plus du tout. -> j'ai fait ç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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Sub rapport()
     
    Dim k As Integer, i As Integer, derligne As Integer
    k = Sheets.Count    'n° onglet
    derligne = Range("A" & Rows.Count).End(xlUp).Row    'n° ligne
     
        For j = 9 To 20
     
                       For i = 3 To k   ' n° onglet (1er = tableau, 2èm = model, 3èm = premier rapport..)
     
     
                            With Sheets("Rapport global")
                                 .Range("A" & derlign + 1 + j) = Sheets(i).Range("Y7")
                                 .Range("A" & derlign + 1 + j) = Sheets(i).Range("Q2")
                                 .Range("A" & derlign + 1 + j) = Sheets(i).Range("X2")
                                 '........................................
                                 '........................................
     
                             End With
     
     
                             If Sheets("2-6A").Shapes.Range(Array("Check Box 3")).Value = xlOn Then
     
                             Sheets("Rapport global").Range("E" & i) = Sheets("2-6A").Range("W11")
     
                             End If
     
                       Next i
     
       Next j
     
     
    End Sub

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 682
    Par défaut
    Pour la checkbox:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     ActiveSheet.Shapes.Range(Array("Check Box 1")).Select
        With Selection
    If .Value = xlOn Then MsgBox "case cochée"
        End With
    Fonction chez moi
    Mais: ActiveSheet.Shapes.Range(Array("Check Box 1")).Value = xlOn Then MsgBox "case cochée" ne fonctionne pas.
    Je te conseille donc de passé par le select (il y a surement un autre moyen, je suis pas expert en checkbox)

    Pour le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .Range("A" & derlign + 1 + j) = Sheets(i).Range("Y7")
                                 .Range("A" & derlign + 1 + j) = Sheets(i).Range("Q2")
                                 .Range("A" & derlign + 1 + j) = Sheets(i).Range("X2")
    Je pense que c'est une erreur de copier coller mais attention la tu écrase la valeur de ta colonne A 3 fois, dans ton message précédent tu avais mis A,B,C

    Je ne comprends toujours pas la boucle for j=9 to 20, tu vas réecrire 11 fois la même chose.

    Dans tes codes tu ne montre que ce que tu va faire pour le premier onglet, que fait tu avec les autres ? Tu écris dans colonnes différente a chaque fois? ou tu écris dans les mêmes colonnes mais en changeant de ligne a chaque onglet ?
    J'ai plutôt l'impression que c'est le second cas donc je te propose ceci:

    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
    Sub rapport()
     
    Dim i As long, derligne As long
     
                       For i = 3 To Sheets.Count     ' n° onglet (1er = tableau, 2èm = model, 3èm = premier rapport..)
                         derligne = Range("A" & Rows.Count).End(xlUp).Row    'n° ligne
     
                            With Sheets("Rapport global")
                                 .Range("A" & derlign + i-2 ) = Sheets(i).Range("Y7")
                                 .Range("B" & derlign + i-2) = Sheets(i).Range("Q2")
                                 .Range("C" & derlign + i-2) = Sheets(i).Range("X2")
                             End With
     
                              Sheets(i).Shapes.Range(Array("Check Box 3")).Select
                                 With Selection
                                   If .Value = xlOn Then 
                                       Sheets("Rapport global").Range("E" & derlign ) = Sheets(i).Range("W11")
                                    end with
                             End If
     
                       Next i
     
    End Sub
    (pour info j'utilise plutôt long que integer pour les numéro de ligne car un numéro de ligne peut dépasser la valeur max d'un integer

  5. #5
    Membre averti
    Homme Profil pro
    Secteur construction
    Inscrit en
    Juin 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gard (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2018
    Messages : 22
    Par défaut
    Okkk, merci ça fonctionne !

    Je pense que c'est une erreur de copier coller mais attention la tu écrase la valeur de ta colonne A 3 fois, dans ton message précédent tu avais mis A,B,C

    Je ne comprends toujours pas la boucle for j=9 to 20, tu vas réecrire 11 fois la même chose.
    Oui une erreur de copier/coller. Je pensais pouvoir incrémenter la ligne comme ceci, mais finalement c'est le "derlign" qui s'en charge.

    Dans tes codes tu ne montre que ce que tu va faire pour le premier onglet, que fait tu avec les autres ? Tu écris dans colonnes différente a chaque fois? ou tu écris dans les mêmes colonnes mais en changeant de ligne a chaque onglet ?
    J'ai plutôt l'impression que c'est le second cas donc je te propose ceci:
    Oui tout à fait. Mais il y a une chose que je ne comprends pas. Si le derlign se charge déja d'incrémenter la dernière ligne, pourquoi faut-il rajouter l'indice i-2? D’ailleurs dans mon cas, la première ligne de mon tableau est la 9èm donc ça donnerait i+6..

  6. #6
    Membre averti
    Homme Profil pro
    Secteur construction
    Inscrit en
    Juin 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gard (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2018
    Messages : 22
    Par défaut
    Une interrogation tout de même : pour tester le code de la case, je l'ai isolé. Ton code Msgbox fonctionne aussi chez moi.

    Et le code que tu m'a proposé fonctionne également : il me recopie bien la cellule voulue, quand la case est cochée, mais que lorsque je me trouve sur la feuille qui contient la case cochée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub case222()
     
    Sheets("Model").Shapes.Range(Array("Check Box 11")).Select
        With Selection
                If .Value = xlOn Then
                Sheets("Récapitulatif").Range("A80") = Sheets("Model").Range("W11")
                End If
         End With
     
    End Sub
    Ici le code ne fonctionne pas lorsque je le lance depuis une autre feuille que "Model". Pourquoi? La source est bien spécifiée dans les 2 cas pourtant!
    Je

  7. #7
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 682
    Par défaut
    Citation Envoyé par mikeline Voir le message
    Oui tout à fait. Mais il y a une chose que je ne comprends pas. Si le derlign se charge déja d'incrémenter la dernière ligne, pourquoi faut-il rajouter l'indice i-2? D’ailleurs dans mon cas, la première ligne de mon tableau est la 9èm donc ça donnerait i+6..
    derlign calcule la dernière ligne au moment où on lui demande, mais comme a chaque onglet on rajoute une ligne il faut soit le recalculer a chaque fois, soit utiliser l'indice de boucle pour décaler la ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = 3 To Sheets.Count     ' n° onglet (1er = tableau, 2èm = model, 3èm = premier rapport..)
    Puisque ton indice de boucle commence à 3, et que je veux écrire sur derlign+1 au premier tour de boucle, je prends i-2

    Cependant en relisant mon code et mon explication je me rends compte que j'ai fait les deux, et utiliser l'indice et recalculer

    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
    Sub rapport()
     
    Dim i As long, derligne As long
     derligne = Range("A" & Rows.Count).End(xlUp).Row    'n° ligne
                       For i = 3 To Sheets.Count     ' n° onglet (1er = tableau, 2èm = model, 3èm = premier rapport..)
     
     
                            With Sheets("Rapport global")
                                 .Range("A" & derlign + i-2 ) = Sheets(i).Range("Y7")
                                 .Range("B" & derlign + i-2) = Sheets(i).Range("Q2")
                                 .Range("C" & derlign + i-2) = Sheets(i).Range("X2")
                             End With
     
                              Sheets(i).Shapes.Range(Array("Check Box 3")).Select
                                 With Selection
                                   If .Value = xlOn Then 
                                       Sheets("Rapport global").Range("E" & derlign +1) = Sheets(i).Range("W11")
                                    end with
                             End If
     
                       Next i
     
    End Sub
    ou
    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
    Sub rapport()
     
    Dim i As long, derligne As long
     
                       For i = 3 To Sheets.Count     ' n° onglet (1er = tableau, 2èm = model, 3èm = premier rapport..)
                         derligne = Range("A" & Rows.Count).End(xlUp).Row    'n° ligne
     
                            With Sheets("Rapport global")
                                 .Range("A" & derlign + 1 ) = Sheets(i).Range("Y7")
                                 .Range("B" & derlign + 1) = Sheets(i).Range("Q2")
                                 .Range("C" & derlign + 1) = Sheets(i).Range("X2")
                             End With
     
                              Sheets(i).Shapes.Range(Array("Check Box 3")).Select
                                 With Selection
                                   If .Value = xlOn Then 
                                       Sheets("Rapport global").Range("E" & derlign +1) = Sheets(i).Range("W11")
                                    end with
                             End If
     
                       Next i
     
    End Sub
    Ici le code ne fonctionne pas lorsque je le lance depuis une autre feuille que "Model". Pourquoi? La source est bien spécifiée dans les 2 cas pourtant!
    Je n'ai malheureusement pas de réponse.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/06/2014, 06h43
  2. [débutant] Ma boucle se bloque à la fin du tableau
    Par renaud26 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 10/10/2006, 19h05
  3. Réponses: 18
    Dernier message: 28/04/2006, 11h00
  4. Réponses: 4
    Dernier message: 08/01/2005, 22h32
  5. [débutant]Documentation? boucle "while"? Session?
    Par o151181 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 19/01/2004, 15h20

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