Ouvrir un classeur via VBA

Bonjour,

Je bloque sur un point qui doit sembler élémentaire pour beaucoup d'entre vous. Je souhaite ouvrir un second fichier se trouvant dans le même dossier que celui contenant la macro.

Ci-dessous l'extrait de code qui ne fonctionne pas.

ChDir ThisWorkbook.Path
ClasseurTest = Dir(ThisWorkbook.Path & "\" & NomFichierTest)
Workbooks.Open ClasseurTest

Merci de votre aide,

Bonsoir Romain, bonsoir le forum,

ChDir n'est pas d'une grande utilité ici. Essaie comme ça :

Sub Macro1()
Dim CO As Workbook 'Classeur Original
Dim CA As String 'Chemin d'Accès
Dim NF As String 'Nom du Fichier
Dim NC As Workbook 'Nouveau Classeur

Set CO = ThisWorkbook
CA = CO.Path & "\"
NF = "monclasseur.xlsx" 'à adapter
Set NC = Workbooks.Open(CA & NF)
'dès lors, utilise NC pour spécifier ce classeur et CO pour spécifier le classeur original
End Sub

Merci ThauThème,

Cependant mon fichier ne s'ouvre toujours pas même en entrant le nom du fichier à ouvrir... Est-ce que tu vois une erreur?

Sub test()

'Déclaration des paramètres
Dim CO As Workbook 'Classeur Original
Dim CA As String 'Chemin d'Accès
Dim NF As String 'Nom du Fichier
Dim NC As Workbook 'Nouveau Classeur

'Ouverture du fichier
NF = "test_rib_avr-19.xls"
Set CO = ThisWorkbook
CA = CO.Path & "\"
Set NC = Workbooks.Open(CA & NF)

End Sub

Re,

Non je ne vois pas !?... As-tu un message d'erreur ? Si oui, lequel ?

J'ai ce message

capture

Merci

Re,

je ne comprends pas. Chez moi (en adaptant évidemment), ça marche impeccable !...

Je reessaie demain. Peut-être mon fichier de destination qui est daubé.

Merci et bonne soirée

Effectivement, cela est lié à mon fichier de destination. Je me suis débrouillé pour le remplacement.

J'ai une autre question dans le même thème en complexifiant:

Je cherche aller chercher ce même fichier mais dans un dossier différent. Le dossier sera toujours voisin. Par exemple l'adresse des deux fichiers est:

- C:\Romain\ProjetA\ZoneA\Dossier1\Fichier1.xls

- C:\Romain\ProjetA\ZoneA\Dossier2\Fichier2.xls

Existe-t-il une possibilité de retranscrire: "choisis le chemin du fichier A en élargissant ta recherche au dossier supérieur" ?

Merci par avance

Bonjour Romain, bonjour le forum,

Attention, ton code ne fait aucune recherche !... Donc reformule car je ne comprends pas.

1. On pourrait demander au code d'ouvrir une boîte de dialogue permettant de sélectionner et d'ouvrir un fichier spécifique

2. On pourrait demander au code de rechercher un fichier spécifique et de l'ouvrir

Quelle serait ton option ?

Bonjour ThauThème,

Oui je sais que mon code ne fait aucune recherche et j'aimerai qu'il en fasse.

Mon option est la seconde: rechercher un fichier spécifique dans les "dossiers proches" et l'ouvrir. Le nom de ce fichier sera connu, je pourrai donc l’appeler par son nom exact.

Encore merci de ton aide,

Re,

Ça donnerait ça :

Sub test()
Dim NF As String 'déclare la variable NF (Nom du Fichier)
Dim CO As Workbook 'déclare la variable CO (Classeur Original)
Dim EF As Object 'déclare la variable EX (Explorateur de Fichiers)
Dim DI As Object 'déclare la variable DI (Dossier Initial)
Dim SD As Object 'déclare la variable SD (Sous Dossier)
Dim DT As Object 'déclare la variable DT (Dossier de Travail)
Dim FS As Object 'déclare la variable FS (FichierS)
Dim F As Object 'déclare la variable F (Fichier)
Dim CR As Workbook 'déclare la variable CR (Classeur Recherché)

NF = "test_rib_avr-19.xls" 'définit le nom du fichier NF
Set CO = ThisWorkbook 'définit le classeur original CO
Set EF = CreateObject("Scripting.FileSystemObject") 'définit l'explorateur de fichiers EF
Set DI = EF.GETFolder(CO.Path) 'définit le dossier initial DI
Set SD = DI.SubFolders 'définit l'ensembles SD des sous-dossiers du dossier initial DI
For Each DT In SD 'boucle 1: sur tous les dossiers de travail DT de SD
    Set FS = DT.Files 'définit l'ensemble des fichiers FS du dossier de travail DT
    For Each F In FS 'boucle 2 : sur tous les fichiers F de FS
        If F.Name = NF Then 'condition: si le nom du fichier F est égal à NF définit le classeur Recherché en l'ouvrant
            Set CR = Application.Workbooks.Open(F) 'définit le classeur recherché CR en l'ouvrant
            GoTo suite 'va à l'étiquette "suite"
        End If 'fin de la condition
    Next F 'prochaine fichier de la boucle 2
Next DT 'prochain dossier de travail de la boucle 1
suite: 'étiquette car j'imagine que ton code va continuer...
End Sub

Attention ! Si le fichier NF existe dans plusieurs sous-dossiers celui qui sera ouvert sera le premier trouvé, donc pas forcément le bon...

Merci beaucoup... Je n'aurai pas été capable d'écrire ce code. Si j'ai bien compris cela va chercher dans les sous-dossiers du dossier DI. J'aimerai également aller chercher dans les "sur-dossiers".

Mon fichier se trouve dans: test / avril-2019 / "mon_fichier.xlsm"

J'aimerai aller ouvrir un fichier se trouvant dans: test / trames/ "le_fichier_que_je_veux_ouvrir.xlsm

Il faut donc ressortir un niveau plus haut. Est-ce que cela est possible?

Pour répondre à ton avertissement: le fichier a un nom unique, il n'y a pas deux fois le même NF dans un autre sous-dossier.

Re,

Oui c'est possible. Et toi est-ce qu'il te serait possible de poser la bonne question en une seule fois ?!...

Désolé, cela étant nouveau pour moi mes propos ne sont peut-être pas toujours très clairs. Quand j'ai posté cet exemple, je pensais que cela permettrait de comprendre ce que j'apelle "sur-dossier":

  • C:\Romain\ProjetA\ZoneA\Dossier1\Fichier1.xls
  • C:\Romain\ProjetA\ZoneA\Dossier2\Fichier2.xls

Mais visiblement cela ne permettait pas de comprendre.

Re,

Sub test()
Dim NF As String 'déclare la variable NF (Nom du Fichier)
Dim CO As Workbook 'déclare la variable CO (Classeur Original)
Dim CA As String 'déclare la variable CA (Chemin d'Accès)
Dim DA As Integer 'déclare la variabler DS (Dernier Anti-slash)
Dim DP As String 'déclare la variable DP (Dossier Parent)
Dim EF As Object 'déclare la variable EX (Explorateur de Fichiers)
Dim DI As Object 'déclare la variable DI (Dossier Initial)
Dim SD As Object 'déclare la variable SD (Sous Dossier)
Dim DT As Object 'déclare la variable DT (Dossier de Travail)
Dim FS As Object 'déclare la variable FS (FichierS)
Dim F As Object 'déclare la variable F (Fichier)
Dim CR As Workbook 'déclare la variable CR (Classeur Recherché)

