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 :

Transferer un tableau dans un autre tableau [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Invité
    Invité(e)
    Par défaut Transferer un tableau dans un autre tableau
    Bonjour,

    En fait, sur le forum j'ai lu que l'on pouvait effectuer des calculs en utilisant des tableaux. J'ai fait une macro pour faire des calculs (plusieurs critères) en utilisant des filtreAuto, le résultat est satisfaisant.

    Je voudrais donc m'initier aux tableaux (j'ai déjà téléchargé le tuto du forum, et d'autres que j'ai trouvé sur le net); c'est encore très flou dans mon esprit.

    Alors, première chose comment transférer un tableau dans un autre. Voilà, je mets une plage dans un tableau et j'ai transféré certaines colonnes sur une autre feuille.
    Je voudrais effectuer la même opération mais transférer ces colonnes dans un tableau.
    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
    Sub Tableau()
    Dim bd As Object, Fg As Object
    Dim DerLig As Long, DerCol As Byte
    Dim Tb, RES()
    Dim i As Long, j As Long
    '''''''''''''''''''''''''''''''''''''''''''
    Set bd = Sheets("BD")
    DerLig = bd.Cells(Application.Rows.Count, 1).End(xlUp).Row
    Set Fg = Sheets("intermediaire")
     
    Application.EnableEvents = False
    On Error Resume Next
     
    'Dans la variable tableau Tb on récupère toutes les données de la feuille BD
    With bd
        DerLig = .Cells(.Rows.Count, 1).End(xlUp).Row
        Tb = .Range("A2:R" & DerLig)
    End With
     
    With Fg
        'on parcours le tableau Tb
        For i = 1 To DerLig - 1
                   'on incrémente le compteur j
                j = j + 1
                ReDim Preserve RES(1 To 10, 1 To j)
                RES(1, j) = Tb(i, 3)
                RES(2, j) = Tb(i, 4)
                RES(3, j) = Tb(i, 5)
                RES(4, j) = Tb(i, 6)
                RES(5, j) = Tb(i, 7)
                RES(6, j) = Tb(i, 8)
                RES(7, j) = Tb(i, 9)
                RES(8, j) = Tb(i, 10)
                RES(9, j) = Tb(i, 15)
                RES(10, j) = Tb(i, 18)
     
        Next i
        'on efface la plage de Calcul
        DerLig = Fg.Cells(.Rows.Count, 1).End(xlUp).Row
        If DerLig > 2 Then .Range("A2:R" & DerLig).Clear
        'on transfère le transposé de Res
        If j > 0 Then .Range("A2").Resize(j, 10) = Application.Transpose(RES)
     
    End With
     
    Application.ScreenUpdating = True
     
    End Sub
    En vous remerciant par avance.J'aurais pu reprendre la feuille "intermediaire" et la mettre dans un tableau, mais ce n'est pas le but rechercher, c'est plutôt apprendre à passer d'un tableau à un autre.

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 128
    Points : 188
    Points
    188
    Par défaut
    Bonjour,

    Je n'ai pas très bien compris ta requête. Tu veux simplement mettre les données d'un tableau dans un autre ?

    De ce style là: ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    'Ici les 2 tableaux ont la même taille, juste pour te montrer un exemple
    Dim tab1(10) As Integer 'tableau qui contient tes valeurs
    Dim tab2(10) As Integer 'tableau qui va recevoir tes valeurs
     
    For i=0 To UBound(tab1)
         tab2(i).Value = tab1(i).Value
    Next
    Est-ce cela que tu cherches à faire ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour, merci pour le retour.

    Je crois que je ne me suis pas bien expliqué. Voilà, j'ai une BD qui compte 18 colonnes et n Lignes.

    Je voudrais mettre certaines colonnes dans un tableau, les colonnes concernées sont:3, 4, 5, 6, 7, 8, 9 ,10, 11, 16 et 18.

    Comme c'est assez confus (tableau) dans ma tête, et que je n'arrive pas à bien comprendre leur fonctionne en utilisant la "fenêtre des variables locales",

    j'ai pensé à une macro qui montre les différentes étapes en utilisant des feuilles, c'est à dire qu'à chaque fois qu'on passe à un autre tableau,

    ce même tableau soit mis sur une feuille pour voir le résultat.

    Merci.

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 128
    Points : 188
    Points
    188
    Par défaut
    Bonjour,

    Les tableaux sont des variables. Ils servent à STOCKER des données.

    Si ton but est de MONTRER aux autres utilisateurs l'évolution de tes valeurs (tu as 18*n valeurs, mais seulement 11 colonnes (11*n valeurs) utiles c'est bien ça?) dans ce cas là tu peux simplement stocker ces valeurs dans les cellules excel.

    Mais pour t'aider à utiliser les tableaux, le plus simple pour que tu comprennes est de commencer avec un tableau à 2 dimensions.
    Prenons par exemple un tableau à 4 lignes et 10 colonnes, qui contient des entiers (pour faire simple)
    Tu peux voir ce tableau comme:
    - un tableau de tableau ( première ligne = tableau de 10 cases / deuxieme ligne = tableau de 10 cases / etc...)
    - une matrice (4,10)
    Dans l'exemple que je te donne, le tableau STOCKERA en mémoire la table de multiplication de 1 à 4
    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
    Dim tableau(1 To 4, 1 To 10) As Integer
     
    Sub tableMultiplicative()
     
    For i = 1 To 4 'ici les lignes
        For j = 1 To 10 'ici les colonnes
            tableau(i, j) = i * j
        Next
    Next
     
    'For i = 1 To 4
    '    For j = 1 To 10
    '        MsgBox (tableau(i, j))
    '    Next
    'Next
    End Sub
    J'ai mis en commentaire une façon d'AFFICHER les valeurs du tableau, mais c'est très moche comme technique.

    Si tu veux les montrer aux autres utilisateurs, stocke ces valeurs dans des cellules
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Set myWkb = ThisWorkbook
    myWkb.Worksheets("Feuil1").Activate
    For i = 1 To 4
        For j = 1 To 10
           Range("A" & i).Offset(0, j - 1).Value = tableau(i, j)
        Next
    Next
    Voila ! J'espère qu'avec cet exemple tu comprends un peu mieux les tableaux.
    Et surtout, garde à l'esprit que les tableaux sont là pour stocker des données. Et est-ce vraiment utile d'afficher les étapes intermédiaires?

    Slooby.

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

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

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

    et avec un peu de lecturehttp://silkyroad.developpez.com/vba/tableaux/

    en lisant cet article, je suis devenu tableauvore

  6. #6
    Invité
    Invité(e)
    Par défaut
    @Slooby: je te remercie beaucoup pour ton exemple, mais ça ne m'avance pas beaucoup. Je n'ai pas compris comment mettre des colonnes non adjacentes dans un tableau. comme je l'avais souligné dans mon premier post, j'ai une macro qui me fait des calculs avec plusieurs conditions basée sur des Autofiltres.
    ayant, lu sur le forum qu'on pouvait effectuer des calculs avec les tableaux, je m'y intéresse de plus en plus. Le but final est un tableau de synthèse.

    @casefayere: merci pour le lien, c'est grâce à ce document que je suis parvenu à faire le code du post#1. J'ai transféré les colonnes concernées sur une feuille excel en utilisant les tableaux. Conclusion, je n'ai pas compris comment effectuer le transfert de certaines colonnes dans un tableau.

    En vous remerciant.

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 128
    Points : 188
    Points
    188
    Par défaut
    @cathodique:
    Tu veux récupérer un tableau de synthèse, mais dans quel but ?
    Tu veux pouvoir faire des opérations sur les valeurs de ton tableau ou tu veux juste afficher les valeurs du tableau dans une feuille excel ?

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    Bonjour, bonjour !

    La première question à se poser : la variable tableau on en fait quoi ?!
    C'est à dire par exemple après manipulation, les données doivent-elles retourner à leur emplacement d'origine ?
    Dans un tel cas, c'est alors vraiment idiot de vouloir utiliser une matrice inférieure à l'originale ‼

    Sans des tenants & aboutissants concrets, il est vain de conseiller une voie ou une autre !
    Le B-A-BA, ces tutoriels :

    Utiliser les variables tableau en VBA Excel

    Conceptualisation des variables tableau en VBA

    Les parcourir ne suffit pas, il faut s'entraîner soi-même et vérifier la structure d'une variable tableau
    dans la fenêtre des Variables locales

    Déjà sais-tu au moins récupérer un bloc contigu de cellules (par exemple les colonnes 3 à 11) ?
    Pas besoin de dimensionner la variable tableau en lui affectant directement les valeurs de la plage de cellules,

    par exemple depuis la cellule du coin supérieur gauche via .CurrentRegion.Value

    Tout est dans les tutoriels mais surtout dans l'aide VBA intégrée ! …

    Ensuite soit redimensionner la variable tableau de deux colonnes supplémentaires puis se cogner une boucle
    pour alimenter les données supplémentaires dans la variable tableau,
    soit affecter directement deux nouvelles variables tableau comme la première pour chaque colonne isolée …


  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 931
    Points : 28 926
    Points
    28 926
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour transférer certaines colonnes d'un tableau (variable dimensionnée) vers un autre, tu peux utiliser le Select Case (Lignes 16 & 17 de l'exemple)
    Petit exemple d'une plage de données de plusieurs colonnes et plusieurs lignes dont on transfert les colonnes 2, 3 et 5 des lignes dont la valeur de la colonne 4 est égal à "F"
    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
    Sub ShowTable()
     Dim TblSource(), tblTarget(), Row As Long, Column As Integer, CountRow As Long, CountColumn As Integer
     Dim txt As String
     TblSource = shtSource.Range("A1").CurrentRegion
     CountRow = CountRow + 1: ReDim Preserve tblTarget(1 To 3, 1 To CountRow)
     ' Titre
     tblTarget(1, 1) = TblSource(1, 2)
     tblTarget(2, 1) = TblSource(1, 3)
     tblTarget(3, 1) = TblSource(1, 5)
     '
     For Row = 2 To UBound(TblSource)
      If TblSource(Row, 4) = "F" Then
       CountRow = CountRow + 1: ReDim Preserve tblTarget(1 To 3, 1 To CountRow)
       CountColumn = 0
       For Column = 1 To UBound(TblSource, 2)
        Select Case Column
         Case 2, 3, 5 ' Copie les colonnes 2, 3 et 5
          CountColumn = CountColumn + 1: tblTarget(CountColumn, CountRow) = TblSource(Row, Column)
        End Select
       Next Column
      End If
     Next Row
     ' Affichage dans une variable txt par MsgBox des lignes filitrées
     For Row = 1 To UBound(tblTarget, 2)
      For Column = 1 To UBound(tblTarget, 1)
       txt = txt & tblTarget(Column, Row) & vbTab
      Next Column
      txt = txt & vbCrLf
     Next Row
     MsgBox txt
     ' Exportation
     With shtTarget
     .Range(.Cells(1, 1), .Cells(UBound(tblTarget, 2), UBound(tblTarget, 1))) = Application.Transpose(tblTarget)
     End With
    End Sub
    Ceci écrit, c'est plus simple et pratiquement aussi rapide de passer par le filtre élaboré d'excel
    Les feuilles sont appelées par leur CodeName (shtSource & shtTarget)

  10. #10
    Invité
    Invité(e)
    Par défaut
    @ Slooby: C'est pour faire des calculs en mémoires et présenter les résultats sur une feuille. C'est ce que je parviens à faire autrement. C'est juste que j'avais lu que l'on pouvait effectuer des calculs en utilisant les tableaux et que l’exécution était plus rapide.

    @Marc-L:
    Dans un tel cas, c'est alors vraiment idiot de vouloir utiliser une matrice inférieure à l'originale ‼
    Tu as peut-être raison, ne maitrisant pas les tableaux. Mais mon tableau (BD) compte 27 colonnes.
    Dois-je toutes les prendre? Je serai plus idiot de tout prendre, sachant que les données qui m’intéressent sont des colonnes connues.

    @Philippe Tulliez: je te remercie pour ton exemple. je pense que le "select" va me sortir d'affaire.

    Mais je pense m'arrêter là. Ma macro fonctionne très bien. je me donne le temps d'assimiler les tableaux.

    Je vous remercie beaucoup.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/02/2021, 10h49
  2. Copier une partie d'un tableau dans un autre tableau
    Par sdecorme dans le forum MATLAB
    Réponses: 9
    Dernier message: 23/08/2013, 10h36
  3. récupération de variables d'un tableau dans 1 autre tableau
    Par deneb92 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/12/2010, 13h19
  4. passer un tableau dans un autre tableau
    Par lrgtk dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 07/09/2010, 19h11
  5. création de tableau dans un autre tableau
    Par freestyler dans le forum Delphi
    Réponses: 2
    Dernier message: 02/11/2006, 08h54

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