Boucler une macro avec un Do While [Résolu]

leuenc03 5 Messages postés lundi 25 février 2008Date d'inscription 29 février 2008 Dernière intervention - 25 févr. 2008 à 12:48 - Dernière réponse : leuenc03 5 Messages postés lundi 25 février 2008Date d'inscription 29 février 2008 Dernière intervention
- 29 févr. 2008 à 14:51
Bonjour,

Je suis en train d'effectuer un travail de diplôme en comptabilité.

A cet effet j'ai besoin d'une macro en VBA qui me permettrait de créer une feuille de synthèse. Celle-ci sommerait par exemple, la plage de cellule C1:F50 des onglets que j'aurais choisi dans mon classeur, Pour indiquer à la macro mon choix, je pourrais par exemple écrire en excel sur ma page de synthèse dans la colonne A1, les noms d'onglets dont la plage doit être sommée.

Si quelqu'un pouvait m'aider, ca serait génial, en effet, j'ai demandé de l'aide à gauche à droite et on m'a donné la macro suivante, suivi d'un : "il te suffit maintenant de boucler le do while pour que ca marche pour une plage de cellule au lieu d'une seule cellule"

=> Qq'un sait-il COMMENT BOUCLER LE DO WHILE QUI SUIT?

Sur la feuille 7, saisir le nom des feuilles à somme.

Public Sub somme_MulitFeuille()
Dim NomFeuille(20) As String
Dim i, j As Integer
Dim Total As Single

i = 1
Sheets("Feuil7").Select
Range("A1").Select
Do While ActiveCell.Value <> ""
NomFeuille(i) = ActiveCell.Value
i = i + 1
ActiveCell.Offset(1, 0).Select
Loop

For j = 1 To i - 1
Total = Total + Sheets(NomFeuille(j)).Range("A1")
Next j

Sheets("Feuil7").Range("C1").Value = Total
End Sub

leuenc03
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
cs_MPi 3877 Messages postés mardi 19 mars 2002Date d'inscription 23 août 2018 Dernière intervention - 29 févr. 2008 à 10:35
3
Merci
Function Sommer(Ligne As Integer, Colonne As Integer, Tablo As Variant) As Double
    Dim I As Integer
   
    'Parcourir chaque feuille et additionner la cellule en cours si numériques
    For I = 0 To UBound(Tablo)
       If IsNumeric (Sheets(Tablo(I)).Cells(Ligne, Colonne)) Then _
            Sommer = Sommer + Sheets(Tablo(I)).Cells(Ligne, Colonne)
    Next
End Function

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI

Merci cs_MPi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 100 internautes ce mois-ci

Commenter la réponse de cs_MPi
cs_bultez 13619 Messages postés jeudi 13 février 2003Date d'inscription 15 octobre 2013 Dernière intervention - 25 févr. 2008 à 13:31
0
Merci
Bonjour,

Do {While | Until}

Répète un bloc d'instructions aussi longtemps qu'une condition est vraie (True)
ou jusqu'à ce qu'une condition devienne vraie (True).
Syntaxe
Do [{While | Until} condition]
[statements]
[Exit Do]
[statements]
Loop
Vous pouvez également utiliser la syntaxe suivante :
Do
[statements]
[Exit Do]
[statements]
Loop [{While | Until} condition]
La syntaxe de l'instruction Do Loop comprend les éléments suivants :
Élément    Description 
 condition    Facultatif. Expression numérique ou expression de chaîne vraie (True) ou fausse (False).
Si la valeur de condition est Null, elle est considérée comme fausse (False).
     statements    Une ou plusieurs instructions répétées tant que condition est True, ou jusqu'à
ce qu'elle le devienne.

bon... là c'est l'aide VB, pas celle de VBA, mais comme tu es
    dans le bar, où en général on pas plus, c'est déjà pas mal

