VBA pour reporting automatique

Bonjour,

Je me permets aujourd'hui de solliciter votre aide car je bloque dans l'utilisation du VBA.

Je souhaite automatiser un reporting d'un fichier 1 vers un fichier 2. En temps normal, je pars d’une macro simple et je demande à une IA de créer une boucle mais cette fois ça ne fonctionne pas, c’est pour cela que je sollicite votre aide aujourd’hui. Je ne suis pas expert VBA et je ne sais pas coder, j’espère que vous saurez m’aiguiller.

J’ai deux fichiers, un fichier standard nommé « Fichier de base » et un fichier de destination qui s’appelle « Fichier de reporting ».

L’objectif est d’avoir un reporting automatique du fichier de base vers le fichier de destination via une macro VBA :

  1. Au déclenchement de la macro, la macro doit ouvrir le fichier qui s’appelle « Fichier de reporting » et compléter la date du jour en cellule A2 via la fonction aujourdhui() ;
  2. Après, il faut renvoyer la cellule C3 du fichier de base vers la cellule B2 du fichier de reporting ;
  3. Ensuite, il faut renvoyer la cellule C4 du fichier de base vers la cellule C2 du fichier de reporting ;
  4. Il faut ensuite renvoyer la cellule E5 du fichier de base vers la cellule D2 du fichier de reporting ;
  5. Après, ce sont les cellules E21, E22 et E23 qui sont respectivement renvoyés aux cellules E2, F2 et G2 du fichier de reporting ;
  6. L’objet sera ici d’insérer une boucle pour que la macro se répète sur les cellules A2, B2 et C2 du fichier de reporting mais qu’elle renvoit maintenant les données F5, F21, F22 et F23 désormais en ligne 3 du fichier de reporting ;
  7. Cette boucle devrait s’arrêter lorsqu’elle ne trouve plus de données à renvoyer en ligne 5 du fichier de base.
  8. Pour illustration :
image

9. À noter qu'une fois le reporting réalisé, il faudrait que la macro puisse prendre en compte qu'il faudra compléter le fichier de reporting à partir de la prochaine ligne vide pour ne pas écraser les données précédentes.

Bonjour,

Voici une prosition :

Sub reporting()
Dim base, formatage As Workbook
Dim feuille As Worksheet

    Workbooks.Open Filename:="C:\Users\jacqu\Desktop\fichier-de-reporting (2).xlsx"

    Set formatage = Workbooks("fichier-de-reporting (2).xlsx")
    Set base = Workbooks("fichierdebase.xlsm")
    Set feuille = Worksheets("Tabelle1")
    der = base.Worksheets("Tabelle1").Cells(5, Columns.Count).End(xlToLeft).Column

    For I = 5 To der

        With formatage
            With feuille
                .Range("A" & I - 3) = Date
                .Range("B" & I - 3) = base.Sheets("Tabelle1").Range("C3")
                .Range("C" & I - 3) = base.Sheets("Tabelle1").Range("C4")
                .Range("D" & I - 3) = base.Sheets("Tabelle1").Range("E5")
                .Range("E" & I - 3) = base.Sheets("Tabelle1").Cells(21, I)
                .Range("F" & I - 3) = base.Sheets("Tabelle1").Cells(22, I)
                .Range("G" & I - 3) = base.Sheets("Tabelle1").Cells(23, I)
            End With
        End With
    Next I

End Sub

Mais attention il faudra modifier la ligne d'appel du fichier reporting et les noms des fichiers car je les ai changés

Workbooks.Open Filename:="C:\Users\jacqu\Desktop\fichier-de-reporting (2).xlsx"

    Set formatage = Workbooks("fichier-de-reporting (2).xlsx")
    Set base = Workbooks("fichierdebase.xlsm")

A vous d'apdapter ces 3 lignes en fonction de vos données

Bonjour Jacky,

Merci pour votre réactivtié.

