VBA: simplification d'une procédure de calcul

J

Jean

Guest
Bonjour à tous

Je suis à la recherche de conseils et d'aide

Situation: Fichier source ("source.xls") avec plusieurs feuilles (plus de 100)
Fichier cible ("cible.xls") avec une feuille ("compilation")

Problématique: je veux effectuer le calcul de cellules B10 de chacunes des feuilles du fichier source et reporter le total dans la cellule B10 de la feuille "compilation" du fichier cible. Et ce, de la cellule B10 à B150.
J'ai besoin de connaitre le total pour chacune des cellules.

Avec l'aide de quelqu'un du forum ("nlportki") j'étais en mesure d'effectuer le calcul sur un range (ex. B10:B150).

J'ai adapté le code et je peux maintenant faire le calcul pour la cellule B10 mais je me demande comment je peux simplifier le code pour éviter de recopier la procédure pour toutes les cellules suivantes (B11 à B150).

Est-ce que je dois exploré une autre solution ?
Peut-être qu'un tableau serait plus approprié ? (mais je ne connais rien à ceux-ci) ?

Voici le code (de "nlportki" que j'ai adpaté) :

Private Sub CommandButton1_Click()
Dim WBSource As Workbook
Dim WBCible As Workbook
Dim Feuille As Integer
Dim RangeB10 As Range
Dim Somme As Integer
Dim Total As Integer

Set WBSource = Workbooks("Source.xls")
Set WBCible = Workbooks("Cible.xls")

WBSource.Activate
For Feuille = 1 To Sheets.Count
Set RangeB10 = Worksheets(Feuille).Range("B10")
Somme = Application.WorksheetFunction.Sum(RangeB10)
Total = Total + Somme
Next
Workbooks("Cible.xls").Worksheets("compilation").Range("B10").Value = Total

End Sub


Je vous remercie du temps que vous allez consacrer à mon problème.


Jean
 
M

michel

Guest
bonsoir Jean

si j'ai bien compris ta demande , tu peux essayer


Private Sub CommandButton1_Click()
Dim WBSource As Workbook, WBCible As Workbook
Dim Feuille As Byte, i As Byte
Dim Somme As Double

Set WBSource = Workbooks("Source.xls")
Set WBCible = Workbooks("Cible.xls")

For i = 10 To 150
For Feuille = 1 To WBSource.Sheets.Count
Somme = Somme + WBSource.Sheets(Feuille).Cells(i, 2)
Next Feuille
WBCible.Sheets(1).Cells(i, 2) = Somme'adapter la n° de la feuille Cible si necessaire
Somme = 0
Next i

End Sub


bonne soiree
MichelXld
 
J

Jean

Guest
Bonjour Michel et au Forum

J'ai encore une question (et oui), grâce à l'aide de Michel j'ai règlé un problème mais un autre est apparue.

Voici ce que je veux faire: adpater le code suivant afin que les résultats des calculs se copient dans une colonne différente à chaque fois. La première fois dans la colonne J et la seconde fois dans la colonne K et ainsi de suite jusqu'à la colonne S.

Mair rien à faire, j'ai toujours un message d'erreur


Private Sub CommandButton1_Click()
Dim WBSource As Workbook, WBCible As Workbook
Dim Feuille As Byte, i As Byte
Dim Somme As Double

Set WBSource = Workbooks("Source.xls")
Set WBCible = Workbooks("Cible.xls")

'*********modification****************
Dim c As Byte
Sheets(1).Range("S10").End(xlLeft).Column
c = ActiveCell.Column
'*************************************

For i = 10 To 150
For Feuille = 1 To WBSource.Sheets.Count
Somme = Somme + WBSource.Sheets(Feuille).Cells(i, 2)
Next Feuille
'**********ligne original**********
WBCible.Sheets(1).Cells(i, 2) = Somme
'*************linge modifié*******
WBCible.Sheets(1).Cells(i, c) = Somme
'******************************

Somme = 0
Next i
End Sub

enore une fois merci pour votre aide

Jean
 
S

salim

Guest
Bonjour Jean, Michel, et le Forum

Jean vu d'ici moi j'écrirai Sheets(1).Range("S10").End(xlToLeft).Column
et non pas Sheets(1).Range("S10").End(xlLeft).Column entre les deux ligne j'ai rajouter TO.

Voila j'espère que ça ira.

@+ Salim
 
S

salim

Guest
Bonjour Jean, Michel, et le Forum


Jean encore moi en y regardant encore une fois pas sûr je suis encore au stade bébé du VBA mais cette ligne c = ActiveCell.Column ne me semble pas bien écrite si je ne me trompe pas ActiveCell fait référence à un objet Range donc dans ce cas c as Byte " a mon avis pas bon " et
c = ActiveCell.Column sans le mot Set qui affecte une variable à un objet " a mon avis pas bon non plus " .
Mais à confirmer par un spécialiste parceque moi encore

child029.gif
en VBA.

@+ Salim
 
M

Michel_M

Guest
Bonjour Jean, Michel, salim

tout simplement peut-être que c n'est pas implémenté

WBCible.Sheets(1).Cells(i, c) = Somme

essaies:
WBCible.Sheets(1).Cells(i, c+i) = Somme

Amicalement
Michel

PS: "C" est bien un byte car .column renvoie un byte (ou peut-être un long malgré que byte soit logique (256)
xlleft est bon
 
J

Jean

Guest
Bonjour tout le monde

Merci pour votre aide mais le problème est encore présent.

Voici au complet le code avec les modifications que j'ai apporté selon les conseils du forum:

Private Sub CommandButton1_Click()
Dim WBSource As Workbook, WBCible As Workbook
Dim Feuille As Byte, i As Byte
Dim Somme As Double
Dim c As Byte

Set WBSource = Workbooks("source.xls")
Set WBCible = Workbooks("cible.xls")

Sheets("Feuil1").Range("S10").End(xlToLeft).Column
c = ActiveCell.Column

For i = 10 To 15
For Feuille = 1 To WBSource.Sheets.Count
Somme = Somme + WBSource.Sheets(Feuille).Cells(i, 2)
Next Feuille
WBCible.Sheets("Feuil1").Cells(i, c + 1) = Somme

Somme = 0
Next i
End Sub

Le message d'erreur se trouve au niveau de la ligne suivante:
Sheets("Feuil1").Range("S10").End(xlToLeft).Column
Et le message d'erreur est le suivant:
Erreur 438 : Propriété ou méthode non gré par cet objet

Je ne comprend pas pourquoi ?
J'attends vos suggestions et commentaires.
Et merci pour ceux qui prendront le tmeps de me répondre.

Jean
 
S

salim

Guest
Re bonjour tout le monde

D'abord mes excuse à Michel_M car le l'ai amputer d'une moitié de son nom dans mon denier post et je l'ai oublié dans mes salutations préssé de le remercier des explications . Alors Michel_M spécial dédicasse.
smiley_200.gif


Jean tu devrais peut être mettre select à la place de column moi ça risquerai de fonctionner.

@+ Salim
 
M

michel

Guest
bonsoir Salim , Michel et Jean

Jean , je ne comprends plus tres bien ce que tu cherches à faire , mais à tout hasard tu peux essayer :

Sub test()
Dim WBSource As Workbook, WBCible As Workbook
Dim Feuille As Byte, i As Byte
Dim Somme As Double

Set WBSource = Workbooks("source.xls")
Set WBCible = Workbooks("cible.xls")

For i = 10 To 15
For Feuille = 1 To WBSource.Sheets.Count
Somme = Somme + WBSource.Sheets(Feuille).Cells(i, 2)
Next Feuille
WBCible.Sheets("Feuil1").Cells(1, 9 + i) = Somme ' affichage des resultats dans la ligne 1 : à adapter

Somme = 0
Next i
End Sub


si cela ne reponds pas à ta demande , peux tu réexpliquer clairement ce que tu souhaites obtenir


boonne soiree
MichelXld
 
J

Jean

Guest
Bonjour Michel et tout ceux qui me donnent un coup de main et le reste du forum

Désolé Michel, je vais essayé d'être plus clair dans ma demande.

Fichier source: source.xls avec plusieurs feuilles
Fichier cible: clible.xls avec feuille ("Feuil1)

1- Je veux faire le calcul de toutes les cellules B10 de chacune des feuilles du fichier source.xls et copier le résultat dans la cellule B10 de la feuille "Feuil1" du fichier cible.xls. (ton code le fait).

2- Refaire la même chose pour les cellules B11, B12, ... B150 (ton code le fait).

3- Je voudrais lorsque je clique une autre fois sur le bouton contrôlant la macro que la procédure effectue le calcul de toutes les cellules B10 de chacune des feuilles du fichier source.xls et copier le résultat dans la cellule C10 de la feuille "Feuil1" du fichier cible.xls. (il faudrait que la colonne change à chaque fois que je clique sur le bouton).

Désolé Michel si je n'avais pas été assez clair.

C'est pourquoi j'essayais avec le code suivant de trouver la dernière colonne vide a partir de la colonne S de la ligne numéro 10.

Sheets("Feuil1").Range("S10").End(xlToLeft).Column
c = ActiveCell.Column

Mais j'ai le message d'erreur suivant:
Erreur 438 : Propriété ou méthode non gré par cet objet

Encore une fois merci.


Jean
 
J

Jean

Guest
Bonjour à tous

Je viens de trouver la solution
Juste après envoyer mon post j'ai fait d'autre test et bingo j'ai la solution

Private Sub CommandButton1_Click()
Dim WBSource As Workbook, WBCible As Workbook
Dim Feuille As Byte, i As Byte
Dim Somme As Double
Dim c As Byte

Set WBSource = Workbooks("source.xls")
Set WBCible = Workbooks("cible.xls")

'Sheets("Feuil1").Range("S10").End(xlToLeft).Column
Sheets("Feuil1").Range("S10").Select
'ActiveCell.End (xlToLeft)
ActiveCell.End(xlToLeft).Select
c = ActiveCell.Column

For i = 10 To 15
For Feuille = 1 To WBSource.Sheets.Count
Somme = Somme + WBSource.Sheets(Feuille).Cells(i, 2)
Next Feuille
WBCible.Sheets("Feuil1").Cells(i, c + 1) = Somme
Somme = 0
Next i
End Sub


Encore une fois merci à tout le monde.


Jean
 
J

Jean

Guest
Re-bonjour à tous (Salim, MichelXLD et Michel_M) et au forum

Cent fois sur le métier recommencer votre ouvrage ...

Le problèmes sont fait pour être solutionnés ...

J'avais donc règler mon problème mais voilà que je décide d'augmenter le niveau de diffuculté !!!

Situation: j'effectue le calcul de toutes les cellules B10 de toutes les feuilles du fichier sources.xls et reporte le total dans la feuille 1 du fichier cible.xls. Et ainsi de suite pour les différentes cellules jusqu'à B150. Le bouton qui lance la macro se trouve dans la feuille 1 du fichier cible.xls.

Problème: placer seulement le bouton qui lance la macro sur la feuille ("Feuil2") du fichier cilbe.xls sans rien changer dans le reste.

Hypothèse de solution: dans le code changer les références à la feuille ("Feuil1") par ("Feuil2"). J'ai essayé mais j'ai un message d'erreur ?
Est-ce que quelqu'un à une solution.

Je vous remercie pour vos conseils

Procédure:
Private Sub CommandButton1_Click()
Dim WBSource As Workbook, WBCible As Workbook
Dim Feuille As Byte, i As Byte
Dim Somme As Double
Dim c As Byte
Set WBSource = Workbooks("source.xls")
Set WBCible = Workbooks("cible.xls")

Sheets("Feuil1").Range("S10").Select

ActiveCell.End(xlToLeft).Select
c = ActiveCell.Column
For i = 10 To 150
For Feuille = 1 To WBSource.Sheets.Count
Somme = Somme + WBSource.Sheets(Feuille).Cells(i, 2)
Next Feuille

WBCible.Sheets("Feuil1").Cells(i, c + 1) = Somme

Somme = 0
Next i
End Sub


Merci et bonne journée

Jean
 

Discussions similaires

Réponses
6
Affichages
248
Réponses
1
Affichages
168

Statistiques des forums

Discussions
312 294
Messages
2 086 934
Membres
103 404
dernier inscrit
sultan87