Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

VBA - Vérifier si une feuille existe dans un classeur fermé

866 views
Skip to first unread message

Alex St-Pierre

unread,
Oct 2, 2006, 9:39:01 AM10/2/06
to
Bonjour,
J'utilise la programmation suivante pour vérifier si la feuille "data" d'un
fichier excel fermé existe. La macro suivante ouvre le fichier et vérifie si
elle est présente, cela prend environ 10 secondes à exécuter. Existe-t-il une
façon plus rapide (peut-être sans ouvrir le fichier excel) de s'assurer
qu'elle est présente?
Merci !
Alex

sXlFilePath2 = Application.GetOpenFilename("Fichiers Excel,*.xls")
If sXlFilePath2 <> False Then
On Error Resume Next
Workbooks.Open sXlFilePath2, False
sXlFileName2 = LCase(Right(sXlFilePath2, Len(sXlFilePath2) -
InStrRev(sXlFilePath2, "\")))
Workbooks(sXlFileName2).Activate
Set wks = Nothing
Set wks = Sheets("data")
Workbooks(sXlFileName2).Close (False)
If wks Is Nothing Then
'Aucun traitement, la feuille data n'existe pas.
Else
'Traitement
End If
--
Alex St-Pierre

Michel Pierron

unread,
Oct 2, 2006, 12:59:58 PM10/2/06
to
Bonsoir Alex;
Par exemple:

Sub SheetExists()
Const Wbk$ = "D:\Excel\DataBase\MonClasseur.xls"
Const Sht$ = "Data"
If OkSheetName(Wbk, Sht) Then
MsgBox "La feuille " & Sht & " est présente dans le classeur:" & vbLf & Wbk
& " !", 64
End If
End Sub

Private Function OkSheetName(FullPathFile$, SheetName$) As Boolean
Dim Con As Object, Cat As Object, Tbl As Object
Set Con = CreateObject("ADODB.Connection")
Con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" _
& FullPathFile & ";" & "Extended Properties=Excel 8.0;"
Set Cat = CreateObject("ADOX.Catalog")
Set Cat.ActiveConnection = Con
For Each Tbl In Cat.Tables
If Left$(Tbl.Name, Len(Tbl.Name) - 1) = SheetName Then
OkSheetName = True
Exit For
End If
Next Tbl
Set Cat = Nothing: Con.Close: Set Con = Nothing
End Function

MP

"Alex St-Pierre" <AlexSt...@discussions.microsoft.com> a écrit dans le
message de news: 5F9EFF13-EA48-4F02...@microsoft.com...

Alex St-Pierre

unread,
Oct 2, 2006, 2:36:04 PM10/2/06
to
Merci, ça fonctionne très bien (et très rapide!!)
Je vais aussi utiliser la fonction pour importer l'ensemble des noms de
feuille du classeur. J'ai remarqué que si le nom de la feuille est "table
3.1", Left$(Tbl.Name, Len(Tbl.Name) - 1) donne "Table 3#1" (le point est
remplacé par un #). Aussi, s'il y a de la couleur dans le nom de l'onglet, un
signe de $ apparait à la fin du nom. Est-ce que tu sais s'il y a moyen
d'obtenir le nom tel qu'il est écrit dans Excel ?
Merci !
--
Alex St-Pierre


"Michel Pierron" a écrit :

Alex St-Pierre

unread,
Oct 2, 2006, 2:40:03 PM10/2/06
to
Ou bien, une solution simple serait de remplacer les # par des . !!
sTemp = Left$(Tbl.Name, Len(Tbl.Name) - 1)
sTemp = Replace(sTemp, "#", ".")
sTemp = Replace(sTemp, "$", "")
monDicoSource.Add sTemp, sTemp

--
Alex St-Pierre


"Michel Pierron" a écrit :

> Bonsoir Alex;

Michel Pierron

unread,
Oct 2, 2006, 3:42:13 PM10/2/06
to
Re Alex;
Le signe $ est toujours présent à la fin du nom; c'est pourquoi il y a -1
dans:
Left$(Tbl.Name, Len(Tbl.Name) - 1)
Mais tu peux aussi utiliser (à condition de ne pas utiliser $ dans le nom de
la feuille):
Left$(Tbl.Name, InStr(1, Tbl.Name, "$") - 1)
Je te rappelle les restrictions d'usage dans les noms de feuilles:
31 caractères maxi
Pas de caractères tels que: \ / ? * [ ].
(3.1) n'est donc pas un nom valide; c'est pourquoi tu trouves # en lieu et
place du .

Tu peux aussi essayer cette autre manière de faire :

Sub VerifSheet()


Const Wbk$ = "D:\Excel\DataBase\MonClasseur.xls"

Const Sht$ = "Feuil3"
If FindSheet(Wbk, Sht) Then
MsgBox "La feuille " & Sht & " est présente dans" & vbLf & Wbk & " !", 64
End If
End Sub

Private Function FindSheet(FullPath$, Name$) As Boolean
If Dir(FullPath) = "" Then Exit Function
Dim Pos&(1 To 2), b(0 To 2048) As Byte
Dim lr&: lr = FileLen(FullPath)
Dim f&: f = FreeFile
Open FullPath For Binary Access Read As #f
Do
Pos(1) = Pos(1) + 2047
Get #f, Pos(1), b
Pos(2) = InStrB(b, ChrB(133))
Loop While Pos(2) = 0 And Pos(1) < lr
Do While Pos(2) > 0
Pos(1) = Pos(1) + Pos(2) - 1
Get #f, Pos(1), b
FindSheet = CBool(Mid(StrConv(b, vbUnicode), 13, b(10)) = Name)
If FindSheet Then Exit Do
Pos(2) = IIf(b(b(2) + 4) = 133, InStrB(4, b, ChrB(133)), 0)
Loop
Close #f
End Function

MP

"Alex St-Pierre" <AlexSt...@discussions.microsoft.com> a écrit dans le

message de news: 225D5082-BF09-42D3...@microsoft.com...

Alex St-Pierre

unread,
Oct 2, 2006, 4:21:02 PM10/2/06
to
Bonjour Michel,
J'ai modifié mon programme pour qu'il ajoute l'ensemble des feuilles (autre
que data et manager) dans une ListBox pour que l'utilisateur puisse les
sélectionner. J'ai remarqué que dans certains fichiers, la fonction "For Each
Tbl In Cat.Tables" me donne des noms de plage aussi (en plus des noms de
feuilles). Ce qui est étrange, c'est que c'est seulement quelques noms de
plage qui se retrouve dans la liste.
Je vais essayer la 2e méthode.
Merci !

Set monDicoSource = CreateObject("Scripting.Dictionary")


For Each Tbl In Cat.Tables

sTemp = Replace(Tbl.Name, "#", ".")
sTemp = Replace(Tbl.Name, "$", "")
If sTemp = SheetName Then 'Left$(Tbl.Name, Len(Tbl.Name) - 1) =
SheetName


OkSheetName = True 'Exit For

ElseIf sTemp <> "manager" And sTemp <> "merge" Then 'don't want data
and manager sheet
monDicoSource.Add sTemp, sTemp
End If
Next Tbl

Michel Pierron

unread,
Oct 3, 2006, 3:31:32 AM10/3/06
to
Re Alex;
En effet, puisque plages sont des sous tables, elles figurent dans la liste;
mais comme seules les feuilles possèdent le signe $ à la fin, tu peux la
jouer comme ça (en rajoutant la variable Pos&):

For Each Tbl In Cat.Tables

Pos = InStr(1, Tbl.Name, "$")
If Pos Then
OkSheetName = CBool(Left$(Tbl.Name, Pos - 1))
If OkSheetName Then Exit For
End If
Next Tbl

MP

"Alex St-Pierre" <AlexSt...@discussions.microsoft.com> a écrit dans le

message de news: 225D5082-BF09-42D3...@microsoft.com...

Alex St-Pierre

unread,
Oct 3, 2006, 9:07:02 AM10/3/06
to
Ça fonctionne très bien avec le test sur le signe $ à la fin de chaque feuille!

Alex St-Pierre

unread,
Oct 3, 2006, 12:00:02 PM10/3/06
to
Bonjour Michel,
Je me demande s'il est possible d'accéder au contenu d'une cellule qui porte
un nom. Par exemple, dans la feuille "data" en question, il y a une cellule
nommé "date_eval" qui contient une date que je voudrais mettre dans mon
formulaire.

MichDenis

unread,
Oct 3, 2006, 12:25:36 PM10/3/06
to
Pour lire la valeur d'une cellule ayant le nom toto

LeNom = Application.ExecuteExcel4Macro("'C:\Mes documents\Classeur1.xls'!toto")

"Alex St-Pierre" <AlexSt...@discussions.microsoft.com> a écrit dans le message de news:

C5C6D728-CC8D-497F...@microsoft.com...

Alex St-Pierre

unread,
Oct 3, 2006, 1:14:01 PM10/3/06
to
Merci!
Est-ce qu'il est possible d'ajouter le nom de la feuille sur laquelle on
cherche le nom de cellule ? (La référence pourrait être Local ou Global sur
cette feuille).

Merci !
--
Alex St-Pierre


"MichDenis" a écrit :

MichDenis

unread,
Oct 3, 2006, 1:55:55 PM10/3/06
to
Même si toto est un "nom" local c'est à dire défini comme appartenant à la feuil1,
la ligne de code fonctionne très bien

mais je ne crois pas que l'on puisse modifier la ligne de code en remplaçant
toto par "Feuil1!toto" si c'est à quoi tu fais référence.


"Alex St-Pierre" <AlexSt...@discussions.microsoft.com> a écrit dans le message de news:

2F99409C-FDFB-48F2...@microsoft.com...

Alex St-Pierre

unread,
Nov 2, 2006, 10:50:02 AM11/2/06
to
Bonjour Michel,
Je me sert de ton programme pour ajouter l'ensemble des noms de feuilles à
un ListView (en plus de tester si la feuille data existe). Par la suite,
l'utilisateur sélectionne les feuilles et en appuyant sur "Exécuter" et les
feuilles se copie dans le classeur actif. Sur chacune des feuilles, il y a
une information (Sheets("abc").Evaluate("Type") qui est stocké en mémoire.
Est-ce que tu si cette variable est accessible via ADODB.Connection?
Merci bcp !
--
Alex St-Pierre
0 new messages