Cela semble fonctionner ! Par contre, en colonne D du fichier de reporting, j'ai toujours la même donnée qui ressort. Théoriquement, je devrais avoir le Client 1 en ligne 2, le Client 2 en ligne 3... (comme sur l'illustration que j'avais envoyé).

D'ailleurs, est-il possible de faire en sorte que la macro complète la première ligne vide pour ne pas écraser les enregistrements précédents ?

Autre petite question d'ordre pratique : est-il possible de ne pas nommer le fichier source dans le VBA ? Le fichier de reporting sera un fichier stable qui ne sera pas manipulé par des utilisateurs mais ce n'est pas le cas du fichier de base qui pourra revêtir un autre nom. L'idée est d'avoir un template avec un bouton qui vient compléter l'autre fichier, d'où l'intérêt ne pas le nommer dans la macro

Encore merci pour votre aide.

en effet, petite étourderie, il faut remplacer la ligne

.Range("D" & I - 3) = base.Sheets("Tabelle1").Range("E5")

par

.Range("D" & I - 3) = base.Sheets("Tabelle1").Cells(5,I)

je ne comprends pas très bien

D'ailleurs, est-il possible de faire en sorte que la macro complète la première ligne vide pour ne pas écraser les enregistrements précédents ?

car chaque fois que l'on utilise la macro les enregistrements précédents se réécrivent "sur eux même" (si je peux utiliser cette expression

est-il possible de ne pas nommer le fichier source dans le VBA ?

tu veux dire le fichier base et non reporting ?

Bonjour

Ci joint ma solution

A+ François

Ps il manque une colonne R3 sur le fichier reporting

Top, effectivement cela fonctionne mieux comme ça

En fait, il faudrait que la macro ne réécrive pas les enregistrements précédents et que cela complète chaque enregistrement à la suite de l'autre, désolé si ce n'est pas clair.

Le fichier de base effectivement, existe-t-il une commande standard qui permet de renvoyer au fichier en cours d'utilisation plutôt qu'un fichier nommé par exemple ?

En fait, il faudrait que la macro ne réécrive pas les enregistrements précédents et que cela complète chaque enregistrement à la suite de l'autre, désolé si ce n'est pas clair.

je ne vois en quoi cela peut gèner que les enregistrements se réécrivent sur eux mêmes. Dans le cas où il y en a de nouveau ils s'écriront à la suite

Le fichier de base effectivement, existe-t-il une commande standard qui permet de renvoyer au fichier en cours d'utilisation plutôt qu'un fichier nommé par exemple ?

je ne comprends pas très bien, désolé

Bonjour Fanfan,

Ps il manque une colonne R3 sur le fichier reporting

je ne vois pas ce que tu veux dire
Cordialement Jacky

Au début de la macro, on nomme les intitulés de fichier comme affiché ci-dessous :

 Set base = Workbooks("fichierdebase.xlsm")

Le fichier de base est un template qui sera utilisé par plusieurs userset qui aura naturellement des intitulés de fichier différents. Comment faire pour que la macro prenne en considération le fichier actuellement ouvert pour ne pas que cela bloque sur un potentiel mauvais intitulé ? Désolé, c'est un peu compliqué à expliquer.

OK, je n'avais pas percuté

Pour répondre à ta question il faudra donc au préalable définir le WorkBook "base" en fonction de l'utilisateur, c'est à dire ne lui permettre d'utiliser la macro que s'il détermine la variable base

Bonsoir,

Et voici ma proposition.

A voir la qualification des variables

J'ai imaginé que, si on met une date, c'est que l'on va ajouter des journées dans le classeur reporting donc quand on relance, on AJOUTE, des lignes au contenu antérieure.

A voir quand on remet à zéro ?

Merci de me dire si j'ai bien compris la demande.

Je vous souhaite un bonne année 2025.

Chris

Rechercher des sujets similaires à "vba reporting automatique"