Problème de récupération de données(cellules) dans une boucle

zaknaster

XLDnaute Nouveau
Bonjour à tous.

j'ai fait une macro excel 2007 qui vise à récupérer certaines cellules de plusieurs fichiers Excel et les copier dans le fichier Excel où est exécuté ma macro.

Code:
Sub CopyCell()
    Range("E1").Select
    Selection.Value = "Info 1"
    Range("F1").Select
    Selection.Value = "Info 2"
    Range("G1").Select
    Selection.Value = "Info 3"
 
    Dim X As Integer, nbFichiers As Integer, Y As Integer
    Dim Tableau() As String
    Dim Direction As String
 
    Application.ScreenUpdating = False
    Direction = Dir("C:\fichiers excel\*.xls")
 
    Do While Len(Direction) > 0
        nbFichiers = nbFichiers + 1
        ReDim Preserve Tableau(1 To nbFichiers)
        Tableau(nbFichiers) = Direction
        Direction = Dir()
    Loop
 
    If nbFichiers > 0 Then
        For X = 1 To nbFichiers
            If Tableau(X) <> ThisWorkbook.Name Then
                Y = Y + 1
                With ActiveSheet.Cells(Y, 1)
                
			.Range("E2").Formula = "='C:\fichiers excel\[" & Tableau(X) & "]Feuil1" & "'!" & "H85"
			.Range("F2").Formula = "='C:\fichiers excel\[" & Tableau(X) & "]Feuil1" & "'!" & "H74"
			.Range("G2").Formula = "='C:\fichiers excel\[" & Tableau(X) & "]Feuil1" & "'!" & "H89"
                End With
            End If
        Next X
    End If
    Application.ScreenUpdating = True
End Sub
Le problème, c'est que parmi tous les fichiers Excel, pour la même feuille, elles ne portent pas toutes le même nom. Dans le premier fichier la feuille qui m'intéresse peut s'appeler Feuil1 mais dans le second Feuil1_V2 par exemple.

Par rapport au code qui est ci dessus. Ca fonctionne si toutes les feuilles des fichiers portent le même nom. Lorsque qu'une feuille se nomme autrement, une sorte de "prompt" s'affiche et demande de sélectionner la bonne feuille à utiliser. Sauf qu'il ne le demande pas qu'une fois, il demande de sélectionner la feuille autant de fois qu'il y a de fichiers Excel x le nombre de colonne (Infos 1 / Infos 2 / Infos 3 ...). Autant dire que c'est pas pratique du tout. Car si on a 50 fichiers sur 100 qui portent pas le nom Feuil1, et qu'on a 30 colonnes, il va poser la question 50x30 fois pour savoir quelle est le nom de la feuille.

Comment faire en sorte qu'Excel ne pose la question que pour chaque fichier sans se préoccuper du nombre de colonne ?

Soit il faut changer le code tout le contenu de la boucle pour faire en sorte qu'il prenne toutes les cellules nécessaires a chaque fois qu'il traite un fichier. C'est à dire: récup H85, H74, H89 du fichier. (et pas fichier_feuille_H85 / fichier_feuille_H74 / fichier_feuille_H89)

Soit il faut faire en sorte d'enregistrer le réponse donnée au prompt pour chaque fichier ...

Désolé si j'ai été long, mais c'est necessaire de comprendre le fond du problème.


Avez vous une idée pour la solution ?
merci d'avance pour vos remarques.
 

zaknaster

XLDnaute Nouveau
Re : Problème de récupération de données(cellules) dans une boucle

bonjour

merci pour ton lien. Cependant, le sujet que tu me montre est très complexe, et puis il utilise les form ce qui est déjà beaucoup trop pour moi, novice que je suis :p

Normalement dans mon code. Il ne devrait y avoir qu'a changer cette partie:

