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 :

Création de tableau


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Par défaut Création de tableau
    Bonjour,

    J'ai une boite de dialogue qui me permet de copié des valeurs dans plusieurs onglets en prenant en compte plusieurs critères...Pour cela j'utilise les tableaux. Dans deux onglets avec deux codes différents je rencontre un point dur, le premier :

    -C'est que les valeurs sont bien copiées dans mon onglets mais pas comme je souhaiterai, dans mon onglets je souhaite que les valeurs soit copiées de 1 à 40 à partir de la colonne A7, de 41 à 81 à partir de la colonne F7 et de 82 à la fin à partir de la colonne K7...

    Je n'arrive pas à voir où est-ce qu'il y a une erreur dans mon code quand j'éxécute la macro, j'ai une erreur sur cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      .Offset(p - 41, 0) = Tablo(1, p)
    Voici le code de la macro :

    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
    Sub copypjointes()
    Dim repere As String
     
    Dim dernl As Range, liste As Range
    Dim f As Range
    Dim nbcol As Integer
    Dim p As Integer, k As Integer, a As Byte
    Dim Tablo()
    Dim dernval As Range
     
     
    'Occurence à rechercher dans la colonne 1 de la feuille "TABLE"
    repere = cmboTAG.Value
     
    With Sheets("MASTER LUT")
     
        'Dernière ligne de la feuille "TABLE"
        Set dernl = .Cells(.Rows.Count, 5).End(xlUp)
        'liste des occurences dans laquelle chercher la valeur de la Combobox
        Set liste = .Range(.Cells(9, 5), dernl)
        'Cellule correspondante à la recherche
        Set f = liste.Find(repere, Lookat:=xlWhole)
        'Dernière colonne de la feuille "TABLE"
        nbcol = .Cells(9, .Columns.Count).End(xlToLeft).Column - 1
     
        'Compteur des occurences informées
        k = 0
     
        'Il y a 3 champs (...) placés toutes les colonnes à partir de la colonne des occurences (A1, A2...)
        For p = 85 To nbcol
            'Test si le champ est informé
           If f.Offset(0, p) > 1 Then
               'Si oui, alors le compteur augmente de 1
                k = k + 1
                'On redimensionne la variable Tableau de 1 occurence k tout en conservant les précédents enregistremeents
                'Il y a 4 champs à retenir (Nom de la pièce, Référence, Quantité N,  Quantité D)
                ReDim Preserve Tablo(1 To 3, 1 To k)
                '1ère valeur = nom de la pièce placé en ligne 5
                Tablo(1, k) = .Cells(9, 5 + p)
                'Référence
                Tablo(2, k) = f.Offset(0, p)
     
                End If
        Next p
     
    End With
     
    'Information de la feuille Résultats
    With Sheets("11-PIECES JOINTES")
            'Effacement des anciens enregistrements...
            Set dernval = .Cells(.Rows.Count, 5).End(xlUp)
            '... à conditions qu'il y en ait, sinon on effacerait la ligne de titres
            If dernval.Row > 7 Then .Range("A7", dernval.Offset(0, 6)).ClearContents
            'On informe le champ correspondant à la variable Tableau transposée
            If UBound(Tablo(), 2) <= 40 Then
                    .Range("A7").Resize(UBound(Tablo(), 2), UBound(Tablo(), 1)).Value = WorksheetFunction.Transpose(Tablo)
            Else
     
     
                    For p = 1 To 40
                            With .Range("A7")
                                    .Offset(p - 1, 0) = Tablo(1, p)
                                    .Offset(p - 1, 1) = Tablo(2, p)
                            End With
                    Next p
     
     
                    For p = 41 To 81
                           With .Range("F7")
                                   .Offset(p - 41, 0) = Tablo(1, p)
                                   .Offset(p - 41, 1) = Tablo(2, p)
                            End With
                    Next p
     
                    For p = 82 To UBound(Tablo(), 2)
                           With .Range("K7")
                                   .Offset(p - 82, 0) = Tablo(1, p)
                                   .Offset(p - 82, 1) = Tablo(2, p)
                            End With
                    Next p
     
            End If
     
      End With

  2. #2
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour,

    Sans examiner ton code, exécutes-le en mode pas à pas ou mets un point d'arrêt sur la ligne provoquant l'erreur, regardes la valeur de ta variable p, tu comprendras peut-être

    Bonne journée
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Par défaut
    Maintenant j'ai un autre soucis les valeurs copiés dans mon onglets :
    Elles sont copiées de la ligne A7 à A140; de F7 à F41 et de K7 à K140

    Alors que je souhaite quelles soient copiées de A7 à A46; de F7 à F46 et de K7 à K46

  4. #4
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut
    Bonjour Stéfanie,

    Pour l'offset, sauf erreur de ma part je pense que l'erreur vient de cela :
    1-1 = 0
    41-41 = 0 or la ligne 0 n'existe pas sur le tableur.

    cordialement.

    re.....,

    il me semble que tu n'as pas besoin de passer par une boucle pour cela.

    il suffit de faire (toujours avec les réserves du novice) :

    plage étant ta colonne 1 à 40 ou 41 à 81 ou ........

    je n'ai pas analysé le code mais dans cette instruction tu ne créé pas le tablo mais la plage.

  5. #5
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonsoir,
    A nibledispo,
    Pour l'offset, sauf erreur de ma part je pense que l'erreur vient de cela :
    1-1 = 0
    41-41 = 0 or la ligne 0 n'existe pas sur le tableur.
    essaies ce code avec le range que tu veux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox .Range("a29").Offset(0, 0)
    Par contre, pour ta dernière intervention, tu as peut-être raison, mais je pense qu'il serait utile (à ce stade) d'avoir une copie bidon du fichier.

    Bonne soirée
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  6. #6
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut création de tableau
    Bonjour casefayere,

    Tu as entièrement raison sur le mal fondé de ma première remarque. Le plus grave est que j'ai déjà eu à voir ce genre d'instruction sur une autre discussion et croyais l'avais bien assimilé après un certain temps.

    Pour ma seconde remarque je m'en suis remis à la formation Jboisgontier rubrique tableau. Reste à savoir si j'ai bien compris. Je pense que oui, car il me semble que Didier Gonard écrit la même chose.

    Cordialement.

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Je n'ai absolument pas testé ton code mais je l'ai tout de même modifié, teste le pour voir. Quand tu fais une recherche avec "Find", il est conseillé de contrôler si un Range est bien retourné de cette façon "If Not f Is Nothing Then" car dans le cas contraire, à la première utilisation "If f.Offset(0, p) > 1 Then" une erreur sera relevée car la variable sera égale à Nothing. Ensuite, comme ton tableau risque de ne pas avoir toujours la même dimension (la dernière) faire une boucle jusqu'à plus de 82 "For p = 82 To UBound(Tablo(), 2)" ou seulement même jusqu'à 81 "For p = 41 To 81" va générer une erreur si la dimention max est inférieure à ces valeurs donc, il est préférable de boucler sur tout le tableau et de contrôler le compteur pour affecter les valeurs au bon Range. La première dimension de ton tableau est de 3 alors que 2 te suffisent :
    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
     
    Sub copypjointes()
     
        Dim repere As String
        Dim liste As Range
        Dim f As Range
        Dim nbcol As Integer
        Dim p As Integer, k As Integer
        Dim Tablo()
        Dim dernval As Range
     
        'Occurence à rechercher dans la colonne 1 de la feuille "TABLE"
        repere = cmboTAG.Value
     
        With Sheets("MASTER LUT")
     
            'liste des occurences dans laquelle chercher la valeur de la Combobox
            Set liste = .Range(.Cells(9, 5), .Cells(.Rows.Count, 5).End(xlUp))
     
            'Cellule correspondante à la recherche
            Set f = liste.Find(repere, Lookat:=xlWhole)
     
            If Not f Is Nothing Then
     
               'Dernière colonne de la feuille "TABLE"
               nbcol = .Cells(9, .Columns.Count).End(xlToLeft).Column - 1
     
               'Il y a 3 champs (...) placés toutes les colonnes à partir de la colonne des occurences (A1, A2...)
               For p = 85 To nbcol
     
                   'Test si le champ est informé
                   If f.Offset(0, p) > 1 Then
     
                       'Si oui, alors le compteur augmente de 1
                       k = k + 1
     
                       'On redimensionne la variable Tableau de 1 occurence k tout en conservant les précédents enregistremeents
                       'Il y a 4 champs à retenir (Nom de la pièce, Référence, Quantité N,  Quantité D)
                       ReDim Preserve Tablo(1 To 2, 1 To k) '<--<--<--<-- pourquoi 3 alors que seulement 2 sont utilisées ?
     
                       '1ère valeur = nom de la pièce placé en ligne 5
                       Tablo(1, k) = .Cells(9, 5 + p)
     
                       'Référence
                       Tablo(2, k) = f.Offset(0, p)
     
                       End If
     
               Next p
     
            Else
     
                MsgBox "Aucune occurence de '" & repere & "' trouvée !"
                Exit Sub
     
            End If
     
        End With
     
        'Information de la feuille Résultats
        With Sheets("11-PIECES JOINTES")
     
            'Effacement des anciens enregistrements...
            Set dernval = .Cells(.Rows.Count, 5).End(xlUp)
     
            '... à conditions qu'il y en ait, sinon on effacerait la ligne de titres
            If dernval.Row > 7 Then .Range("A7", dernval.Offset(0, 6)).ClearContents
     
            'On informe le champ correspondant à la variable Tableau transposée
            If UBound(Tablo(), 2) <= 40 Then
     
                .Range("A7").Resize(UBound(Tablo, 2), UBound(Tablo, 1)).Value = WorksheetFunction.Transpose(Tablo)
     
            Else
     
                For p = 1 To UBound(Tablo, 2)
     
                    Select Case p
     
                        Case Is <= 40
     
                            With .Range("A7")
                                    .Offset(p - 1, 0) = Tablo(1, p)
                                    .Offset(p - 1, 1) = Tablo(2, p)
                            End With
     
                        Case 41 To 81
     
                            With .Range("F7")
                                   .Offset(p - 41, 0) = Tablo(1, p)
                                   .Offset(p - 41, 1) = Tablo(2, p)
                            End With
     
                        Case 82 To UBound(Tablo, 2)
     
                            With .Range("K7")
                                   .Offset(p - 82, 0) = Tablo(1, p)
                                   .Offset(p - 82, 1) = Tablo(2, p)
                            End With
     
                    End Select
     
                Next p
     
            End If
     
        End With
     
    End Sub
    Hervé.

    re,

    et même cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Case 82 To UBound(Tablo, 2)
    peut être remplacée par :
    Hervé.

  8. #8
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Par défaut
    Citation Envoyé par Theze Voir le message
    re,

    et même cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Case 82 To UBound(Tablo, 2)
    peut être remplacée par :
    Hervé.

    MERCI

  9. #9
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut création de tableau
    Bonsoir aux intervenants,

    Pour ma formation, j'aimerai savoir si ma seconde remarque était fondé pour ce qui concerne les dernières boucles for ... next.

    Merci d'avance.

    Cordialement.

  10. #10
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Par défaut
    Voici le code de la macro :

    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
    Sub copypjointes()
    Dim repere As String
     
    Dim dernl As Range, liste As Range
    Dim f As Range
    Dim nbcol As Integer
    Dim p As Integer, k As Integer, a As Byte
    Dim Tablo()
    Dim dernval As Range
     
     
    'Occurence à rechercher dans la colonne 1 de la feuille "TABLE"
    repere = cmboTAG.Value
     
    With Sheets("MASTER LUT")
     
        'Dernière ligne de la feuille "TABLE"
        Set dernl = .Cells(.Rows.Count, 5).End(xlUp)
        'liste des occurences dans laquelle chercher la valeur de la Combobox
        Set liste = .Range(.Cells(9, 5), dernl)
        'Cellule correspondante à la recherche
        Set f = liste.Find(repere, Lookat:=xlWhole)
        'Dernière colonne de la feuille "TABLE"
        nbcol = .Cells(9, .Columns.Count).End(xlToLeft).Column - 1
     
        'Compteur des occurences informées
        k = 0
     
        'Il y a 3 champs (...) placés toutes les colonnes à partir de la colonne des occurences (A1, A2...)
        For p = 85 To nbcol
            'Test si le champ est informé
           If f.Offset(0, p) > 1 Then
               'Si oui, alors le compteur augmente de 1
                k = k + 1
                'On redimensionne la variable Tableau de 1 occurence k tout en conservant les précédents enregistremeents
                'Il y a 4 champs à retenir (Nom de la pièce, Référence, Quantité N,  Quantité D)
                ReDim Preserve Tablo(1 To 3, 1 To k)
                '1ère valeur = nom de la pièce placé en ligne 5
                Tablo(1, k) = .Cells(9, 5 + p)
                'Référence
                Tablo(2, k) = f.Offset(0, p)
     
                End If
        Next p
     
    End With
     
    'Information de la feuille Résultats
    With Sheets("11-PIECES JOINTES")
            'Effacement des anciens enregistrements...
            Set dernval = .Cells(.Rows.Count, 5).End(xlUp)
            '... à conditions qu'il y en ait, sinon on effacerait la ligne de titres
            If dernval.Row > 7 Then .Range("A7", dernval.Offset(0, 6)).ClearContents
            'On informe le champ correspondant à la variable Tableau transposée
            If UBound(Tablo(), 2) <= 40 Then
                    .Range("A7").Resize(UBound(Tablo(), 2), UBound(Tablo(), 1)).Value = WorksheetFunction.Transpose(Tablo)
            Else
     
     
                    For p = 1 To 40
                            With .Range("A7")
                                    .Offset(p - 1, 0) = Tablo(1, p)
                                    .Offset(p - 1, 1) = Tablo(2, p)
                            End With
                    Next p
     
     
                    For p = 41 To 81
                           With .Range("F7")
                                   .Offset(p - 41, 0) = Tablo(1, p)
                                   .Offset(p - 41, 1) = Tablo(2, p)
                            End With
                    Next p
     
                    For p = 82 To UBound(Tablo(), 2)
                           With .Range("K7")
                                   .Offset(p - 82, 0) = Tablo(1, p)
                                   .Offset(p - 82, 1) = Tablo(2, p)
                            End With
                    Next p
     
            End If
     
      End With
    [/QUOTE]

    Je souhaiterai limitée ma recherche dans mon onglet "master lut" pour copier le texte de mes liens jusqu'à la colonne 120 est ce possible en modifiant le code?
    il faut peut-être modifier le nbcol :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbcol = .Cells(9, .Columns.Count).End(xlToLeft).Column - 1
    Je sais pas sur quoi jouer éxactement...?

  11. #11
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbcol = .Cells(9, .Columns.Count).End(xlToLeft).Column - 1
    .....Il faut que je puisse remplacer cette donnée par un numéro de colonne afin d'indiquer la dernière colonne prise en compte, mais je sais pas comment...?

    Y a-t-il une personne qui a une idée...?

Discussions similaires

  1. création de tableau dans un autre tableau
    Par freestyler dans le forum Delphi
    Réponses: 2
    Dernier message: 02/11/2006, 09h54
  2. erreur création de tableau
    Par fabule dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 20/07/2006, 21h36
  3. Création de tableau
    Par rod59 dans le forum C
    Réponses: 10
    Dernier message: 12/11/2005, 17h40
  4. [CR] Création de tableau et case à cocher
    Par aysse dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 26/11/2003, 18h07

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