XL 2016 Copier un nombre de lignes variables autant de fois qu'un nombre de colonnes variables

Sonia P.

XLDnaute Nouveau
Bonjour,

Je débute totalement en VBA et macro afin de trouver des solutions pour intégrer des données dans notre logiciel comptable à partir d'extractions de ventes de nos clients, issues de logiciels de facturation divers.

Mon objectif est de comprendre ce que je fais car il faudra que je fabrique des macros pour chaque extraction différente issue des logiciels de nos clients. Je pars vraiment de 0, je sais tout juste enregistrer des macros simples sans connaître du tout le langage VBA.

Je vous joins le fichier avec en onglet un, les données de base, en onglet 2 les codes comptables et en onglet 3 et ce à quoi je voudrais aboutir automatiquement.
Le nombre de lignes sera variable.
Le nombre de colonnes également : il pourra y avoir de nouvelles colonnes et il faudra alors que je complète le tableau avec les numéros de comptes.
Il faudra donc copier toutes les lignes autant de fois qu'il y aura de colonnes.

Merci pour votre aide.

Bonne fin de journée.
 

Pièces jointes

  • TEST.xlsx
    12.6 KB · Affichages: 0

cp4

XLDnaute Barbatruc
Bonjour,

Je débute totalement en VBA et macro afin de trouver des solutions pour intégrer des données dans notre logiciel comptable à partir d'extractions de ventes de nos clients, issues de logiciels de facturation divers.

Mon objectif est de comprendre ce que je fais car il faudra que je fabrique des macros pour chaque extraction différente issue des logiciels de nos clients. Je pars vraiment de 0, je sais tout juste enregistrer des macros simples sans connaître du tout le langage VBA.

Je vous joins le fichier avec en onglet un, les données de base, en onglet 2 les codes comptables et en onglet 3 et ce à quoi je voudrais aboutir automatiquement.
Le nombre de lignes sera variable.
Le nombre de colonnes également : il pourra y avoir de nouvelles colonnes et il faudra alors que je complète le tableau avec les numéros de comptes.
Il faudra donc copier toutes les lignes autant de fois qu'il y aura de colonnes.

Merci pour votre aide.

Bonne fin de journée.
Bonsoir,

Je n'ai pas compris ta demande. En effet, tu nous dis que tu voudrais obtenir les données de l'onglet 3 (Ecritures). Or, ces données n'ont aucun rapport avec les données de l'onglet 1 (Données). Il ne m'est pas possible de comprendre les tenants et aboutissants de ta demande.

Bonne soirée.
 

vgendron

XLDnaute Barbatruc
hello

voici un code à essayer
j'y ai mis tout un tas de commentaires pour expliquer les instructions
note: la colonne Total est mise à la fin de la feuille Ecritures, parce que je prend les colonnes les unes après les autres

VB:
Sub Ecritures()
'définition des variables
Dim TabDonnées() As Variant
Dim TabComptes() As Variant
Dim TabEcritures() As Variant

With Sheets("Ecritures") 'avec la feuille "Ecritures"
    .Cells.Clear 'on efface tout
End With

With Sheets("Données") 'avec la feuille "Données"
    Fin = .Range("A" & .Rows.Count).End(xlUp).Row 'on récupère le numéro de la dernière ligne de données
    TabDonnées = .Range("A1").Resize(Fin, 9).Value 'on met les 9 colonnes dans un tablo
End With

With Sheets("Comptes") 'avec la feuille "Comptes"
    Fin = .Range("A" & .Rows.Count).End(xlUp).Row 'on récupère le numéro de la dernière ligne de données
    TabComptes = .Range("A1").Resize(Fin, 3).Value 'on met les 3 colonnes dans un tablo
End With

'on calcule la taille finale du tablo de résultats
TailleFinale = (UBound(TabDonnées, 1) - 1) * (UBound(TabComptes, 1) - 1) 'nombre de ligne de données * nombre de lignes de compte (-1 pour enlever les entetes)
ReDim TabEcritures(1 To TailleFinale, 1 To 6) 'on crée le tablo final qui contiendra TailleFinale lignes et 6 colonnes

For j = 4 To UBound(TabDonnées, 2) 'pour chaque colonne de données à partir de la colonne 4
    For indcomptes = LBound(TabComptes, 1) To UBound(TabComptes, 1) 'on cherche le numéro de compte, et le type débit crédit dans le tablo comptes
        If TabComptes(indcomptes, 1) = TabDonnées(1, j) Then
            NumCompte = TabComptes(indcomptes, 2) 'on récupère le numéro de la facture
            DebitCredit = TabComptes(indcomptes, 3) 'on prend le type Débit ou Crédit ==> qui permettra de savoir dans quelle colonne (5 ou 6) mettre le montant
            Exit For 'on quitte la boucle: pas besoin de la terminer puisqu'on a l'info cherchée
        End If
    Next indcomptes
            

    For i = LBound(TabDonnées, 1) + 1 To UBound(TabDonnées, 1) 'pour chaque ligne de données (on commence à +1 pour ignorer la ligne d'entete)
        'i - 1 + (j - 4) * (UBound(TabDonnées, 1) - 1)petit compteur qui permet de se placer sur la bonne ligne du tablo final en fonction de i, j et nombre de lignes de données
        TabEcritures(i - 1 + (j - 4) * (UBound(TabDonnées, 1) - 1), 1) = TabDonnées(i, 1) 'on met la date en colonne 1
        TabEcritures(i - 1 + (j - 4) * (UBound(TabDonnées, 1) - 1), 2) = NumCompte 'on met le numéro de Compte en colonne 2
        TabEcritures(i - 1 + (j - 4) * (UBound(TabDonnées, 1) - 1), 3) = TabDonnées(i, 2) 'on met le numéro de facture
        TabEcritures(i - 1 + (j - 4) * (UBound(TabDonnées, 1) - 1), 4) = TabDonnées(i, 3) 'on met le libellé
        If DebitCredit = "Débit" Then 'selon débit ou crédit, on met le montant en colonne 5 ou 6
            TabEcritures(i - 1 + (j - 4) * (UBound(TabDonnées, 1) - 1), 5) = TabDonnées(i, j)
        Else
            TabEcritures(i - 1 + (j - 4) * (UBound(TabDonnées, 1) - 1), 6) = TabDonnées(i, j)
        End If
        
    Next i
