Résolu Tableau Excel automatisé avec VBA

  • Auteur de la discussion mariecaro
  • Date de début

mariecaro

Nouveau membre
Bonjour à tous,

Je dois créer une macro permettant de créer un tableau, à partir d'un premier tableau.
Je rencontre quelques difficultés et faute de solution (et de personne pour m'aider!), je me tourne vers ce forum. Je remercie d'avance toutes les personnes qui pourront jeter un coup d'oeil à mon problème ! :)

Sur une première feuille excel appelée "Données", j'ai un tableau :
Il y a trois lignes : métier 1, métier 2, métier 3,
J'ai 5 colonnes correspondant à cinq périodes différentes. dans chacune de ces colonnes figures des durées (par exemple, 4 jours, 2 jour, 1 jours).
Sur une ligne juste au dessus figurent les jours cumulés (en reprenant le premier exemple : 4 jours, 6 jours, 7 jours).
Dans les cases figures des montants.

Dans ma deuxième feuille excel nommée "Final", je veux créer un tableau presque pareil que le premier.
Néanmoins, je souhaiterais avoir une colonne par jour et non une colonne par durée comme c'était le cas précédemment.
De plus, j'aurais aimé que les montants qui figurent dans ma première feuille excel soit divisés par le nombre de jours correspondants.

C'est un peu compliqué je vous l'accorde... J'ai créé mon document avec cet exemple, et dans la page final j'ai tapé manuellement le rendu que je souhaite. Je l'ai ajouté en PJ, ce sera sans doute plus simple pour vous !

J'ai écris une première macro. Je débute vraiment en VBA, et rien ne fonctionne ! Rien ne s'affiche, je ne sais pas du tout comment faire...
Je pense que mon raisonnement est correct, mais je suppose que j'ai dû me tromper dans la formulation...

Voici ma macro :

Code:
Public Sub Synthèse()

Dim n As Integer
Dim i As Integer
Dim j As Integer

For n = 2 To 5
'n correspond au nombre de périodes


For j = Sheet("Données").Cells(1, n).Value - Sheet("Données").Cells(2, n).Value + 1 To Sheet("Données").Cells(2, n).Value
'ce qui me donne pour ma première boucle for j=1 To 4,
'pour la seconde colonne : For j=3 To 6 etc... (c'est le T0 de la période)
'j correspond au nombre de colonnes

For i = 3 To 5
'i correspond au nombre de ligne, j'ai 3 postes donc 3 lignes (L3, L4 et L5)

Sheet("Final").Cells(i, j + 1).Value = Sheet("Données").Cells(i + 1, n).Value / Sheet("Données").Cells(2, n).Value

Next i
Next j
Next n

End Sub

Peut être que c'est ma formulation "Sheet("nom de la feuille").Cells(i,j).Value qui est fausse ?

Bref, je suis complètement bloquée pour le moment...
Un grand merci à ceux ou celles qui pourront m'aider !

marie
 

drul

Obscur pro du hardware
Staff
Salut Marie,
un premier indice: Remplace: sheet("données") par sheets("données")

Ensuite, stp utilise la balise "code=vb" et "/code" entre [ ] pour publier ton code

P.S. évite tous les accents dans ton code, ça t'évitera des surprises ...
 

mariecaro

Nouveau membre
Bonjour Drul,
Je te remercie de ta réponse.
J'avais lu qu'il fallait écrire
Code:
 avant et après d'écrire le code mais pas "code=vb" et "/code" entr [], je ferai attention dorénavant ! :)
Merci beaucoup pour le s, je venais effectivement de le remarquer ! Le code fonctionne mieux : les quatre premières colonnes s'affichent, soient celles de ma période 1, mais pas les suivantes !
Je vais y réfléchir à nouveau...
je te remercie également pour ton conseil sur les accents !
 

zeb

Modérateur
Salut,

Drul, demande à Marie d'utiliser Worksheets à la place de Sheets.

:whistle:
 

drul

