VBA : ouvrir plusieurs fichiers avec "Parcourir" et les appeler

restonszen -  
 restonszen -
Bonjour à tous,

Je viens solliciter votre aide parce que je ne m'en sors pas dans ma macro VBA.
C'est certainement dû au fait que je suis une grande débutante, alors je vous demanderai d'être indulgents...
Je souhaite ouvrir plusieurs fichiers excel (4 exactement), fichiers dont le nom et la localisation ne sont pas définis (et pourront être changés au cours du temps). J'ai donc mis en place 4 userforms pour « parcourir » et « ouvrir » ces 4 fichiers.

Ma question : comment spécifier, par la suite, que c'est dans le 1er (ou 2e, ou 3e, ou 4e) fichier ouvert que je veux récupérer (copier) telle donnée, le nom/ chemin de ces fichiers étant inconnu à l'avance ?

J'ai quand même fait quelques tentatives. Par exemple, voici le code du bouton « parcourir » (le même pour chaque userform), je modifie juste les 2 avant-dernières lignes, pour pouvoir ouvrir l'userform suivant.



Private Sub CommandButton1_Click()  

'action du bouton parcourir  
'ouverture du fichier en question pour permettre de vérifier que le fichier est le bon  
'un seul choix possible  
'il faut que le fichier soit un fichier excel  

 Dim Fichier, NomFichier 
Fichier = Application.GetOpenFilename("Fichiers Microsoft Office Excel(*.xls; *.xlsx), *.xls; *.xlsx")  

 'action si erreur    
If Fichier = False Then Exit Sub  
If Fichier Like "*\" & ThisWorkbook.Name Then MsgBox "Ouverture non autorisée.": Exit Sub  
On Error Resume Next  

 'action si ok   
Workbooks.Open Fichier  
On Error GoTo 0  
NomFichier = Dir(Fichier)  
Workbooks(NomFichier).Activate  

 'fermeture de cet userform et ouverture du suivant   
UserForm1.Hide  
UserForm2.Show  

  End Sub  



Je vous épargne les boutons "annuler" et "valider".

Ce code semble fonctionner... en tout cas il ouvre bien les userforms. Mais bon, vous l'aurez vu, j'ai mis pas mal de tentatives de nommage, et je ne sais pas si elles sont bonnes...

J'ai tenté un selecteditems, mais il me sort toujours une erreur « fonction non définie »... Je dois avoir loupé quelque chose.

Bref, du coup je suis coincée pour la suite.

Please, help ?

Je ne sais pas si j'ai été claire...Si ce n'est pas le cas, faites le moi savoir.

Tout(e) aide/conseil pour progresser serait la(e) bienvenu(e) !

D'avance, merci beaucoup à tous.




4 réponses

Heliotte Messages postés 1491 Date d'inscription   Statut Membre Dernière intervention   92
 
Bonsoir restonszen ,
Pourquoi ouvrir les quatre fichiers dans quatre userforms ?
Tu peux le faire dans le même module ou userform en donnant à chaque fichier un numéro d'index .. plus simplement fichierOuvert = 1 pour le premier fichier, fichierOuvert = 2 pour le deuxième fichier, etc
Ensuite, tu lis le fichier pour savoir si c'est le bon .. et si ok, tu travaille avec celui-là, sinon tu insvestit dans le deuxième fichier
A+
1
eriiic Messages postés 24603 Date d'inscription   Statut Contributeur Dernière intervention   7 275
 
Bonsoir,

tu peux les déclarer dans des variables juste après leur ouverture (toujours actif) :
Dim wb As Workbook, wb1 As Workbook, wb2 As Workbook, wb3 As Workbook, wb4 As Workbook
' ouverture fichier 1
.....
Set wb1 = ActiveWorkbook
....

Quand tu as trouvé celui à utiliser, le 3 par exemple :
set wb= wb3
With wb
With Sheets("Feuil1")
.[Feuil1!A3] = "ok"
End With
End With

ou bien l'activer pour ne pas être obligé de le nommer et raccourcir le code.

eric

Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
1
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Bonjour tou(te)s
Je pense que c'est un truc comme ça que tu veux...
Sub OuvreMulti()     
Dim Fichier     
Dim i As Integer     
    Fichier = Application.GetOpenFilename("Fichiers Excel(*.xls; *.xlsx), *.xls; *.xlsx", , , , True)     
    On Error GoTo Annuler     
    For i = 1 To UBound(Fichier)    
'Si tu veux employer Like il faut mettre Option Compare Text dans le haut du module   
'If not Fichier(i) Like "*" & ThisWorkbook.Name then 
        If Mid(Fichier(i), InStrRev(Fichier(i), "\") + 1) <> ThisWorkbook.Name Then     
            On Error Resume Next   
            Workbooks.Open Fichier(i)     
        Else     
            MsgBox "le fichier " & ThisWorkbook.Name & " est déjà ouvert"     
        End If     
    Next i     
Annuler:     
End Sub

Sélection multiple sur l'explorateur de fichiers et ouverture de tout les classeurs sélectionnés
A+

Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
NOTE : Je ne répond pas aux MP pour les questions techniques.
1
restonszen
 
Bonjour à tous,

Tout d'abord, merci pour vos réponses, toutes vraiment très utiles ... et très instructives !!!

C'est peut-être pas le lieu pour le dire, mais j'apprécie énormément cette entraide (enfin, cette aide, vu que je ne suis pas -encore- très utile sur le sujet) qu'il est difficile de retrouver par ailleurs !

Ensuite, pour vous répondre :
1- à Heliotte :
Je ne connaissais pas le fonctionnement des index -_-'
Je pensais que les chiffres étaient surtout utiles pour ... calculer. (Non, je ne me loupe pas quand c'est pour me ficher la honte). Je retiens !
Du coup, je pensais faire 4 userforms pour "séparer" les instructions pour chaque fichier... Mais ça n'a fait que retarder l'échéance, j'ai ensuite été bloquée parce que je devais faire référence à ces fichiers ouverts précédemment dans un module commun ...
2- à Eriic :
Effectivement, Set simplifie grandement les choses !!! J'étais complètement à côté de la plaque pour le nommage de mes variables, les = ne sont de toute évidence pas toujours suffisants... et je les utilisais à tort et à travers.
Je note aussi qu'il faut utiliser Set 2 fois : à la déclaration de la variable (Set wb1 = activeworkbook) et lorsqu'on veut utiliser le fichier (Set wb=wb3). Toute seule, je n'aurais pas du tout pensé à le faire.
3- à Lermite222 :
J'ai aussi beaucoup appris grâce à ton code :) ubound, notamment, option compare text aussi (que je n'aurais pas su placer correctement :()...). Je pensais aussi que Mid n'était utilisé que pour remplacer des caractères... et c'est la première fois que j'entends parler de InStrRev...

Bref, pour info, vos réponses sont exactement ce que je cherchais, et en fait vous avez aussi (déjà) répondu à des questions que je ne me posais pas encore :) (Lol, je sais, il y a du boulot). Elles sont de plus compréhensibles et utilisables dans tout plein de situations, je suis ravie !!! J'ai eu de grands moments de solitude avec mon livre-catalogue-de- fonctions -que -je -ne -sais-pas- utiliser-correctement...

Merci encore de votre patience, de votre temps, et de vos conseils !

RZ
0