NF = "test_rib_avr-19.xls" 'définit le nom du fichier NF
Set CO = ThisWorkbook 'définit le classeur original CO
CA = CO.Path 'définit le chemin d'accès CA
DA = InStrRev(CA, "\") 'définit la position DA du dernier anti-slash dans CA
DP = Mid(CA, 1, DA - 1) 'définit le dossier parent DP
Set EF = CreateObject("Scripting.FileSystemObject") 'définit l'explorateur de fichiers EF
Set DI = EF.GETFolder(DP) 'définit le dossier initial DI
For Each DT In DI.SubFolders 'boucle 1 : sur tous les dossiers de travail DT, sous-dossier de DI
    Set FS = DT.Files 'définit l'ensemble des fichiers FS du dossier de travail DT
    For Each F In FS 'boucle sur tous les fichiers F de FS
        If F.Name = NF Then 'condition: si le nom du fichier F est égal à NF
            Set CR = Application.Workbooks.Open(F) 'définit le classeur recherché CR en l'ouvrant
            GoTo suite 'va à l'étiquette "suite"
        End If 'fin de la condition
    Next F 'prochaine fichier de la boucle 2
Next DT 'prochain dossier de la boucle 1
suite: 'étiquette car j'imagine que ton code va continuer...
End Sub

Merci beaucoup pour ton aide, cela fonctionne parfaitement !

Bonjour ThauThème, Bonjour le forum,

J'ai encore besoin d'aide pour une opération du même type.

Ma structure est la suivante

- C:

- Dossier Test

- Dossier Janvier

- Fichier de travail 01.xlsm

- Dossier Février

- Fichier de travail 02.xlsm

Je souhaiterai à partir du fichier de travail du mois de février, créer mon dossier "Mars". J'ai essayé d'adapter ton code ThauThème mais je suis coincé. Je n'arrive pas à ressortir un niveau au-dessus pour pouvoir créer "Mars" dans "Test".

Ensuite je devrai copier "Fichier de travail 02.xlsm" dans "Mars".

J'espère avoir été clair et merci par avance de votre aide.

Rechercher des sujets similaires à "ouvrir classeur via vba"