cs_thunderbolt
Messages postés7Date d'inscriptionmardi 3 août 2004StatutMembreDernière intervention19 août 2009
-
30 janv. 2007 à 10:47
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 2011
-
31 janv. 2007 à 18:10
Bonjour,
Je fais appel à votre expérience pour résoudre mon souci qui est le suivant :
J'ai dans un répertoire c:\.....\test : 103 feuilles de calcul Excel ayant exactement la même structure.
Ils sont nommés de 001.xls à 103.xls.
Chacune de ces feuilles ne comporte qu'un onglet ayant le même nom que la feuille (feuille 001.xls, onglet 001, .....)
J'aurai besoin de récupérer dans chacunes d'entre elles la valeur de la
cellule D4, D10, E1 et de présenter sur une nouvelle feuille le
résultat sous la forme 1 ligne par feuille d'origine.
ex: feuille 001 valeur D4 valeur D10 valeur E1
J'ai bien écrit une formule de liaison externe, mais cela m'oblige à la modifier 103*4 soit 412 fois.
J'ai essayé en faisant une concaténation pour "reconstituer l'adresse
de la cellule source", mais alors ce n'est plus une liaison mais du
texte. (avec INDIRECT)
Y aurait-il une âme charitable qui aurait une syntaxe qui fonctionne sous excel 2000 ?
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 31 janv. 2007 à 03:48
salut,
la demande semble être en VBA (bien que mal classée, je vais modifier...)
en VB6, la lecture donnerait quelquechose dans ce goût là :
Option Explicit
Private Sub Form_Load()
Dim ExlObj As Object
Dim i As Integer
Dim aRet(1 To 103, 2) As String
Const PATH As String = "C:\BLABLA\test"
For i = 1 To 103
' ouvre
excel
Call OpenXlsDocument(ExlObj, PATH & Format$(i, "000") & ".xls")
aRet(i, 0) = CStr(ExlObj.range("D4").Value)
aRet(i, 1) = CStr(ExlObj.range("D10").Value)
aRet(i, 2) = CStr(ExlObj.range("E1").Value)
ExlObj.Close
Set ExlObj = Nothing
Next i
' il ne reste plus qu'à
enregistrer le tableau dans un nouveau document....
Unload Me
End Sub
'
Private Sub OpenXlsDocument(XLS As Object, sPath As String)
' l'objet est de type feuille excel (pas de référence librairie
à excel)
Set XLS = CreateObject("Excel.Application")
pas testé mais çà devrait coller. c'est un début en tout cas.
jète un oeil sur [www.codyx.org Codyx], çà peut t"insiper
++
PCPT [AFCK]
<hr size ="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 31 janv. 2007 à 16:09
Salut,
PCPT a bien travaillé, ça me facilite la tâche
Alors voici le code (qui devient allégé car en VBA, Excel est déjà ouvert, et les classeurs sont connus, pas besoins d'objets) :
Option Explicit
Private Sub Import_Donnees()
Dim i As Integer
Dim aRet(1 To 103, 2) As String
Const PATH As String = "C:\BLABLA\test"
Application.DisplayAlerts = False
For i = 1 To 103
' ouvre
excel
WorkBooks.Open(PATH & Format$(i, "000") & ".xls")
aRet(i, 0) = CStr(ActiveWorkBook.range("D4").Value)
aRet(i, 1) = CStr(ActiveWorkBook.range("D10").Value)
aRet(i, 2) = CStr(ActiveWorkBook.range("E1").Value)
ActiveWorkBook.Close False
Next i
' il ne reste plus qu'à
enregistrer le tableau dans un nouveau document....
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 31 janv. 2007 à 16:37
salut,
mortalino -> et pour l'enregistrement du tableau?
je ne l'ai pas fais non plus mais çà permettrait d'ajouter à codyx
et pour les feuilles, là il n'y en a qu'une par classeur mais s'il y en avait plusieurs, la 1 serait par défaut?
(je reconnais mes lacunes)
ps : tu as vu dans mon post, Unload n'est pas de la bonne couleur.. , à mettre de côté
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Vous n’avez pas trouvé la réponse que vous recherchez ?
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 31 janv. 2007 à 18:10
et pour l'enregistrement du tableau?
>> je fourni le code inverse plus bas (facile )
je ne l'ai pas fais non plus mais çà permettrait d'ajouter à codyx >> je sais pas, c'est assez particulier, dans le sens où tu stockes des valeurs de 3 cellules prédéfinis, de plusieurs classeurs bien spécifiques.
et pour les feuilles, là il n'y en a qu'une par classeur mais s'il y en avait plusieurs, la 1 serait par défaut? >> pas forcémment, si t'as plusieurs feuilles, celle qui s'affiche à l'ouverture est celle sur laquelle tu étais au dernier enregistrement
ps : tu as vu dans mon post, Unload n'est pas de la bonne couleur.. , à mettre de côté >> oui, bien vu, je l'enlève de la liste.
Code avec tableau :
Option Explicit
Private Sub Import_Donnees()
Dim i As Integer
Dim aRet(1 To 103, 2) As String
Const PATH As String = "C:\BLABLA\test"
Application.DisplayAlerts = False
For i = 1 To 103
' ouvre excel
Workbooks.Open (PATH & Format$(i, "000") & ".xls")
aRet(i, 0) = CStr(Range("D4").Value)
aRet(i, 1) = CStr(Range("D10").Value)
aRet(i, 2) = CStr(Range("E1").Value)
ActiveWorkbook.Close False
Next i
Workbooks.Add
For i = 1 To 103
Cells(i, 1).Value = aRet(i, 0)
Cells(i, 2).Value = aRet(i, 1)
Cells(i, 3).Value = aRet(i, 2)
Next i
Columns("A:C").EntireColumn.AutoFit
' a toi
de faire les encadrements
ActiveWorkbook.SaveAs PATH & "Tableau Recapitulatif.xls"
ActiveWorkbook.Close ' ferme le nouveau
classeur