Obscur pro du hardware
Staff
Tiens, tu m'intéresses, c'est quoi la différence exactement ?
 

zeb

Modérateur
Worksheets est la collection des onglets de type Worksheet, comme Charts est la collection des onglets de type Chart. (Existent d'autres types d'onglets, les DialogSheets, et deux sortes de feuilles de macros datant d'Excel 4.0)

Sheets est la collection regroupant tous ces onglets.

Dans la plupart des cas, il n'est pas indispensable d'être précis.
Perso, comme j'aime particulièrement itérer parmi les objets avec des For Each.. par exemple, je me garde de tomber sur des surprises en ne jamais utilisant cette collection.

C'est aussi parce que sur ce forum nous avons à faire la plupart du temps à des débutants. Et qu'il vaut mieux fixer de bonnes habitudes dès le début. Car bien sûr, j'espère que pour MarieCaro, ce n'est qu'un début ;)
 

zeb

Modérateur
MarieCaro,

Ajoute ce code :
Code:
Debug.Print "Données(1," & n & ")"; Sheet("Données").Cells(1, n).Value, _
            "Données(2," & n & ")"; Sheet("Données").Cells(2, n).Value,

... juste avant cette ligne :

Code:
For j =

Et exécute ta fonction. Ouvre ton éditeur VBA/Excel, et examine le contenu de la fenêtre d'exécution.
Alors ?
 

zeb

Modérateur
MarieCaro,

Ajoute ce code :
Code:
Debug.Print "Données(1," & n & ")"; Sheet("Données").Cells(1, n).Value, _
            "Données(2," & n & ")"; Sheet("Données").Cells(2, n).Value,

... juste avant cette ligne :

Code:
For j =

Et exécute ta fonction. Ouvre ton éditeur VBA/Excel, et examine le contenu de la fenêtre d'exécution.
Alors ?
 

mariecaro

Nouveau membre
Meilleure réponse
Bonjour à tous,
Merci pour vos réponses et explications, et désolée du retard de la mienne !
Merci Zeb pour tes conseils, c'est vrai qu'il vaut mieux être le plus précis possible et avoir un code "propre" pour éviter les mauvaises surprises !

Voici le code final, pour ceux à qui cela pourrait être utile... :

Code:
Option Explicit
Public Sub Synthèse()
Dim WsS As Worksheet, WsC As Worksheet
Dim DerColS As Integer, NoColC As Integer, ColS As Integer, NoInit As Integer, NbColC As Integer, N As Integer
Dim LigneC As Long
Dim Montant As Double
    Set WsS = Worksheets("Données") 'Feuille Source
    Set WsC = Worksheets("Final") 'Feuille Cible
    DerColS = WsS.Cells(2, Columns.Count).End(xlToLeft).Column 'Dernière colonne renseignée
    NoColC = 1 'Initialisation du numéro de colonne
    For ColS = 2 To DerColS 'On balaye chaque colonne de données de la feuille Source
        NbColC = WsS.Cells(2, ColS).Value 'On relève le nombre de colonnes à renseigner dans la _
        feuille Cible (équivalent au nombre de jours pour une période donnée)
        If NbColC > 0 Then 'Si le nombre de jour est supérieur à zéro
            For N = 1 To NbColC 'On renseigne les colonnes de la feuille Cible
                NoColC = NoColC + 1 'On renseigne les colonnes de la feuille Cible
                WsC.Cells(1, NoColC).Value = NoColC - 1 'N° d'ordre du jour
                For LigneC = 2 To 4 'On renseigne les 3 lignes de poste dans la feuille Cible
                    Montant = WsS.Cells(LigneC + 1, ColS) / NbColC 'On calcule le montant
                    WsC.Cells(LigneC, NoColC).Value = Montant 'On renseigne le montant
                Next LigneC
            Next N
        End If
    Next ColS
End Sub

Merci encore et à bientôt !
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 718 045
Membres
1 586 389
Dernier membre
ROCKET8
Partager cette page
Haut