Est-ce que le fichier est ouvert ?

B

Bruno Pérès

Guest
Bonjour,

Je recherche un moyen de savoir via une macro si un fichier Excel précis est ouvert. Est-ce que ce moyen existe, et si oui, quel est-il ?
Merci

Bruno
 
@

@+Thierry

Guest
Bonjour Bruno, le Forum

Oui bien sûr ça existe, il y a même plusieurs moyens par VBA :

Sub BasicTest()

On Error GoTo PasOuvert
Workbooks("Toto.xls").Activate
Exit Sub
PasOuvert:
MsgBox "Le Fichier Toto.xls n'est pas ouvert"
End Sub

Ce code essaie simplement d'activer "Toto.xls" si ce fichier n'est pas ouvert, alors il y a une erreur qui est gérée avec un message, si le fichier est ouvert il sera activé avec message de confirmation.

Une autre méthode consiste à boucler :
Sub BoucleSurWorkBooks()
Dim WB As Workbook
Dim i As Byte
Dim List As String, WBSearch As String

WBSearch = "Toto.xls"

For Each WB In Workbooks
If WB.Name = WBSearch Then
WB.Activate
MsgBox "Le Fichier " & WBSearch & " est bien disponible"
Exit For
Else
i = i + 1
List = List & WB.Name & vbCrLf
End If
Next

If i = Workbooks.Count Then
MsgBox "Le Classeur " & WBSearch & " n'est pas ouvert, voici ceux ouverts" & vbCrLf & List
End If
End Sub


Ce code listera tous les Classeurs ouverts, si aucun ne correspond à la Variable "WBSearch" (Toto.xls) alors une message indiquera la liste des Classeurs ouverts, sinon "Toto.xls" sera activé avec message de confirmation aussi.

Une approche finale consisterait aussi à demander si on veut ouvrir ce classeur Toto.xls...

Sub TestAndOPen()
Dim Q As Byte
On Error GoTo PasOuvert
Workbooks("Toto.xls").Activate
MsgBox "Le Fichier Toto.xls est bien disponible"

Exit Sub
PasOuvert:
Q = MsgBox("Le Fichier Toto.xls n'est pas ouvert, voulez vous l'ouvrir ?", vbQuestion + vbYesNo)
If Q = vbYes Then
Workbooks.Open "C:\mes documents\mes classeurs\toto.xls" '<<< A Adapter
End If
End Sub

Voilà Bruno plus que l'embarras du Choix !

Bon Week End à Tous et Toutes
@+Thierry
 
B

Bruno Pérès

Guest
Merci Thierry,