Next j

Sheets("Ecritures").Range("A1").Resize(UBound(TabEcritures, 1), UBound(TabEcritures, 2)) = TabEcritures 'on colle le résultat final dans la feuille de résultat

End Sub
 

Sonia P.

XLDnaute Nouveau
Bonsoir,

Je n'ai pas compris ta demande. En effet, tu nous dis que tu voudrais obtenir les données de l'onglet 3 (Ecritures). Or, ces données n'ont aucun rapport avec les données de l'onglet 1 (Données). Il ne m'est pas possible de comprendre les tenants et aboutissants de ta demande.

Bonne soirée.
Pardon. J'avais modifié le fichier pour cause de confidentialité... Boulette que je suis.
 

Sonia P.

XLDnaute Nouveau
hello

voici un code à essayer
j'y ai mis tout un tas de commentaires pour expliquer les instructions
note: la colonne Total est mise à la fin de la feuille Ecritures, parce que je prend les colonnes les unes après les autres

VB:
Sub Ecritures()
'définition des variables
Dim TabDonnées() As Variant
Dim TabComptes() As Variant
Dim TabEcritures() As Variant

With Sheets("Ecritures") 'avec la feuille "Ecritures"
    .Cells.Clear 'on efface tout
End With

With Sheets("Données") 'avec la feuille "Données"
    Fin = .Range("A" & .Rows.Count).End(xlUp).Row 'on récupère le numéro de la dernière ligne de données
    TabDonnées = .Range("A1").Resize(Fin, 9).Value 'on met les 9 colonnes dans un tablo
End With

With Sheets("Comptes") 'avec la feuille "Comptes"
    Fin = .Range("A" & .Rows.Count).End(xlUp).Row 'on récupère le numéro de la dernière ligne de données
    TabComptes = .Range("A1").Resize(Fin, 3).Value 'on met les 3 colonnes dans un tablo
End With

'on calcule la taille finale du tablo de résultats
TailleFinale = (UBound(TabDonnées, 1) - 1) * (UBound(TabComptes, 1) - 1) 'nombre de ligne de données * nombre de lignes de compte (-1 pour enlever les entetes)
ReDim TabEcritures(1 To TailleFinale, 1 To 6) 'on crée le tablo final qui contiendra TailleFinale lignes et 6 colonnes

For j = 4 To UBound(TabDonnées, 2) 'pour chaque colonne de données à partir de la colonne 4
    For indcomptes = LBound(TabComptes, 1) To UBound(TabComptes, 1) 'on cherche le numéro de compte, et le type débit crédit dans le tablo comptes
        If TabComptes(indcomptes, 1) = TabDonnées(1, j) Then
            NumCompte = TabComptes(indcomptes, 2) 'on récupère le numéro de la facture
            DebitCredit = TabComptes(indcomptes, 3) 'on prend le type Débit ou Crédit ==> qui permettra de savoir dans quelle colonne (5 ou 6) mettre le montant
            Exit For 'on quitte la boucle: pas besoin de la terminer puisqu'on a l'info cherchée
        End If
    Next indcomptes
           

    For i = LBound(TabDonnées, 1) + 1 To UBound(TabDonnées, 1) 'pour chaque ligne de données (on commence à +1 pour ignorer la ligne d'entete)
        'i - 1 + (j - 4) * (UBound(TabDonnées, 1) - 1)petit compteur qui permet de se placer sur la bonne ligne du tablo final en fonction de i, j et nombre de lignes de données
        TabEcritures(i - 1 + (j - 4) * (UBound(TabDonnées, 1) - 1), 1) = TabDonnées(i, 1) 'on met la date en colonne 1
        TabEcritures(i - 1 + (j - 4) * (UBound(TabDonnées, 1) - 1), 2) = NumCompte 'on met le numéro de Compte en colonne 2
        TabEcritures(i - 1 + (j - 4) * (UBound(TabDonnées, 1) - 1), 3) = TabDonnées(i, 2) 'on met le numéro de facture
        TabEcritures(i - 1 + (j - 4) * (UBound(TabDonnées, 1) - 1), 4) = TabDonnées(i, 3) 'on met le libellé
        If DebitCredit = "Débit" Then 'selon débit ou crédit, on met le montant en colonne 5 ou 6
            TabEcritures(i - 1 + (j - 4) * (UBound(TabDonnées, 1) - 1), 5) = TabDonnées(i, j)
        Else
            TabEcritures(i - 1 + (j - 4) * (UBound(TabDonnées, 1) - 1), 6) = TabDonnées(i, j)
        End If
       
    Next i
Next j

Sheets("Ecritures").Range("A1").Resize(UBound(TabEcritures, 1), UBound(TabEcritures, 2)) = TabEcritures 'on colle le résultat final dans la feuille de résultat

End Sub
Top ! Cela fonctionne parfaitement !

Je vais maintenant me pencher attentivement sur tout cela pour comprendre exactement ce que vous avez fait et être capable de l'adapter.

Merci mille fois !

Bonne journée.
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 886
Membres
101 830
dernier inscrit
sonia poulaert