Code:
.Range("E2").Formula = "='C:\fichiers excel\[" & Tableau(X) & "]Feuil1" & "'!" & "H85"
.Range("F2").Formula = "='C:\fichiers excel\[" & Tableau(X) & "]Feuil1" & "'!" & "H74"
.Range("G2").Formula = "='C:\fichiers excel\[" & Tableau(X) & "]Feuil1" & "'!" & "H89"

- Dans le tableau(X): les noms des fichiers (mettons qu'il y en a 4).
- Feuil1 : nom de la feuille par défaut dans les fichiers. Mais son nom peut changer, d'où la création de mon topic.
- H74 etc: les cellules à récupérer dans chaque fichier.

Ma macro fait actuellement: [correction edit : 17h24]
Dans le fichier 1, récupérer cellule 1 de la feuille Feuil1
Dans le fichier 2, récupérer cellule 1 de la feuille Feuil1
Dans le fichier 3, récupérer cellule 1 de la feuille Feuil1
Dans le fichier 4, récupérer cellule 1 de la feuille Feuil1
-
Dans le fichier 1, récupérer cellule 2 de la feuille Feuil1
Dans le fichier 2, récupérer cellule 2 de la feuille Feuil1
Dans le fichier 3, récupérer cellule 2 de la feuille Feuil1
Dans le fichier 4, récupérer cellule 2 de la feuille Feuil1
-
Dans le fichier 1, récupérer cellule 3 de la feuille Feuil1
Dans le fichier 2, récupérer cellule 3 de la feuille Feuil1
Dans le fichier 3, récupérer cellule 3 de la feuille Feuil1
Dans le fichier 4, récupérer cellule 3 de la feuille Feuil1
etc.

Le problème, c'est qu'il suffise que le nom de la feuille soit Feuil_V2 pour que ça complique énormément les choses. Si dans le fichier 3, la Feuil1 n'existe pas et se nomme Feuil1_V2, une fenetre apparait et demande de sélectionner la bonne feuille (mais il va le demander 4 fois, et 8 fois si on a le même probleme dans le fichier 4).

L'idée, serait de traiter ça différemment mais je n'y parviens pas. Par exemple:
Traiter la feuille Feuil1 du fichier 1 et récupérer les cellules 1, 2 et 3
Traiter la feuille Feuil1 du fichier 2 et récupérer les cellules 1, 2 et 3
Traiter la feuille Feuil1 du fichier 3 et récupérer les cellules 1, 2 et 3
Traiter la feuille Feuil1 du fichier 4 et récupérer les cellules 1, 2 et 3
etc.

Comme ça, la fenêtre ne demande qu'une seule fois le nom de la feuille pour un fichier (et non pas a chaque cellule).

merci, dites moi si je suis trop flou !
 
Dernière édition:
G

Guest

Guest
Re : Problème de récupération de données(cellules) dans une boucle

Re,

J'ai bien compris ton problème.
Mais au moins connais-tu le nom des feuilles pour tel classeur par avance?

Sinon, sans liste de feuille, je ne vois pas trop à part peut-être en essayant ceci:

Code:
      'Dans les déclarations
      Dim Formule as string 
      '.....Suite du code.....
            
            .Range("E2").Formula = "='D:\LUI\Developement\VB_VBA\Excel\Forum\[" & Tableau(X) & "]Feuil1" & "'!" & "H85"
            Formule = .Range("E2").Formula
            .Range("F2").Formula = Replace(Formule, "H85", "H74")
            .Range("G2").Formula = Replace(Formule, "H85", "H89")

ainsi il te demandera pour la première feuille non trouvée de choisir puis créera la formule et enfin remplacera l'adresse finale de cellule dans la formule nouvellement créée

Cela semble fonctionner chez moi.


A bientôt
 
Dernière modification par un modérateur:

zaknaster

XLDnaute Nouveau
Re : Problème de récupération de données(cellules) dans une boucle

Normalement, la feuille doit TOUT LE TEMPS s'appeller Feuil1, mais des fois elle est nommée autrement.

Et ce que tu m'as donné est parfait, je t'en remercie ! C'est exactement ce qu'il me fallait, sans que je change tout mon code.

Merci :)
 

