[Excel | VBA] Identification de feuil dans un classeur
AiDuK
Messages postés80Date d'inscriptionlundi 22 octobre 2007StatutMembreDernière intervention30 juillet 2008
-
30 juil. 2008 à 13:50
zen69
Messages postés584Date d'inscriptionjeudi 28 décembre 2006StatutMembreDernière intervention29 avril 2010
-
30 juil. 2008 à 21:15
Bonjour à toutes et à tous,
J'ai un léger soucis dans mon code.
Je cherche à vérifier dans un classeur que j'ouvre, via une macro VBA, si il y a dans le classeur une feuille portant le nom de "fiche FR" ou de "fiche GB".
Le problème est que si dans le classeur il y a plusieurs feuilles ( dans l'ordre feuil1, fiche Fr, feuil2, feuil3 ), il ne regarde que la 1ère feuille de classeur.
Extrait de mon code :
Dim Ws As Worksheet
.........
For Each Ws In ActiveWorkbook.worksheets If UCase$(Ws.Name) "FICHE FR" Or UCase$(Ws.Name) "FICHE GB" Then
Exit For
Quand je fais pas à pas, il regarde la 1ere feuille et déduit que feuil1 <> de Fiche FR ou Fiche GB
Du coup il ne fait pas la suite des actions.
Quelqu'un aurait il une réponse à apporter à mon calvaire svp ?
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 30 juil. 2008 à 14:33
Euh... ton code fonctionne pourtant ? peut-être un p'tit truc qui t'échappes... voici le code de base :
=
Sub ess()
For Each ws In ActiveWorkbook.Worksheets If UCase$(ws.Name) "FICHE FR" Or UCase$(ws.Name) "FICHE GB" Then
MsgBox "ok"
Exit Sub
End If
Next
MsgBox "pas trouvé"
AiDuK
Messages postés80Date d'inscriptionlundi 22 octobre 2007StatutMembreDernière intervention30 juillet 2008 30 juil. 2008 à 15:06
Je viens de réessayer, mais cela ne marche toujours pas.
Il en regarde que la 1ere feuille de mon classeur et si celle ci n'est pas une des deux que je recherche, alors il en déduit que les feuille ne sont pas dans la classeur.
AiDuK
Messages postés80Date d'inscriptionlundi 22 octobre 2007StatutMembreDernière intervention30 juillet 2008 30 juil. 2008 à 15:33
Cette partie de code va ouvrir une fenetre pour parcourir les fichiers sur les disques durs. L'utilisateur choisi le fichier xls, et le programme regarde si dans le classeur selectionné, il y a une feuille du nom de fiche FR ou fiche GB.
Si oui alors , il procède à une extraction de cellule pour les stocker dans une base de données excel
Le code :
Sub Extraction()
'extrait les informations d'une FNC pour créer le début de la FIQ
Dim ProchaineLigneVide As Long
Dim FileToOpen As Variant
Dim mes1 As Variant
Dim marecherche As String
Dim No As String
Dim Ws As Worksheet
Select Case design_pays
Case "FR"
mes1 = "Importation annulée !"
mes2 = "Ce classeur ne contient pas de F.N.C. !"
Case "GB"
mes1 = "Importation cancelled !"
mes2 = "This workbook doesn't have N.C.S. !"
End Select
On Local Error GoTo MyOpen
FileToOpen = Application.GetOpenFilename("Tout les fichiers Excel (*.xl*;*.xls;*.xla;*.xml;*.xlm;*.xlc;*.xlw),")
Module5.NoFIQ
If FileToOpen Then
MyOpen:
If Err.Number = 13 Then
Err.Clear: On Local Error GoTo 0
Workbooks.Open FileToOpen
End If
For Each Ws In ActiveWorkbook.worksheets If UCase$(Ws.Name) "FICHE FR" Or UCase$(Ws.Name) "FICHE GB" Then
Exit For
Else
ActiveWorkbook.Close
MsgBox mes2
Exit Sub
End If
Next
marecherche = Ws.Range("O10").Value
With ThisWorkbook.Sheets("Liste Fournisseurs").Range("a:a")
Set c = .find(marecherche, LookIn:=xlValues)
End With
If c Is Nothing Then Call Module1.affiche_fournisseur
With ThisWorkbook.Sheets("recep")
ProchaineLigneVide = .Range("A65536").End(xlUp).Row + 1
Molenn
Messages postés797Date d'inscriptionmardi 7 juin 2005StatutMembreDernière intervention23 février 20117 30 juil. 2008 à 15:37
Tu es sûr que ton code regarde dans le bon classeur ? Puisque tu travailles dans 2 classeurs et que si j'ai bien compris, tu ouvres le 2nd à partir du 1er.
Affiche le nom de tes feuilles quand tu les défiles, juste après le For each, rajoute un : msgbox ws.Name
Si tu n'es pas dans le bon classuer, le pb vient de ton activeworkbook.
Soit tu colles avant un Workbooks("Nom du classeur.xls").activate, soit tu remplaces dans ta boucle
For Each Ws In ActiveWorkbook.worksheets
par
For Each Ws In Workbooks("Nom du classeur.xls").worksheets
AiDuK
Messages postés80Date d'inscriptionlundi 22 octobre 2007StatutMembreDernière intervention30 juillet 2008 30 juil. 2008 à 15:49
Bonjour Molenn,
Je viens de tester avec le msgbox ws.Name
Et je suis bien dans la bon classeur, cependant , il ne met qu'une seule msgbox avec marqué "feuil1", alors qu'il y a 2 feuilles : feuil1 et fiche FR ( dans cet ordre )
donc cela ne vient pas d'un problème d'active workbook
Mais bien du fait qu'il ne regarde que la 1ere feuille de mon classeur
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 30 juil. 2008 à 15:55
Un peu de logique, avec le test IF...
For Each Ws In ActiveWorkbook.Worksheets If UCase$(Ws.Name) "FICHE FR" Or UCase$(Ws.Name) "FICHE GB" Then
Exit For
Else
ActiveWorkbook.Close
MsgBox mes2
Exit Sub
End If
Next
Si le 1er onglet n'est pas égale à "FICHE FR" ou "FICHE GB" alors on va à ELSE... donc on quitte la SUB ! dès le 1er test...
Voilà. Il faut pas de else. La solution simple c'est d'utiliser un marqueur Boolean...
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 30 juil. 2008 à 16:38
Euh... là j'ai du mal à te croire, en quelque sorte...
De plus, il n'est certain comme évoqué précédemment que le bon soit actif... en effet, dans la partie juste avant, le code :
On Local Error GoTo MyOpen
FileToOpen = Application.GetOpenFilename("Tout les fichiers Excel (*.xl*;*.xls;*.xla;*.xml;*.xlm;*.xlc;*.xlw),")
Module5.NoFIQ
If FileToOpen Then
MyOpen:
If Err.Number = 13 Then
Err.Clear: On Local Error GoTo 0
Workbooks.Open FileToOpen
End If
me laisse perplexe... Quand on ouvre le fichier ? ... étrange comme conception... j'ai du mal à me repérer.
Que contient : Module5.NoFIQ ?
et je ne vois pas à quoi sert la gestion de l'erreur ici... voici une possibilité plus simple :
FileToOpen = Application.GetOpenFilename("Tout les fichiers Excel (*.xl*;*.xls;*.xla;*.xml;*.xlm;*.xlc;*.xlw),")
If FileToOpen <> False Then
Workbooks.Open FileToOpen
Else
Exit Sub
End If
=
Maintenant, fait un pas à pas, dans For each
où un debug.? et je pense que tu devrais avoir plus idée ensuite...
avec :
For Each Ws In ActiveWorkbook.Worksheets
Debug.Print Ws If UCase$(Ws.Name) "FICHE FR" Or UCase$(Ws.Name) "FICHE GB" Then
BonOnglet = True
Exit For
End If
Next
AiDuK
Messages postés80Date d'inscriptionlundi 22 octobre 2007StatutMembreDernière intervention30 juillet 2008 30 juil. 2008 à 16:51
Concernant :
If FileToOpen Then
MyOpen:
If Err.Number = 13 Then
Err.Clear: On Local Error GoTo 0
Workbooks.Open FileToOpen
End If
C'est Mortalino qui m'a conseillé ca, car après de nombreux essais , que ce soit de lui ou du moi, il y avait une erreur soit lors de la séléction du fichier, soit lors de l'annulation de "parcourir"
Pour Module5.NoFIQ , c'est une procédure qui me crée un numéro de FIQ en fonction de la date et d'un n° auto, mais de ce coté là, pas de problème.
Concernant la classeur actif, c'est bien celui que j'ouvre via mon 1er classeur qui est activeworkbook, pas de soucis.
De plus quand tu m'as conseillé de faire afficher la nom de la feuille dans un msgbox, cela m'a affiché "feuil1", hors dans mon 1er classeur, il n'y a aucune feuille portant ce nom alors que dans la classeur que j'ouvre oui.
Je continu à chercher, mais j'avoue être à court d'idée là
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201315 30 juil. 2008 à 17:37
Salut,
je reiteres la solution deja donnéici, plus rapide et qui fonctionne a tous les coups
dim NomFeuille(2) As String, i As Long
NomFeuille(1) = "FICHE FR"
NomFeuille(2) = "FICHE GB"
For i = 1 to 2
err.clear
on error resume next
ActiveWorkbook.Worksheets(NomFeuille(i)).Activate
if err = 0 then Exit For
if i=2 then
MsgBox "Importation annulée !/Importation cancelled !"
err.clear
Exit Sub
End If
Next i
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 30 juil. 2008 à 18:30
bou...
Avec le code donnée , à savoir :
FileToOpen = Application.GetOpenFilename("Tout les fichiers Excel (*.xl*;*.xls;*.xla;*.xml;*.xlm;*.xlc;*.xlw),")
If FileToOpen <> False Then
Workbooks.Open FileToOpen
Else
Exit Sub
End If
Y'a aucune erreur. et pas de parcourir non plus, mais Ouvrir ou Annuler. Le type FileToOpen devant être Variant.
Donc petite subtilité de la fonction VBA, qui renvoi un type de variable Boolean si le bouton est Annuler, et String si il y a un choix avec Ouvrir.
C'est peut-être la raison est difficultés rencontrés précédemment.
Ensuite, j'en reste à ton seul pb que tu soumet : Parcourir les différentes feuilles du fichier sélectionné. Et j'en reste à te dire que le code que je propose fonctionne, puisqu'il fonctionne chez moi (et chez tout le monde, sauf toi...)
Voici une petite procédure à tester, et dis-moi si cela fonctionne :
Dans dans ton projet, Met un Module supplémentaire pour essayer, et ce code
=
Sub essai()
' Ouverture d'un fichier Excel
Dim FileToOpen As Variant
FileToOpen = Application.GetOpenFilename("Tout les fichiers Excel (*.xls),")
' Traitement du choix et ouverture du fichier
If FileToOpen <> False Then
Workbooks.Open FileToOpen
Else
MsgBox "ouverture annulée"
Exit Sub
End If
' Ouverture du fichier sélectionné
Dim BonOnglet As Boolean
Dim NbOnglet As Long
For Each Ws In ActiveWorkbook.Worksheets If UCase$(Ws.Name) "FICHE FR" Or UCase$(Ws.Name) "FICHE GB" Then
BonOnglet = True
'Exit For
End If
NbOnglet = NbOnglet + 1
Next
' Renvoi de la réponse
If BonOnglet = True Then
MsgBox "le ficher A au moins une feuille avec le nom FICHE FR ou FICHE GB" & _
vbCrLf & "Le nb de feuille contenu vaut = " & NbOnglet
Else
MsgBox "le fichier n'a PAS de nom FICHE FR ou FICHE GB" & _
vbCrLf & "Le nb de feuille contenu vaut = " & NbOnglet
End If
End Sub
=
Met toi dedans, et lance-le avec F5.
Choisi le fichier que tu veux, et regarde !
=> Cela fonctionne ! chez tout le monde, c'est certain ! et tout le monde peut essayer et confirmer !
Comme tu peux le constater, c'est le code que je t'ai donné.
Maintenant, si les fichiers en questions ne fonctionnent toujours pas chez toi, alors là... envoi moi le tout, et on va voir !
Sinon sur cette base, pas à pas remplace ton code... et test à chaque fois... tu trouveras nécessairement ton pb !
zen69
Messages postés584Date d'inscriptionjeudi 28 décembre 2006StatutMembreDernière intervention29 avril 20101 30 juil. 2008 à 21:14
With tonworkbook
dim i as integer
dim ok as boolean
for i = 0 to .sheets.count if .sheets(i).name "ton nom de feuille" or .sheets(i).name "ton autre nom de feuille" then ok = true
if ok = true then exit for
next i
if ok = true then
msgbox "C'est ok"
else
msgbox "C'est pas ok"
end if
<hr size="2" width="100%" />
zen69 aka Ortho Le Profett