HELP !!! comment faire la somme entre cellules de plusieurs classeurs ????

T

Thierry

Guest
Bonjour,

Besoin d'aide SVP.

Comment faire la somme de cellules entre environ 300 classeurs ???
Exemple: J'aimerai faire la somme des cellules A1 pour les 300 fichier xls.

Quelle est la meilleur solutioon ?
Est ce qu'il faut creer une formule VBA ?

Merci pour votre aide

Thierry
 
R

Roland

Guest
Salut Thierry

Je suis impressionné, c'est la première fois que je croise une application qui nécessite la gestion de 300 classeurs.

Si le nom de tes classeurs répond à une logique arithmétique je crois effectivement que le passage Par VBA simplifierais les choses grace à une boucle. Si ce n'est pas le cas on pourrait imaginer une feuille dans le classeur résultat avec la liste de tous les chemins et noms des classeurs et construire une boucle à partir de là.
Dit nos en plus
A+ Roland
 
R

Roland

Guest
Re Thierry
Si tu ranges tous les classeurs de données dans un répertoire dédié et ne contenant que ceux-ci on peut scruté succéssivement tous ceux-ci, mais il faut être sûr qu'il n'est ai pas d'autres classeurs que ceux désirés dans la somme.

A+ Roland
 
T

Thierry

Guest
Salut Roland,

Merci pour ta réponse !!
Le nom de mes classeurs répond à une logique arithmétique: 1.xls ... 300.xls.
Je crois aussi qu'il faut que je passe par VBA.
Par contre je suis en apprentissage du VBA !!!
Est ce que tu peux m'aider a faire cette fonction ?
Cette fonction doit faire la somme des cellules A1 pour les 300 classeurs (par exemple).

Merci encore,
Thierry
 
T

Talere

Guest
A taplace, j'envisagerais effectivement une solution VBA, et pour te permettre de ne pas forcément connaitre les nom des fichier xls, j'utiliserais la fonction dir(toto\*.xls) en prenant soin de mettre tous tes fichiers xl dans le repertoire tot...

en gros ton corps ressemblerais à ça :

somme=0
nom_fichier=dir(toto\*.xls)
do while nom_fichier<>""
set mon_fichier=Excel.workbooks.open "toto\" & nom_fichier
somme=somme+mon_fichier.sheets(1).cells(1,1)
nom_fichier=dir() '<- permet de prendre l'occurrence suivante
loop
 
M

michel

Guest
bonsoir Roland ,Thierry et Talere

Thierry ,jespere que la procedure ci joint pourra t'aider
les fichiers doivent etre nommés de 1 à X
dans l'exemple , la somme de tous les fichiers s'affiche dans la cellule A1 du classeur actif
je suis curieux de connaitre le temps de calcul nécéssaire pour 300 classeurs


Sub ChercheDansFichiers()
Dim X As Integer
Dim Direction As String
Dim Somme As Double

Application.ScreenUpdating = False
Direction = Dir("D:\dossier\general\excel\*.xls") ' à adapter

For X = 1 To 3 ' nombre et noms des fichiers à tester
With ActiveSheet.Range("A1")
.FormulaArray = "='" & "D:\dossier\general\excel" & "\[" & X & "]" & "Feuil1" & "'!" & "A1"
.Value = .Value
End With
Somme = Somme + Range("A1")
Next
Range("A1") = Somme
Application.ScreenUpdating = True

End Sub



bonne soirée
michel
lapin4.gif
 
T

Thierry

Guest
Merci a tous pour votre aide !!!!

Ci-dessous la fonction faite avec l'aide de Joao:

