[Excel | VBA] Identification de feuil dans un classeur

Signaler
Messages postés
80
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
30 juillet 2008
-
Messages postés
584
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
29 avril 2010
-
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 ?

Cordialement,

AiDuK

17 réponses

Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
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é"
   
End Sub



=

Amicalement,
Us.
Messages postés
80
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
30 juillet 2008

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.


Je ne sais pas pourquoi ...
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Quel est ton code complet (enfin de la partie pour faire ce que tu dis)

Amicalement,
Us.
Messages postés
80
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
30 juillet 2008

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
     
               .Range("A" & ProchaineLigneVide).Value = Workbooks("GestionFIQ.xls").Sheets("Présentation").Range("E100").Value
               .Range("B" & ProchaineLigneVide).Value = Ws.Range("D11").Value
               .Range("C" & ProchaineLigneVide).Value = Ws.Range("D10").Value
               .Range("D" & ProchaineLigneVide).Value = Ws.Range("O10").Value
               .Range("E" & ProchaineLigneVide).Value = Ws.Range("P2").Value
               .Range("F" & ProchaineLigneVide).Value = Ws.Range("B16").Value
               .Range("G" & ProchaineLigneVide).Value = Workbooks("gestionfiq.xls").Sheets("Liste Fournisseurs").Range("g1").Text
               .Range("H" & ProchaineLigneVide).Value = Workbooks("gestionfiq.xls").Sheets("Liste fournisseurs").Range("g2").Text
              
           End With
 
       
    No = Workbooks("GestionFIQ.xls").Sheets("présentation").Range("E100").Value
       
    MsgBox ("Nouvelle F.I.Q. N° " & No)
    ActiveWorkbook.Close
    Workbooks("GestionFIQ.xls").Close SaveChanges:=True
Exit Sub


    End If
    MsgBox mes1
    End Sub
Messages postés
797
Date d'inscription
mardi 7 juin 2005
Statut
Membre
Dernière intervention
23 février 2011
6
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

Molenn
Messages postés
80
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
30 juillet 2008

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
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
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...

Amicalement,
Us.
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Voilà une idée...

Dim BonOnglet As Boolean



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
Next



If BonOnglet = False Then
    '....
    Exit Sub
End If



' sinon continue



Amicalement,
Us.
Messages postés
80
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
30 juillet 2008

D'accord, mais peux tu être un peux plus explicite s'il te plait, j'avoue que je n'ai pas tout suivi sur le marqueur boolean
Messages postés
80
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
30 juillet 2008

Je viens de tester ta proposition , mais il persiste à ne vérifier que la 1ere feuille du classeur, je ne sais pas pourquoi  : \
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
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

Amicalement,
Us.
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Lire :
il n'est pas certain comme évoqué précédemment que le bon classeur soit actif

au lieu de :
il n'est certain comme évoqué précédemment que le bon soit actif

Us.
Messages postés
80
Date d'inscription
lundi 22 octobre 2007
Statut
Membre
Dernière intervention
30 juillet 2008

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à
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
10
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

etc.

A+
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
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 !

Amicalement,
Us.
Messages postés
584
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
29 avril 2010
1
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
 
Messages postés
584
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
29 avril 2010
1
hum pas sure mais tu deveras peut-etre utiliser for i = 1 to .sheets.count

<hr size ="2" width="100%" /> 
  zen69 aka Ortho Le Profett