zaknaster

XLDnaute Nouveau
Re : Problème de récupération de données(cellules) dans une boucle

Bonjour,

en effet, cette histoire de Replace m'a fait gagner un temps fou. Cependant, maintenant que ce système est en place, je ne parviens plus a faire des additions de cellules d'autres classeurs à mettre dans le classeur dans lequel on execute la macro.

plus haut, Hasco a posté:
Code:
      'Dans les déclarations
      Dim Formule as string 
      '.....Suite du code.....
            
            .Range("E2").Formula = "='D:\LUI\Developement\VB_VBA\Excel\Forum\[" & Tableau(X) & "]Feuil1" & "'!" & "H85"
            Formule = .Range("E2").Formula
            .Range("F2").Formula = Replace(Formule, "H85", "H74")
            .Range("G2").Formula = Replace(Formule, "H85", "H89")

Dans cet exemple, les cellules H85, H74 et H89 sont récupérés des feuilles excel présentes dans le dossier D:\LUI\Developement\VB_VBA\Excel\Forum\ et les placent respectivement dans E2, F2 et G2.

Maintenant, je souhaite (toujours de la même façon), additionner les cellules H98 et H99 par classeur et pour tous les classeurs !

Naivement, j'ai tenté quelque chose comme:
Code:
.Range("H2").Formula = Replace(Formule, "H85", "H98+H99")
Mais bien sur ça ne fonctionne pas.

Toujours en faisant en sorte qu'il ne redemande pas le nom de la feuille (problème initial du topic), est-ce possible d'addition des cellules avec cette solution ?

Merci par avance.
 
G

Guest

Guest
Re : Problème de récupération de données(cellules) dans une boucle

bonjour ZakNaster

Ta formule finale doit ressembler à ceci:

Code:
"=SUM(" & Replace(Formule, "H85", "H98:H99") & ")"

Attention aux deux-points (H98:H99).

Ce qui devrait donner ceci:

Code:
"=SUM('D:\LUI\Developement\VB_VBA\Excel\Forum\[procédure.xls]Feuil1'!H98:H99)"
A bientôt
 

zaknaster

XLDnaute Nouveau
Re : Problème de récupération de données(cellules) dans une boucle

Il n'accepte pas la ligne en donnant une erreur 1004 (?).

Je pense avoir une piste: un problème de "=".
Le truc c'est que le Replace redonne le = du coup la ligne doit surement être interprété comme cela:

Code:
"=SUM(='D:\LUI\Developement\VB_VBA\Excel\Forum\[procédure.xls]Feuil1'!H98:H99)"
 

zaknaster

XLDnaute Nouveau
Re : Problème de récupération de données(cellules) dans une boucle

Bonjour,

pourtant il bug sur la ligne et je ne peux pas voir comment il l'interprète vu qu'il compile pas

Je met la ligne comme cela:

Code:
.Range("H2").Formula = "=SUM(" & Replace(Formule, "H85", "H98:H99") & ")"

Une petite idée ?
merci d'avance
 
G

Guest

Guest
Re : Problème de récupération de données(cellules) dans une boucle

bonjour ZakNaster,

Lorsque tu es en débogage,dans l'éditeur VBE affiche la fenêtre exécution (CTRL+G) puis dans cette fenêtre tape un ? suivit de "=SUM(" & Replace(Formule, "H85", "H98:H99") & ")" puis valide. Regarde le résultat affiché.

C'est tout ce que je peux te dire en l'état. Pour plus d'information, il nous faudrait un fichier exemple avec la macro et un fichier exemple avec les données à lier aux premier.

A+
 

zaknaster

XLDnaute Nouveau
Re : Problème de récupération de données(cellules) dans une boucle