Public Sub CommandButton1_Click()
Application.ScreenUpdating = False '<- inhibe la fonction de rafraichissement de l'affichage dans excel (evite le clignotement de l'écran) et augmente aisni la rapidité de la fonction...

nbTotalParts = 0 '<- initialisation de la variable de retour

chemin = "toto\" '<- initialisation de la variable chemin donnant l'accès à ton repertoire ou sont les fichiers XL
nom = Dir(chemin & "*.xls") '<- la fonction dir(*.xls) te permet de trouver la 1ère occurrence de fichier xls et renvoi le nom du fichier s'il existe.

Do While nom <> "" '<- le do while te permettra de boucler tant qu'une occurrence de fichier xls est trouvé (quand il n'y en a plus, la fonction dir() renvoi "")
Set mon_fichier = Excel.Workbooks.Open(chemin & nom) '<- Tu ouvres l'occurrence trouvé ... ce fichier pointe sur un variable objet qui est "mon_fichier" (utile pour plus tard)
nbTotalParts = nbTotalParts + mon_fichier.Sheets(1).Cells(1, 1) '<- Tu recupère ta valeur désirée et tu l'additionne à la variable de retour ( tu peux faire autre chose avec ... )

nom = Dir() '<- tu rècupère l'occurrence suivante ...voir plus bas
mon_fichier.Close '<- tu ferme le fichier ouvert un peu plus haut.
Loop '<- tu repètes l'action autant de fois que de fichiers xls existe

Application.ScreenUpdating = True '<- reactive la fonction de rafraichissement de l'affichage dans excel

Excel.Workbooks("stats.xls").Sheets(1).Cells(8, 5) = nbTotalParts

End Sub

Pour traiter 400 classeurs, cela prend environ 5 min !!!
Je suis en train de voir pour ameliorer les performances !?

Merci à tous,

Bon week-end,
Thierry
 
C

coyote

Guest
OUPS...... j'y bossais mais je constate que certains ont bossé plus vite que moi avec des solutions quasi similaire

Toutefois çà coince à l'instruction suivante à la saisie du &

Workbooks.Open Filename:="C:\Mes documents\Classeur" & I & ".xls"

(erreur de compilation : attendu fin d'instruction)

Qui peut m'aider ?


MACRO INTEGRALE avec un test sur 3 classeurs

Sub Macro1()
'
' Macro1 Macro
' Macro enregistrée le 09/01/2004 par home
'

Dim xcumul_a1 As Long
xcumul_a1 = 0

Application.ScreenUpdating = False

For I = 1 To 3

Workbooks.Open Filename:="C:\Mes documents\Classeur" & I & ".xls"
Sheets("Feuil1").Select
xcumul_a1 = xcumul_a1 + Range("A1").Value
ActiveWorkbook.Close

Next I

MsgBox (xcumul_a1)

Application.ScreenUpdating = True
End Sub
 
R

Roland

Guest
Bonjour à tous pour Coyotte
J'ai essayé ton code
Workbooks.Open FileName:="c:\Mes documents\Keypress.xls"
il plantecar il ne reconait pas le raccourci Mes Documents ce qui me semble normal mais ce la ne génère d'erreur de compile.

Parcontre par rapport à ton code FileName le N est en majuscule et non pas en minuscule et c'est le VBA qu'il le fait (par habitude je tape toujours en minuscule et cele me permet de voir si VBA reconnait la fonction ou la variable en lui mettanr automatiquement les majuscules)
S'il ne le fait pas sur ton code c'est peut-être qu'il il y a confusion pour le système avec une variable déclarée par ailleurs. VBA n'aime pas les déclaration de fonctionou de variable utilisant les mots réservés.

je suis sous WXP Office97

Amicalement Roland
 
C

coyote

Guest
Merci Roland pour ton intervention

Sans générer la concaténation et en faisant appel qu'à un classeur. Il me cumule bien les valeurs A1 demandés (dans mon exemple 3 X fois le même nombre).

Pour les majuscules j'ai retapé la commande complète qu'en minuscule

workbooks.open filename:="c:\Mes documents\Keypress.xls"

et le cette commande est ajusté comme ceci

Workbooks.Open Filename:="c:\Mes documents\Keypress.xls"

pas de majuscule au N de Filename ?????

enfin ce n'est qu'à la concaténation qui merde avec le & qui n'est peut-être pas reconnu ou encore faut-il transcrire la variable I (numérique) en texte avant concaténation.......


Je bosse en W98SE et Excel 2000
Enfin je bricole
 
R

Roland

Guest
Re A tous

je viens de voir sur un autre fil une réponse de Juliette qui doit t'aider car elle n'ouvre pas les classeurs

MsgBox ExecuteExcel4Macro("'c:\VBA\Data\[Classeur1.xls]Feuil1'!R2C2")

renvoi la valeur de la cellule B2 du classeur concerné

attention à l'apostrophe devant ' " c:\
A+ Roland
 
R

Roland

Guest
Bon dimanche à tous

Comme souvent il y a plusieurs solutions à un même poblème. Dans ce cas il serait intéressant que Thierry, s'il en a le temps, teste la rapidité d'exécution entre les deux ou trois solutions d'accès aux classeurs. et qu'il nous en fasse part.
Ce n'est pas tous les jours que l'on croise 300 classeurs ..........

Amicalement Roland
 
T

Thierry

Guest
Bonjour à tous,

J'ai essayé les differentes solutions que vous m'avez proposées et il n'y a pas une grande différence de performance.

Sur un autre ordi, je traite les 300 classeurs en moins d'une minute, donc c'est vraiment géniale !!!!

Merci encore à vous tous pour votre aide,

A+
Thierry
 

Discussions similaires

Statistiques des forums

Discussions
313 137
Messages
2 095 626
Membres
106 306
dernier inscrit
kenshinro