Ta dernière proposition me convient tout particulièrement ... mais se présente à moi un deuxième problème ! Le fichier en question est au format ".csv", séparateur ";". Certaines des données sont des nombres dont certains commencent par des "0" que je souhaite impérativement conserver. Or en ouvrant ce fichier directement et simplement par Excel, le fichier est automatiquement converti sans intervention de ma part ... et les "0" en tête de nombres ont disparus :-((
L'ouverture de ce fichier par l'Explorateur Windows permet une ouverture dans Excel sans conversion.
Question : existe-t-il un moyen d'ouvrir ce fichier "brut de décoffrage" par Excel, donc sans conversion, à partir d'une macro ? A moins qu'une possibilité d'ouvrir ce fichier directement par l'Explorateur Windows appelé par une macro Excel ne s'offre à moi ?

Bruno
 
@

@+Thierry

Guest
Re Salut Bruno,

Un VBS (VBScript) peut ouvrir ton fichier comme ceci :

Dim xl

on error resume next
Set xl = GetObject(, "Excel.Application")
xl.Workbooks.Open "C:\mes documents\mes classeurs\toto.csv"
xl.Visible = True

(Un VBS se fait par le NotePad et tu renommes l'extention "txt" en "vbs", attention toutefois selon les sécurités réseau, un VBscript peut être interprété comme un Virus)

Mais je ne sais pas si ça résoudra ton problème car je n'ai plus le tmp de tester où je vais être enfermé dans le bureau tout le week end !!!

Sinon en enregistrant un macro à l'ouverture du CSV tu auras peut être des élément de codes pour éviter qu'Excel ne te convertisse ton fichier...

Bon Week End, je file là !!! Youpi !
@+Thierry
 
T

Ti

Guest
Ta méthode, Thierry, a un défaut, c'est que le fichier dont tu testes la présence est activé s'il est ouvert, ce qui n'est pas toujours ce que l'on cherche. En fait, il y a plus simple :

Function Ouvert(ByVal NomFichier$) As Boolean
Dim Wbk As Workbook
On Error GoTo fin
Set Wbk = Workbooks(NomFichier)
Ouvert = True
fin:
End Function

mais bon, ça reste un détail...
 
Y

yeahou

Guest
Bonjour Bruno, Thierry, Ti, le forum

Pour ta question sur les csv, Bruno, je ne vois que deux solutions, la plus simple en deuxième:

1-ouvrir le fichier en mode de lecture séquencielle (Open fichier.csv For Input As #1) ce qui te permettra de maitriser directement la lecture, tu trouveras des exemples dans l'aide et sur le forum.
le plus simple est de placer directement les lignes entières en colonne A (si elles ne dépassent pas 256 caractères) et ensuite utiliser la méthode texttocolumns en spécifiant tes données de type string

2-renommer ton fichier avec une extension txt et utiliser opentext en spécifiant tes données de type string (la, tu pourras utiliser l'enregistreur à l'ouverure du TXT pour avoir un code utilisable contrairement à l'ouverture d'un csv)

Toute autre opération, logiquement, ne fonctionnera pas car le format csv étant connu d'excel, le convertisseur prendra le pas sur toute méthode. En clair, il ne sert à rien d'utiliser opentext sans avoir préalablement renommé ton fichier pour rompre l'association avec csv, la méthode de lecture séquentielle utilise quand à elle un canal d'accés direct au fichier.

Cordialement, A+
 
B

Bruno Pérès

Guest
Bonsoir Ti,

Merci pour ton aide.
Néophite dans les macros , j'arrive à comprendre ce que tu souhaites faire, mais je n'arrive pas à l'associer au code de Thierry (appel de la fonction à partir d'une procédure notamment) :-(
Peux-tu fusionner les deux en réponse, cela me serait très utile ? Je t'en remercie par avance ;-)
D'autre part, peux-tu m'indiquer à quoi correspond le "$" dans ta déclaration d'argument ?

Amicalement
Bruno
 
@

@+Thierry

Guest
Bonjour Ti, Yeahou, Bruno, le Forum

Oui, très bien vu Ti ta Function avec le Set d'Object WKb ! Merci à Toi

Et donc pour Yeahou la méthode de transformer le CSV en TXT est encore la plus simple, je n'y avais point pensé à 6 minutes avant la cloture de ma carte d'accès pour le week end !!

Alors aujourd'hui avec un peu de temps devant moi, j'ai fait mes exercices sur les functions (j'ai des lacune là dessus et pourtant c'est bien pratique !) et du coup je me suis une peu amusé...

Pour Bruno, le code si dessous va peut-être te servir, car il fait plusieurs choses et en prime il répond à tes questions !!!"appel de la fonction à partir d'une procédure notamment" (Voir comme j'appelle les Functions dans la Sub) et aussi "à quoi correspond le "$" (c'est l'abbréviation des développeurs pressés pour écrire "As String")

TEST 1) il teste si le fichier "My_CSV_File.txt" est ouvert, auquel cas il ne l'activera pas (thanx Ti) mais un message te le dira....

TEST 2) il teste si le fichier "My_CSV_File.txt" existe bien dans le répertoire "C:\Mes documents\" auquel cas il l'ouvre après demande de confirmation.

TEST 3) il teste si le fichier "My_CSV_File.Csv" existe bien dans le répertoire "C:\Mes documents\" auquel cas il en créé une Copie en TXT et il l'ouvre après demande de confirmation.

TEST 4) si les fichiers "My_CSV_File.csv" et "My_CSV_File.txt" n'existent pas dans le répertoire "C:\Mes documents\" il enverra un message d'alerte...

Voilà mon travail !



Const FileName As String = "My_CSV_File"
Const FilePath As String = "C:\Mes documents\"
Const TXT As String = ".txt"
Const CSV As String = ".csv"

Sub TestAndOpenAsTxt() '@+Thierry July 2004
Dim Q As Byte
Dim FS As Object, F As Object
&nbsp;If Ouvert(FileName & TXT) = True Then
&nbsp;MsgBox "Le fichier " & FileName & TXT & " est bien ouvert, vous pouvez travailler dessus"
&nbsp;ElseIf Existe(FilePath & FileName & TXT) = True Then
&nbsp;&nbsp;&nbsp;Q = MsgBox("Le Fichier " & FileName & TXT & " n'est pas ouvert, voulez vous l'ouvrir ?", vbQuestion + vbYesNo)
&nbsp;&nbsp;&nbsp;If Q = vbYes Then
&nbsp;&nbsp;&nbsp;&nbsp;Workbooks.Open FilePath & FileName & TXT
&nbsp;&nbsp;&nbsp;End If
&nbsp;ElseIf Existe(FilePath & FileName & CSV) = True Then
&nbsp;&nbsp;&nbsp;Q = MsgBox("Le Fichier " & FileName & TXT & " n'existe pas, voulez vous ouvrir une copie en .txt ?", vbQuestion + vbYesNo)
&nbsp;&nbsp;&nbsp;If Q = vbYes Then
&nbsp;&nbsp;&nbsp;&nbsp;Set FS = CreateObject("Scripting.FileSystemObject")
&nbsp;&nbsp;&nbsp;&nbsp;Set F = FS.GetFile(FilePath & FileName & CSV)
F.Copy FilePath & FileName & TXT
&nbsp;&nbsp;&nbsp;&nbsp;Workbooks.Open FilePath & FileName & TXT
&nbsp;&nbsp;&nbsp;End If
&nbsp;Else
&nbsp;MsgBox "Le fichier " & FileName & " n'existe pas ni en CSV ni en TXT !", vbCritical
&nbsp;End If
End Sub


Function Ouvert(ByVal NomFichier As String) As Boolean 'de Ti
Dim Wbk As Workbook
On Error GoTo fin
&nbsp;Set Wbk = Workbooks(NomFichier)
&nbsp;Ouvert = True
fin:
End Function

Function Existe(ByVal NomCheminFichier As String) As Boolean
Dim Wbk As Workbook
On Error GoTo fin
&nbsp;Open NomCheminFichier For Input As #1
&nbsp;Existe = True
&nbsp;Close #1
fin:
End Function

Bon Samedi
@+Thierry
 
B

Bruno Pérès

Guest
Bonjour Thierry, Ti, Yeahou, le Forum,

J'ai découvert ce forum il y a juste deux jours, et je ne le regrette pas au regard des réponses à mes questions, toutes aussi aimables (les réponses, pas les questions ;o)) ) et efficaces les unes que les autres.
Un grand merci à Ti et Yeahou qui ont répondu efficacement à mes questions, et tout particulièrement à Thierry qui a fusionné toutes les réponses, y compris les siennes, pour arriver à une solution qui répond parfaitement et intégralement à ce dont j'ai besoin :))
Maintenant, y'a plus qu'à personnaliser tout ça avec mes variables et à le joindre au travail déjà effectué.
Merci encore.

Amicalement
Bruno
 
H

Hugo

Guest
VBScript: ouvrir fichier Excel avec Notify

Bonjour à tous et toutes,

Je cherche à pouvoir ouvrir un fichier Excel depuis plusieurs PC.
PC-A ouvre fichier Excel en lecture/écriture, puis PC-B l'ouvre après en lecture seul. Puis PC-A ferme fichier Excel donc PC-B acquitement en lecture/écriture mais la erreur Excel ne s'ouvre pas et il faut une "Récupération du document".

Voici VBScript version1 utilisé:
Set appXl = CreateObject("Excel.Application")
With appXl
.Workbooks.Open "\\Répertoire\fichier.xls",Notify=1
.Visible = True
End With
Set appXl = Nothing

Voici VBScript version1 utilisé:
Set appXl = CreateObject("Excel.Application")
If appXl.Workbooks.Open("\\Répertoire\fichier.xls").ReadOnly <> False Then
MsgBox("Le fichier Excel est en cours d'utilisation, veuillez patienter !!!")
Else
With appXl
.Workbooks.Open "\\Répertoire\fichier.xls",Notify=1
.Visible = True
End With
End If
Set appXl = Nothing

Je n'arrive pas à comprendre pourquoi Excel s'ouvre avec une erreur de "Récupération du document". Quelqu'un peut-il m'aider????
Je n'y comprend plus RIEN du TOUT !!!!!

Bien à vous
Merci d'avance
Au revoir et bonne journée
 

Discussions similaires

Réponses
2
Affichages
294

Statistiques des forums

Discussions
312 306
Messages
2 087 094
Membres
103 467
dernier inscrit
Pandiska