VBA_EXCEL 2003 somme nb colonne variable [Résolu/Fermé]

Signaler
-
 Tusp -
Bonjour,

je débute en VBA, et pour mon stage je dois réaliser une macro.
Mon classeur est composé d'un nombre variable de feuilles identiques de recueil de données (nommées "recueil_" et un numéro) et possède une colonne bilan.
Le but de la macro est de récupérer les différentes colonnes bilan et de faire la somme de chaque ligne.
Je réussis à obtenir un résultat pour un nombre de feuille connu mais pas pour une nombre de feuille variable avec le code suivant (macro enregistrée)

Public Sub Bilan()

    Sheets("recueil_bilan").Select 'je sélectionne la feuille bilan
    Range("C4").Select 'je choisis ma case
    ActiveCell.FormulaR1C1 = "0" 'je remplis avec 0
    Selection.AutoFill Destination:=Range("C4:C11"), Type:=xlFillDefault
    Range("C4:C11").Select 'j'étire le contenu aux autres cellules
    Range("C14").Select
    ActiveCell.FormulaR1C1 = "0"
    Selection.AutoFill Destination:=Range("C14:C28"), Type:=xlFillDefault
    Range("C14:C28").Select
    Columns("C:C").Select 'je sélectionne une colonne
    Selection.Insert Shift:=xlToRight ' j'insère une colonne à gauche
    Sheets("recueil_1").Select ' je choisis ma feuille
    Range("H45:H69").Select 'je sélectionne mes cellules
    Selection.Copy 'je copie
    Sheets("recueil_bilan").Select 'je sélectionne ma feuille d'accueil
    Range("D4:D28").Select ' je sélectionne mes cellules d'accueil
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False 'je copie les valeurs
    Range("C4").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "0"
    Selection.AutoFill Destination:=Range("C4:C11"), Type:=xlFillDefault
    Range("C4:C11").Select
    Range("C14").Select
    ActiveCell.FormulaR1C1 = "0"
    Selection.AutoFill Destination:=Range("C14:C28"), Type:=xlFillDefault
    Range("C14:C28").Select
    Range("E4").Select
    ActiveCell.FormulaR1C1 = "=SUM(RC[-2]:RC[-1])"
    Selection.AutoFill Destination:=Range("E4:E11"), Type:=xlFillDefault
    Range("E4:E11").Select
    Range("E14").Select
    ActiveCell.FormulaR1C1 = "=SUM(RC[-2]:RC[-1])"
    Selection.AutoFill Destination:=Range("E14:E28"), Type:=xlFillDefault
    Range("E14:E28").Select
    Columns("C:C").Select
    Selection.Insert Shift:=xlToRight
    Range("C4").Select
    ActiveCell.FormulaR1C1 = "0"
    Selection.AutoFill Destination:=Range("C4:C11"), Type:=xlFillDefault
    Range("C4:C11").Select
    Range("C14").Select
    ActiveCell.FormulaR1C1 = "0"
    Selection.AutoFill Destination:=Range("C14:C28"), Type:=xlFillDefault
    Range("C14:C28").Select
    Sheets("recueil_2").Select
    Range("H45:H69").Select
    Selection.Copy
    Sheets("recueil_bilan").Select
    Range("D4:D28").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

End Sub


j'arrive aussi à copier les colonnes bilan avec un nombre variable de feuille mais là impossible de trouver comment faire la somme.

 Sheets("recueil_bilan").Select

n = Sheets.Count

For I = 1 To n - 3 'j'ai 3 feuilles sans bilan


    Range("C14:C28").Select
    Columns("C:C").Select 'je sélectionne une colonne
    Selection.Insert Shift:=xlToRight ' j'insère une colonne à gauche
    Sheets("recueil_" & I).Select ' je choisis ma feuille
    Range("H45:H69").Select 'je sélectionne mes cellules
    Selection.Copy 'je copie
    Sheets("recueil_bilan").Select 'je sélectionne ma feuille d'accueil
    Range("D4:D28").Select ' je sélectionne mes cellules d'accueil
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False 'je copie les valeurs
    Range("C4").Select
    Application.CutCopyMode = False
Next
End Sub


Si vous avez des idées pour m'aider pour cette macro et à rendre mes codes plus propres...

merci

Tusp

16 réponses

Messages postés
9197
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
25 janvier 2020
1 687
bonjour