Bonjour,

je met une version dans ce poste que je viens de réaliser et qui illustre le problème.

Il faudra juste penser à changer le chemin du dossier dans le code :
 

Pièces jointes

  • Recup_File.zip
    30 KB · Affichages: 17
G

Guest

Guest
Re : Problème de récupération de données(cellules) dans une boucle

Bonjour Zaknaster,

Voici l'instruction corrigée:

Code:
.Range("D7").Formula = "=Sum(" & Replace(Replace(Range("B7").Formula, "C6", "D10:E11"), "=", "") & ")"

Il fallait remplacer le premier "=" de la formule par rien "".

Tu aurais pu le trouver par toi-même.

A+
 

zaknaster

XLDnaute Nouveau
Re : Problème de récupération de données(cellules) dans une boucle

Bonjour

Visiblement, il fait bien le calcul mais il ne le fait que pour le premier fichier. Et il répercute le résultat donné par l'addition des 2 cellules du premier fichier pour tous les autres fichiers.

Avant cela, je faisais un calcule par les signes + et - et je n'utilisais pas SUM car j'ai également besoin de faire des soustractions.

Avant c'était donc ce genre :

Code:
.Range("E7").Formula = "='" & Dossier & "[" & Tableau(X) & "]Feuil1'!D10+'" & Dossier & _
"[" & Tableau(X) & "]Feuil1'!E11"

Depuis qu'il y a le Replace je suis un peu confus, je ne m'y retrouve pas bien pour manipuler les variables et faire des additions ou des soustractions, ce qui parait simple à première vue.

Petite démo jointe

C'est possible de faire en sorte de placer des opérateurs pour calculer mes cellules récupérées (avec Méthode Replace) ?

Merci
 

Pièces jointes

  • Recup_File_V2.zip
    30.9 KB · Affichages: 26
G

Guest

Guest
Re : Problème de récupération de données(cellules) dans une boucle

RE ZakNaster,

Voici ta macro modifier, tu n'as plus qu'à changer le + en - suivant besoin.

J'y ai ajouté une variable qui s'appelle formule.
Cette variable permet 2 choses appréciables:
1 - Une facilité plus importante au débogage
2 - Un gain de temps à l'exécution (non significatif ici mais important sur de nombreuses lignes) excel n'ayant plus à évaluer x fois .Range("B7").Formula

Code:
Sub RecupFile()
Dim X As Integer, nbFichiers As Integer, Y As Integer
Dim Tableau() As String
Dim Direction As String
Dim Formule As String
    
Application.ScreenUpdating = False
'Changer le chemin en gardant \ a la fin
Dossier = "D:\LUI\Developement\VB_VBA\Excel\Forum\Recup_File\"   '"C:\[Dossier]\"
Direction = Dir(Dossier + "*xls")
      
    Do While Len(Direction) > 0
        nbFichiers = nbFichiers + 1
        ReDim Preserve Tableau(1 To nbFichiers)
        Tableau(nbFichiers) = Direction
        Direction = Dir()
        
    Loop
    If nbFichiers > 0 Then
        For X = 1 To nbFichiers
            If Tableau(X) <> ThisWorkbook.Name Then
                Y = Y + 1
                With ActiveSheet.Cells(Y, 1)
                    .Range("A7").Formula = Tableau(X)
                    
                    .Range("B7").Formula = "='" & Dossier & "[" & Tableau(X) & "]Feuil1" & "'!" & "C6"
                     
                     Formule = .Range("B7").Formula
                     
                    .Range("C7").Formula = Replace(Formule, "C6", "C8")
                    
                    .Range("D7").Formula = Replace(Formule, "C6", "D10") & "+" & Replace(Replace(Formule, "C6", "E11"), "=", "")
                                    

                End With
                
            End If
        Next X
    End If
End Sub

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 329
Messages
2 087 334
Membres
103 519
dernier inscrit
Thomas_grc11