VBA_EXCEL 2003 somme nb colonne variable

Résolu/Fermé
Tusp - 6 juin 2011 à 11:02
 Tusp - 8 juin 2011 à 15:25
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

ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
6 juin 2011 à 14:07
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
0
Ctesias Messages postés 724 Date d'inscription lundi 16 mai 2011 Statut Membre Dernière intervention 1 décembre 2011 36
6 juin 2011 à 14:09
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?
0
Ctesias Messages postés 724 Date d'inscription lundi 16 mai 2011 Statut Membre Dernière intervention 1 décembre 2011 36
Modifié par Ctesias le 6/06/2011 à 14:25
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
0
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ctesias Messages postés 724 Date d'inscription lundi 16 mai 2011 Statut Membre Dernière intervention 1 décembre 2011 36
6 juin 2011 à 14:37
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
0
merci Ctesias
0
Ctesias Messages postés 724 Date d'inscription lundi 16 mai 2011 Statut Membre Dernière intervention 1 décembre 2011 36
6 juin 2011 à 15:04
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 ;)
0
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
0
Ctesias Messages postés 724 Date d'inscription lundi 16 mai 2011 Statut Membre Dernière intervention 1 décembre 2011 36
6 juin 2011 à 15:09
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 =)
0
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.
0
Ctesias Messages postés 724 Date d'inscription lundi 16 mai 2011 Statut Membre Dernière intervention 1 décembre 2011 36
6 juin 2011 à 15:18
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 ;).
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
Modifié par ccm81 le 6/06/2011 à 16:16
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
0
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)
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
6 juin 2011 à 16:37
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
0
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 :)
0
Merci à vous, j'ai réussi à comprendre ce code et même à l'adapter pour d'autres classeurs
0