ton code me parait assez confus et on doit pouvoir le simplifier pas mal
te serait il possible d'envoyer une partie de ton classeur (sans données confidentielles) sur cjoint.com ou cijoint.fr avec quelques feuilles recueil_xx et un début de la feuille bilan avec ce que tu veux exactement et ou tu veux faire ces bilans (tu copies le lien obtenu dans ton prochain post)
bonne suite
Messages postés
714
Date d'inscription
lundi 16 mai 2011
Statut
Membre
Dernière intervention
1 décembre 2011
35
Hum... J'ai une question. TU mes dans les somme que la longueur des colonnes ne verira jamais... Mais si tu rajoute une valeur en bas, ta macro ne marche plus non?
Messages postés
714
Date d'inscription
lundi 16 mai 2011
Statut
Membre
Dernière intervention
1 décembre 2011
35
Personnellement, j'aurais fait ca :

Dim ligne as integer 
Dim colonne as integer 


colonne = Cells(1 , column.Count).End(xltoleft).column 

For i = 1 to colonne 
ligne = Range(i).end(xlUp). Row 
Range("E" & i).Select 
ActiveCell.FormulaR1C1 = "=SUBTOTAL(5," & colonne & ":"& ligne & ")" 
Next

Il y a de forte chance que cela ne marche pas, mais je pense qu'il y a de l'idée pour réduire tout ton code. Inspire toi en
Bonjour,

j'ai mis un fichier "anonymisé" sur cijoint.fr: http://www.cijoint.fr/cjlink.php?file=cj201106/cijbnCWlNi.xls

pour ce qui est de la confusion de code c'est le moins que l'on puisse dire je ne connaissait même pas VBA (et à peine excel) avant ce stage :/ et la programmation ce n'est pas vraiment mon fort.

Dans le fichier la macro bilan fonctionne mais pas pour un nombre de feuille variable et la fonction TestBilan est un échec je n'arrive pas à écrire la fonction de somme :/

merci
Messages postés
714
Date d'inscription
lundi 16 mai 2011
Statut
Membre
Dernière intervention
1 décembre 2011
35
Sachant que tes feuilles ont tjrs le meme nom, etr que y'a juste un changement de numéro, rien de plus simple:
Dim feuille as integer

feuille = Sheets.count 'compte le nombre de feuilles

Puis:
For i = 1 to feuille
Sheets("recueuil_"& i).activate 
next

pour parcourir toutes les feuilles
Messages postés
714
Date d'inscription
lundi 16 mai 2011
Statut
Membre
Dernière intervention
1 décembre 2011
35
J'ai vu que ton code etait fait par une macro enregistrée.
Les macro enregistrée sont bien pour découvrir certaines choses, le problèmes, c'est qu'elles compliqueront énormement ton code, qui pourrait se rendre 4 à 5 fois plus court avec des boucles ;)
Au départ j'ai essayé de le faire manuellement et ça dépasse mes compétences donc j'ai essayé l'enregistrement de macro pour m'aider mais je n'y arrive toujours pas pour un nombre de feuille variable.
Effectivement je pense que ce que je fais pourrait-être beaucoup plus simple et propre mais avec mes maigres connaissances j'ai du mal
Messages postés
714
Date d'inscription
lundi 16 mai 2011
Statut
Membre
Dernière intervention
1 décembre 2011
35
Le probleme, c'est que je pense que tu ne te plonge pas assez dans le VBA, et qu'une bonne dose de tuto te serait favorable =)
Pas qu'une bonne dose :), seulement mon stage étant court et très dense (ce n'est pas un stage d'informatique donc mon apprentissage VBA n'est pas la priorité de mes tuteurs...) j'ai beau essayé de m'améliorer en 1 mois c'est durdur.
Messages postés
714
Date d'inscription
lundi 16 mai 2011
Statut
Membre
Dernière intervention
1 décembre 2011
35
Non non, rien de plus simple. VA deja sur le site du zero pour lire le tutuo une ou deux fois, ensuite, tu le laisse ouvert en fond, et voila :p. Tu fais qq recherches si besoin et zbim! t'as fini ;).
Messages postés
9197
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
25 janvier 2020
1 687
re

un début de réponse (le code est en module 4)

http://www.cijoint.fr/cjlink.php?file=cj201106/cijqAQ2jEG.xls

bonne suite
merci beaucoup ccm81,

je vais me plonger dans ce code afin de le comprendre (heureusement qu'il y a un module d'aide dans Microsoft visual basic)
Messages postés
9197
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
25 janvier 2020
1 687
re

j'ai essayé de commenter, mais il est possible que ça ne suffise pas
les noms en R (à la fin) se rapportent aux feuille recueil
les noms en B à la feuille bilan
si tu as besoin de plus d'explications, n'hésites pas

bonne suite
la nomenclature ça j'ai bien compris, c'est logique :). il me reste à me familiariser avec la Fonction InStr() et vbLf mais l'aide devrait m'aider :)
Merci à vous, j'ai réussi à comprendre ce code et même à l'adapter pour d'autres classeurs