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 :

Concaténer une variable dans une boucle for [XL-2016]


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
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2016
    Messages : 112
    Par défaut Concaténer une variable dans une boucle for
    Bonjour,

    Je fais appel à vous car je rencontre un petit problème sur mon code. Le problème c'est que j'ai 21 pages a récupérer et j'aimerais les stocker chacune dans un tableau.
    Pour ce faire je voudrais itérer sur un boucle pour tout remplir d'un coup et ne pas avoir à taper 20 ligne de code pour les remplir.
    Je voudrais donc pour chaque pages récupérer le nombre de ligne pour ensuite générer mon tableau associé.
    Jusque là tout va bien. cependant je rencontre des problème sur l'insertion de ma variable i.

    Il ne reconnait ni
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nbr_lig_Mod0"" & i & ""
    Je suis un peu perdu je dois vous avouez. Je comprend que le problème vient du fait qu'il n'arrive pas a concaténer les deux mais je n'ai pas de solutions après de multiple recherches.
    Mon but final est de traiter les données en appelant le tableau associé au module par exemple : Voici la partie du code qui me pose problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ' Recuperer les donnees dans des tables
    'Tableau du module
    For i = 1 To 21
     
        If i < 10 Then
            Nbr_lig_Mod0i = WB2.Sheets("PRE mod0" & i).Range("A" & Rows.Count).End(xlUp).Row     ' Boucle pour les modules 10 --> 21
            Tab_Mod0 "" & i = WB2.Sheets("PRE mod0" & i).Range("A1:0" & Nbr_lig_Mod0 & i).Value
        Else:
            Nbr_lig_Mod "" & i & "" = WB2.Sheets("PRE mod" & i).Range("A" & Rows.Count).End(xlUp).Row       ' Boucle pour les modules 10 --> 21
            Tab_Mod "" & i & "" = WB2.Sheets("PRE mod" & i).Range("A1:0" & Nbr_lig_Mod & i).Value
     
    Next

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    le code entier me semble nécessaire, pas uniquement un morceau

    peux-tu reformuler plus clairement ton besoin ?

    1) boucler sur 21 feuilles d'un classeur ? Il y a d'autres feuilles ou pas dans ce classeur ? Combien ?
    2) pour chacune des 21 feuilles, récupérer l'ensemble de la plage utilisée ? Ou s'arrêter à une colonne particulière ? Laquelle
    3) toutes ces données doivent atterrir dans un unique tableau, ou 21 tableaux ? Pour en faire quoi par la suite ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2016
    Messages : 112
    Par défaut
    Bonjour Joe,

    Merci de ta réponse. Ci dessous mon code complet.
    Je vais essayer d'être plus clair. Je voudrais effectivement créer 21 tableau qui s'appellerai respectivement Tab_Mod01; Tab_Mod02; Tab_Mod13 (pour la partie >10);...
    Les feuilles s’appellent : PRE mod01;PRE mod02; PRE mod13 (pour la partie >10); ...

    La finalité et de comparer les données que j'ai donc dans mon excel d'origine avec le tableau (1 des 21) récupérés.

    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
    Option Explicit
    Sub Defusion()
     
    ' #####################################"####  Definition des variables  ############################################
        Dim Zone As Range
        Dim Valeur As String
        Dim ZoneFusion As Range
        Dim Cellule As Range
        Dim fichier As String
        Dim c As Range
        Dim WB1 As Workbook
        Dim WB2 As Workbook
        Dim i As Integer
        Dim Module As Integer
     
    '######################################## ##  Ouverture du fichier PRE   ###########################################
    Set WB1 = ThisWorkbook
    fichier = Application.GetOpenFilename()     ' Selectionne le fichier
    Workbooks.Open (fichier)                            ' Ouverture du fichier
    Set WB2 = ActiveWorkbook
    '###########################################   Debut du scirpt  ##################################################
     
    Application.ScreenUpdating = False                  ' desactivation des parametres pour gagner en temps d'execution
    Application.Calculation = xlCalculationManual
    Application.DisplayAlerts = False
     
    For i = 1 To 23
        Set Zone = Sheets(i).Range("A1:P300")    ' Definition des zones a tester
     
        For Each Cellule In Zone                            ' Pour chaque cellule dans la zone
     
            If Cellule.MergeCells Then                     ' Si cellule fusionnee
                Set ZoneFusion = Cellule.MergeArea
                Valeur = Cellule.Value                         ' Enregistre la valeur de la cellule
                Cellule.UnMerge                                  ' Defusionne les cellules
     
                For Each c In ZoneFusion                      ' Remet les valeurs dans les cellules defusionnees
                    c.Value = Valeur
                Next c
     
            End If
        Next Cellule
    Next i
     
     
    ' Recuperer les donnees dans des tables
    'Tableau du module
    For i = 1 To 21
     
        If i < 10 Then
            Nbr_lig_Mod0 "" & i = WB2.Sheets("PRE mod0" & i).Range("A" & Rows.Count).End(xlUp).Row    ' Boucle pour les modules 10 --> 21
            Tab_Mod0 "" & i = WB2.Sheets("PRE mod0" & i).Range("A1:0" & Nbr_lig_Mod0 & i).Value
        Else:
            Nbr_lig_Mod "" & i & "" = WB2.Sheets("PRE mod" & i).Range("A" & Rows.Count).End(xlUp).Row       ' Boucle pour les modules 10 --> 21
            Tab_Mod "" & i & "" = WB2.Sheets("PRE mod" & i).Range("A1:0" & Nbr_lig_Mod & i).Value
            End If
    Next
     
    'Traiter les datas en comparant avec la feuille Rechange Potentielle
    Nbr_lig_list = WB1.Sheets("Rechange_Potentiel").Range("A" & Rows.Count).End(xlUp).Row
     
    For i = 2 To Nbr_lig_list
        Module = WB1.Sheets("Rechange_Potentiel").Cells(i, 1).Value
        Ref1 = WB1.Sheets("Rechange_Potentiel").Cells(i, 1).Value
        Tableau = "Tab_Mod0 " & Module
     
           For h = 1 To UBound(Tableau) ' Rechercher dans la bonne table
             Ref2 = Tab_Mod0 & Module(i, 5)
                    If Ref2 = Ref1 Then
                        WB1.Sheets("Rechange_Potentiel").Cells(i, 11).Value = Tab_Mod0 & Module(i, 2) ' Mettre la bonne colonne pour recuperer les DVA
                    End If
            Next h
     
    Next i
    Application.ScreenUpdating = False                  ' reactivation des parametres
    Application.Calculation = xlCalculationManual
    Application.DisplayAlerts = False
    End Sub

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Tu as deux approches possibles :

    1) travailler dans un tableau 3D : dimension1 = lignes / dimension 2 = colonnes / dimension 3 = feuille excel

    je déconseille, c'est compliqué de manipuler des 3D, et pas mal de fonctionnalités VBA ne sont pas compatibles

    2) travailler avec un tableau de tableaux !
    voici un exemple pour comprendre la mécanique

    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
    Option Base 1
    Sub toto()
    Dim TableauMaitre(1 To 21), i As Long, j As Long, t As Long
        ' on prend les 21 plages contigües à A1 des 21 feuilles
        ' on en fait des tableaux enfants qu'on met dans le tableaumaitre
        For i = LBound(TableauMaitre) To UBound(TableauMaitre)
            TableauMaitre(i) = ThisWorkbook.Worksheets(i).Cells(1, 1).CurrentRegion.Value
        Next i
     
        ' ici, on interroge le premier tableau enfant (1) et plus précisément sa cellule A1 (1,1)
        MsgBox TableauMaitre(1)(1, 1)
     
        ' exemple bidon pour boucler sur TOUTES les valeurs de TOUS les tableaux
        For i = LBound(TableauMaitre) To UBound(TableauMaitre)
            For j = LBound(TableauMaitre(i), 1) To UBound(TableauMaitre(i), 1)
                For t = LBound(TableauMaitre(i), 2) To UBound(TableauMaitre(i), 2)
                    Debug.Print TableauMaitre(i)(j, t)
                Next t
            Next j
        Next i
    End Sub
    il ne te reste plus qu'à gérer l'alimentation de tes tableaux enfants en fonction du nom de la feuille.
    Du coup, plus besoin de stocker des noms de variables tableaux de façon dynamique, c'est l'indice du tableaumaitre qui te donne le numéro de la feuille, dont l'ordre aura été défini par ta boucle d'alimentation

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2016
    Messages : 112
    Par défaut
    Merci Joe pour ta proposition je penses que l'option 2 est abordable pour moi.

    Juste pour être sure, le but est de stocker tous les tableau dans Tableaumaitre et après tu appelle les tableau en faisant : ?
    Si comprend bien j'ai plus qu'à implémenté le bon tableau au bon indice en jouant avec les noms des feuilles !

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2016
    Messages : 112
    Par défaut
    Voici la fin de mon code modifié. Par contre j'ai une erreur sur la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     TableauMaitre(i) = ThisWorkbook.Worksheets("PRE mod0" & i).Cells(1, 1).CurrentRegion.Value
    Il me dit que l'indice n’appartient pas à la sélection. Tu penses que c'est la feuille ou le range qui pose un problème ?

    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
       For i = LBound(TableauMaitre) To UBound(TableauMaitre)
             If i < 10 Then
                    TableauMaitre(i) = ThisWorkbook.Worksheets("PRE mod0" & i).Cells(1, 1).CurrentRegion.Value
              Else
                    TableauMaitre(i) = ThisWorkbook.Worksheets("PRE mod" & i).Cells(1, 1).CurrentRegion.Value
              End If
        Next
     
    'Traiter les datas en comparant avec la feuille Rechange Potentielle
    Nbr_lig_list = WB1.Sheets("Rechange_Potentiel").Range("A" & Rows.Count).End(xlUp).Row
     
    For i = 2 To Nbr_lig_list
        Module = WB1.Sheets("Rechange_Potentiel").Cells(i, 1).Value
        Ref1 = WB1.Sheets("Rechange_Potentiel").Cells(i, 1).Value
     
           For h = 1 To UBound(TableauMaitre(Module)) ' Rechercher dans la bonne table
             Ref2 = TableauMaitre(Module)(i, 8)
                    If Ref2 = Ref1 Then
                        WB1.Sheets("Rechange_Potentiel").Cells(i, 11).Value = TableauMaitre(Module)(i, 4) ' Mettre la bonne colonne pour recuperer les DVA
                    End If
            Next h

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/01/2022, 11h24
  2. Réponses: 3
    Dernier message: 09/03/2016, 16h23
  3. [AC-2003] Concaténer les valeurs d'une colonne dans une variable
    Par Kiwix dans le forum VBA Access
    Réponses: 1
    Dernier message: 06/04/2011, 10h20
  4. Réponses: 4
    Dernier message: 28/01/2010, 16h38
  5. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05

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