<hr />                Cordialement            Bul         [mon Site]     [M'écrire]
Commenter la réponse de cs_bultez
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 25 févr. 2008 à 18:58
0
Merci
Déplacé sur vbfrance (doit être au moins le 10ème aujourd'hui...)

<hr />
-My Blog-
Commenter la réponse de cs_Bidou
cs_MPi 3877 Messages postés mardi 19 mars 2002Date d'inscription 23 août 2018 Dernière intervention - 25 févr. 2008 à 23:49
0
Merci
Qu'est-ce que tu entends par sommer la plage C1:F50 ?
Mettre un total en ligne 51 ou 52 de chaque colonne ? ou faire la somme de chaque cellule et inscrire le total ailleurs ?

Plutôt qu'écrire le nom des feuilles en A1, tu pourrais écrire ces noms
dans la colonne A

    Dim WS As Worksheet, Ligne As Long
    For Each WS In Worksheets
        If WS.Name <> "Feuil1" Then
            Ligne = Sheets("Feuil1").Cells(Rows.Count, "A").End(xlUp).Row + 1
            Sheets("Feuil1").Range("A" & Ligne) = WS.Name
        End If
    Next

Ensuite, tu pourrais entrer un caractère quelconque dans la colonne B si tu veux faire la somme de cette feuille. Il te reste à boucler la colonne B pour savoir où faire cette fameuse somme...
Ligne = Sheets("Feuil1").Cells(Rows.Count, "A").End(xlUp).Row
For i = 1 to Ligne
    If sheets(synthese").Range("B" & i) <> "" then
        'faire la somme de la feuille Range("A" & i)
    End If
Next

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Commenter la réponse de cs_MPi
leuenc03 5 Messages postés lundi 25 février 2008Date d'inscription 29 février 2008 Dernière intervention - 26 févr. 2008 à 08:52
0
Merci
en fait ce que je veux peux se résumer ainsi, en admettant que ma plage ne se compose que de 2 cellules, ce qui n'est pas le cas

J'ai une feuille 1 qui contient en A1 le chiffre7 et en A2 le chiffre 8
J'ai une feuille 2 qui contient en A1 le chiffre 3 et en A2 le chiffre 4
J'ai une feuille 3 qui contient en A1 le chiffre 5 et en A2 le chiffre 6
J'ai une feuille de synthèse sur laquelle j'aimerais que :
- quand j'écris quelquepart le chiffre 1 et 2 et que j'exécute la macro, cette feuille de synthèse me dise en A1 le chiffre 10 (7+3) et en A2 le chiffre 12 (8+4).
- quand j'écris quelquepart le chiffre 1 et 3 et que j'exécute la macro, cette feuille de synthèse me dise en A1 le chiffre 12 (7+5) et en A2 le chiffre 14 (8+6)
En fait les réponses pourraient tout aussi bien venir en B1 et B2 sur ma synthèse, laissant ainsi la colonne A libre pour y inscrire le n° des feuilles que je souhaite additionner

leuenc03
Commenter la réponse de leuenc03
cs_MPi 3877 Messages postés mardi 19 mars 2002Date d'inscription 23 août 2018 Dernière intervention - 26 févr. 2008 à 11:14
0
Merci
Disons que tu écris en A1 et A2 le nom de tes feuilles à sommer.
En B1, tu pourrais inscrire ceci
=MaSomme(A1:A2)

Dans un module, tu crées une fonction personnalisée comme ceci

Function MaSomme(Rng As Range) As Double
    Dim Cellule As Range
   
    For Each Cellule In Rng
        MaSomme = MaSomme + _
                Sheets(Cellule.Value).Cells(ActiveCell.Row, ActiveCell.Column)
    Next
End Function

Ça additionnera les valeurs en B1 de chaque feuille

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Commenter la réponse de cs_MPi
cs_MPi 3877 Messages postés mardi 19 mars 2002Date d'inscription 23 août 2018 Dernière intervention - 26 févr. 2008 à 23:46
0
Merci
Bon, mon exemple n'était pas très bon.
En fait, ça fonctionne si tu écris la fonction et que tu tapes ENTER, mais ça ne fonctionne pas bien si tu sélectionnes le coin droit en bas et que tu copies la formules. Il n'y a pas de recalcul qui se fait et ça donne rien de bon...

Voici comment je procéderais.
Mon exemple est fait à partir d'un classeur avec des noms de feuilles par défaut
Dans la feuille1, en A, écris les noms de feuilles que tu veux sommer (A1, A2, ...)
Dans les autres feuilles, mets des valeurs dans les cellules B1:F10

J'ai mis le code dans un module, mais ça devrait bien fonctionner si tu le mets dans le code de la Feuil1

Sub Départ()  ' Eh oui, c'est ici que ça démarre
    Dim Tablo() As String
    Dim I As Integer, J As Integer
    Dim nbLignes As Integer, Idx As Integer
   
    ReDim Tablo(0) 'initialise le tableau dynamique
   
'Charger un tableau avec les noms de feuilles à sommer
    'déterminer le nombre de lignes en A (noms des feuilles)
    nbLignes = Sheets("Feuil1").Cells(Rows.Count, "A").End(xlUp).Row
    'charge le tableau avec les noms de feuilles
    For I = 1 To nbLignes
        ReDim Preserve Tablo(Idx)
        Tablo(Idx) = Sheets("Feuil1").Range("A" & I)
        Idx = Idx + 1
    Next
   
    'Parcourir toutes les cellules d'une plage définie (disons B1:F10)
    For I = 1 To 10     '10 lignes  (1 à 10)
        For J = 2 To 6  '5 colonnes (B à F)
            Sheets("Feuil1").Cells(I, J) = Sommer(I, J, Tablo)  'appel de la Function
        Next
    Next
   
End Sub

Function Sommer(Ligne As Integer, Colonne As Integer, Tablo As Variant) As Double
    Dim I As Integer
   
    'Parcourir chaque feuille et additionner la cellule en cours
    For I = 0 To UBound(Tablo)
        Sommer = Sommer + Sheets(Tablo(I)).Cells(Ligne, Colonne)
    Next
End Function

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Commenter la réponse de cs_MPi
leuenc03 5 Messages postés lundi 25 février 2008Date d'inscription 29 février 2008 Dernière intervention - 28 févr. 2008 à 14:01
0
Merci
c'est méga!!! Excuse moi si je n'ai pas répond tout de suite, mais j'ai préféré tester ca sous toutes les coutures d'abord, ca répond exactement à ce que j'avais demandé et je peux déjà en faire quelque chose.

Cependant si on pouvait encore faire ce qui suit (point 1 et 2), ca mettrait la cerise sur le gateau

Mais je me demande si je ne devrais pas réouvrir un sujet pour cela, car on sort du cas "boucler avec un do while" depuis plusieurs messages déjà

1) Si par hasard j'ai du texte dans une cellule qui devrait être sommée, est-il possible de dire à la macro de ne simplement pas en tenir compte, plutôt qu'elle me dise qu'elle ne peut pas sommer du texte (que la fonction ne marche pas)?
Avec un genre... "if texte, ignore la cellule pour la somme"

2) En général je ne voudrais sommer que quelques feuilles, mais parfois il se peut que je souhaite en sommer beaucoup plus. Cela dit ces grosses sommations devrait toujours être sur des feuilles qui se suivent dans mon classeur. Plutôt que d'écrire chaque feuilles à la main, j'ai deux idées qui suivent ci-dessous. En réaliser une serait génial, réaliser les 2, serait le top.

Soit faire aussi une macro qui me permette de générer le nom de tous mes onglets sur une colonne afin de pouvoir copier ensuite une partie de cette liste dans la colonne A de mon classeur de base?

Soit faire une deuxième macro identique à celle que tu m'as fait, mais qu'au lieu d'inscrire le nom des feuille dans la colonne A, on puisse choisir dans une liste déroulante, la feuille à partir de laquelle sommer et dans une autre liste, la feuille jusqu'à laquelle on veut sommer.

En tout cas déjà 1000 x merci, ce que t'as fait m'aide beaucoup

leuenc03
Commenter la réponse de leuenc03
cs_MPi 3877 Messages postés mardi 19 mars 2002Date d'inscription 23 août 2018 Dernière intervention - 28 févr. 2008 à 23:13
0
Merci
pour le premier point, regarde la fonction IsNumeric(Valeur)
Si elle retourne vrai, c'est un nombre

pour le deuxième point, ça dépend quel méthode tu vas utiliser. Tu peux créer des listes de validation, utiliser des combobox de la barre d'outils Formulaire ou des combobox de la barre d'outils Visula Basic. Ces 3 méthodes seront différentes à coder...

Ce que tu pourrais faire aussi c'est inscrire tous les noms des feuilles dans un premier temps (en A). Il ne te resterait qu'à effacer ceux que tu ne veux pas considérer. Une simple boucle For Each Ws In ActiveWorkBook.WorkSheets suffirait. Tu peux trouver des exemples pour t'aider sur ce site...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Commenter la réponse de cs_MPi
leuenc03 5 Messages postés lundi 25 février 2008Date d'inscription 29 février 2008 Dernière intervention - 29 févr. 2008 à 10:27
0
Merci
Rebonjour

Alors concernant le point 1. J'ai regardé la fonction isnumeric, mais ca ne m'aide pas beaucoup, dans le sens où je ne sais pas comment l'intégrer dans la macro et fonction que tu m'as donné, vu mon niveau en VBA.


Ce que j'aimerais c'est intégrer la fonction isnumeric ou une autre dans ta macro avec un sub :-).

En effet ta macro+fonction marche bien, mais dans ma plage de cellule (B1:F10), j'ai par exemple, sur chaque feuille à additionner, en B2 et B3 du texte, ce qui fait que ta macro + fonction ne marche plus, en effet informatiquement parlant ce n'est pas logique d'additionner des cellules qui contiennent du texte !

Par conséquent, il faudrait compléter ta macro + fonction, afin que lorsque la fonction summer arrive sur des cellules contenant du texte, elle ignore l'addition de ces dernières et passe à l'addition des cellules suivantes qui contiennent des chiffres.

Concernant le point 2, je vais rouvrir un forum

leuenc03
Commenter la réponse de leuenc03
leuenc03 5 Messages postés lundi 25 février 2008Date d'inscription 29 février 2008 Dernière intervention - 29 févr. 2008 à 14:51
0
Merci
Merci, c'est super!

En plus du coup ca marche aussi pour les cellules qui disent erreur ou du genre

Quand au reste, j'ai trouvé une petite macro sur le même site

Ben voilà ce qui s'appelle une affaire résolue

Si je peux me rendre utile 1x...

leuenc03
Commenter la réponse de leuenc03

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.