Ouvrir un fichier
Bonjour!
J'ai en ce moment un gros problème, aussi simple soit-il, qui m'agace énormément! D'autant plus que, quand j'essai les exemples proposés par l'aide d'excel (pour mieux comprendre les fonctions) il me dit "appel de procédure incorrect!!
Bref, voici mon problème :
J'ai dans Mes documents, un dossier "Modèle2012" où se trouve mon fichier original (dans lequel il y a un tas de macros) et un fichier que je souhaiterais ouvrir (à partir d'une macros dans l'original)
J'ai lu un tas de trucs sur les ouvertures de fichiers... Apparemment il y aurait différents modes d'ouverture (pour lecture seule ou écriture etc.)
Moi je voudrais l'ouvrir comme si je faisais simplement un double clic sur le fichier (écriture c sa?)
•Il s'agit d'un fichier *.xlsm (je voudrais ensuite faire pareil pour un *.docx =))
•l'adresse est amenée à changer MAIS il se trouvera toujours dans le même dossier que celui où sera éditée la macro
Ah oui, une dernière chose, dois-je faire d'abord une condition du genre :
If <fichier ouvert> then
Else
<ouvrir fichier>
End if
... Ou s'est aussi absurde qu'inutile?
Merci à tous!
Cdlt, Sym
Bonjour,
Ces deux macros sont à placer dans un module standart (Module1) du classeur appelant :
Sub Test()
Dim WbN$, AbsFN$, WayOfFile$
WbN = "MonBeauClasseur.xlsm"
AbsFN = ThisWorkbook.FullName
WayOfFile = Left(AbsFN, Len(AbsFN) - Len(ThisWorkbook.Name))
If WbIsOpen(WbN) Then
Workbooks(WbN).Activate
Else
Workbooks.Open Filename:=WayOfFile & WbN
End If
End Sub
Function WbIsOpen(WbName As String) As Boolean
On Error Resume Next
WbIsOpen = Not Workbooks(WbName) Is Nothing
End FunctionRemplacer "MonBeauClasseur" par le nom du classeur appelé.
A+
Bonjour!
Tout d'abord merci beaucoup galopin!
Mais il y a un petit bugg dans ta macro;
AbsFN renvoie l'adresse complète du classeur appelant et non celle du classeur Appelé...
Et donne "erreur 1004" sur la ligne workbooks.open ... (l'instruction du else)
Je reste admiratif devant ce morceau de codage ; je débute et je n'avais encore jamais utilisé quelques notions qui y sont
•Le $, (pour vecteur) je ne comprend pas trop comment il marche...
•On Error Resume Next : Ta fonction WbIsOpen, je ne suis pas sûre mais en gros :
Si = false (pas d'erreur) alors Wb.activate
Sinon (=true donc présence d'une erreur) alors Wb.Open
C'est bien ça
Il y a autre chose que je ne comprend pas : Quel est l'intérêt de WayOfFile?
Car au final, il équivaut à AbsFN non? Quelles sont leurs différences?
Encore merci beaucoup, je me coucherais moins con en ayant appris Left (et donc Right) et Len =)
-- 22 Juil 2011, 15:22 --
PS : je les ai bien mis, comme tel, (en changeant WbN = "fichier appelé") dans un module (Module4) de VBAProject(fichier appelant.xlsm)... Ceci dit, le faire dans les modules de VBAProject(PERSONAL.XLSB) ne marche pas non plus...
MéNon ! MéNon !
Il n'y a pas de bug dans la macro :
La Function WbIsOpen est une fonction générale. Elle peut effectivement être enregistrée dans un classeur PERSO.xlam ! (et non xslb) de manière à être disponible pour tous les classeurs.
C'est effectivement elle qui teste si le classeur est ouvert ou non.
La difficulté de ta question réside dans la détermination du chemin du classeur appelé :
Comme tu ne donnes aucune indication la-dessus si ce n'est que c'est le même répertoire que le classeur appelant, je suis bien obligé de récupérer l'emplacement de ce classeur. C'est le role de AbsFN
Et WayOfFile récupère la partie utile du chemin contenu dans WayOfFile
Donc le fichier a ouvrir est bien WayOfFile & WbN
Si tu veux vérifier ce que contiennent les différentes variables tu peux les tester en modifiant la macro comme suit :
Sub Test()
Dim WbN$, AbsFN$, WayOfFile$
WbN = "MonBeauClasseur.xlsm"
AbsFN = ThisWorkbook.FullName
WayOfFile = Left(AbsFN, Len(AbsFN) - Len(ThisWorkbook.Name))
MsgBox WayOfFile
MsgBox WayOfFile & WbN
If WbIsOpen(WbN) Then
Workbooks(WbN).Activate
Else
Workbooks.Open Filename:=WayOfFile & WbN
End If
End SubLes $ à la fin de chaque Dim signifie que les variables sont des String. c'est l'équivalent de :
Dim WbN as String, AbsFN as String, WayOfFile as StringLe galopin étant d'un naturel un peu cossard je préfère la syntaxe courte...
Pour le On Error Resume Next c'est un peu plus subtil que ça...
Grosso poto :
Workbooks(WbName) produit une errreur et plante la fonction si le classeur n'est pas ouvert. Pour éviter le plantage on dit à VBA d'ignorer l'instruction génante. Donc la fonction renvoie VRAI uniquement si le classeur est ouvert. Dans l'autre cas elle ne renvoie rien. Dans ce cas la Sub appelante en déduit que si ce n'est pas VRAI c'est que le classeur n'est pas ouvert...
En résumé, recommence en changeant uniquement le nom du classeur appelé et ça doit marcher !
A+
Bonjour Galopin!
Tout d'abor merci, çà marche parfaitement, je m'étais enfaite planté en recopiant (j'avais oublié le - Len(ThisWorkbook.Name))
Ceci dit, j'ai essayé de l'utiliser pour une autre macro mais pour celà, j'ai besoin de savoir avant tout si le fichier existe et de le créer si c'est pas le cas... voici ce que j'ai compilé :
Sub Test()
Dim WbN$, AbsFN$, WayOfFile$
WbN = "MonBeauClasseur.xlsm"
AbsFN = ThisWorkbook.FullName
WayOfFile = Left(AbsFN, Len(AbsFN) - Len(ThisWorkbook.Name))
If WbIsOpen(WbN) Then
Workbooks(WbN).Activate
Else
if WbExiste(Adre, WbN) then
Workbooks.Open Filename:=WayOfFile & WbN
else
Workbooks.Add
'+série de paramètres pour le renommer WbN dans une adresse Adre (dans cette macro, il s'agit d'une adresse fixe
'mais celà a peu d'importance)
end if
End If
End Sub
Function WbIsOpen(WbName As String) As Boolean
On Error Resume Next
WbIsOpen = Not Workbooks(WbName) Is Nothing
End Function
Function WbExiste(Adresse As String, WbName As String) As Boolean
On Error Resume Next
WbExiste = Not Workbooks(Adresse & WbName).Open Is Nothing
End FunctionSeulement, ma fonction WbExiste renvoie toujours Faux et ma macro prend toujours le chemin du Else (C'est à dire qu'il veut, que le fichier existe ou non, créer le fichier en question)
Bien entendu, ce serait absurde que WbN vaille toujours "MonBeauClasseur.xlsm". Il vaut enfait un petit tas de variables (String) mis les uns à la suite des autres...
Je vais devoir ensuite créer les mêmes conditions d'existences avec des feuilles de classeur mais je pense qu'avec cette solution là je saurais quand même faire l'adaptation...
J'éspère que tu sauras ( toi ou quelqu'un d'autre
Je le redis encore une fois, MERCI BEAUCOUP! tu m'as déjà bien fait avancer!
En supposant que je trouve la solution de moi même, je posterais la réponse dès ce soir! =)
En attendant... Sujet Résolu
Bonjour,
Voici une macro WbExist :
Function WbExist(Adresse As String, WbName As String) As Boolean
WbExist = Dir(Adresse & WbName) = WbName
End Function...et une fonction FeuilleExiste
Function WsExist(Nom$) As Boolean
On Error Resume Next
WsExist = Sheets(Nom).Index
End FunctionEn dépit des apparences, il n''y a pas de similitude. Le code doit être adapté à chaque objet !
A+
Merci beaucoup! Tout marche parfaitement!!