Nom d'onglet inconnu

edit : ça peut arriver aussi pour Workbooks(sFichier) si sFichier est incorrect ! voilà c'que c'est de dire qu'y'a une erreur sans dire sur quelle ligne ça plante ! ça complique le débogage ! en plus qu'on n'a pas ton fichier, c'est coton !

dhany

Merci dhany

Voici mon fichier en question voir macro 'Importer'

Il est en état brouillon pour le moment

Bon réveillon à tous

Eric

9recherche1.zip (17.28 Ko)

Bonsoir Eric,

* la sub CreationListe() fait la liste des fichiers *.xlsx

de ton dossier C:\Users\Eric\Desktop\Archives

dont le nom commence par "D" ou "S"

* si y'a aucun d'ces fichiers, y'a alors aucune donnée sur la feuille de calcul

➯ la variable sFichier est vide

➯ variable Argument (avec rien entre les crochets) :

"'C:\Users\Eric\Desktop\Archives\[]Feuil1'!R2C2"

➯ cette image :

screen

pour éviter cette erreur, ajout d'un test If ici :

        With ShDatas
            sFichier = Range("A" & i)
            If sFichier <> "" Then
              sFeuille = Sheets(1).Name  '"Report"
              .Range("B" & i) = ExtraireValeur(sDossier, sFichier, sFeuille, "B2")
'             .Cells(2, i) = CDate(Cells(2, i))
              .Range("C" & i) = sFeuille
            End If
        End With

ça évite l'erreur, mais c'est tout : ça fait rien de plus !

dhany

@Jefekoi

lis d'abord mon post précédent, puis celui-ci.

* j'ai créé dans le dossier ..\Desktop\Archives quelques fichiers (vides) *.xlsx dont le nom commence par "D" ou "S"

* la sub CreationListe() fait la liste des fichiers correctement ➯ la feuille de calcul n'est plus vide :

screen

tout est ok, mais bien sûr, comme ce sont des fichiers d'essai vides (qui ont été faits juste pour des noms adéquats et avoir une liste), la colonne B ne comporte que des 0.

s'il fallait régler une erreur de type de données, je t'aurais dit que ça dépend des données qui sont dans tes fichiers, mais il s'agit d'une autre erreur ; or je n'ai pas eu ton Erreur d’exécution '9': L'indice n'appartient pas à la sélection

faudrait qu'tu indiques quelle manip tu fais pour aboutir à ça, et si ça arrive en fonction des données d'un de tes fichiers D*.xlsx ou S*.xlsx j'vois mal comment on pourrait t'aider sans ces fichiers vu qu'on peut pas lire leur contenu, ni reproduire l'erreur !

bonne chance ! et bon réveillon à toi aussi !

dhany

Merci dhany c'est déjà bien gentil de m'aider jusque là.

J'ai suivi tes conseils effectivement je n'ai pas mis la condition que tu me conseil , ce n'est pas encore ce qui me gène

Par contre ce que j'aimerais obtenir c'est le nom de l'onglet qu'il va chercher et ça je n'ai pas encore trouvé .

Joyeux Noël à tous

La plupart des fichiers qu'il va chercher ont un onglet "Report" mais pas tous

Si je retire

sFeuille = Sheets(1).Name

pour mettre

sFeuille ="Report"

là il n'y a aucun problème il lit bien les info en B2 ; mais comme j'ai dit ils n'ont pas tous le même nom d'onglet

L'erreur 9 viens de là : sFeuille = Workbooks(sFichier).Sheets(1).Name

    For I = 1 To DerniereLigne
        With ShDatas
            sFichier = Range("A" & I)
            If sFichier <> "" Then
              sFeuille = Workbooks(sFichier).Sheets(1).Name
              .Range("B" & I) = ExtraireValeur(sDossier, sFichier, sFeuille, "B2")
              .Range("C" & I) = sFeuille
            End If
        End With
    Next I
capture

Bonsoir Eric,

tu a écrit :

L'erreur 9 vient de là : sFeuille = Workbooks(sFichier).Sheets(1).Name

Sheets(1) est la 1ère feuille du classeur, et elle existe forcément puisqu'un classeur Excel contient toujours au moins une feuille

si tu sais utiliser les différentes méthodes de débogage (points d'arrêt, variable espion...), profites-en !

dhany

pour ton post de 10:20, je pense que tu as inversé, et que ça doit plutôt être :

* avec sFeuille = Sheets(1).Name : y'a aucun problème (comme écrit dans mon post précédent, il existe forcément une 1ère feuille d'un classeur)

* si je mets sFeuille ="Report" : ça pose problème, car la plupart des fichiers ont un onglet "Report" mais pas tous ; alors forcément, quand ça arrive que cet onglet "Report" n'existe pas : boum, ça plante !

comme pourrait te le dire jmd : quelle que soit la version de VBA, ça peut pas lire la propriété Nom d'une feuille inexistante !

dhany

bonjour,

La seul que je voudrais est qu'il lise dans un dossier mes fichiers xlsx et me donne ce qu'il y a dans la cellule B2

pour le moment je ne veux rien d'autre

Merci pour votre aide

@Eric

tu a écrit :

La seule chose que je voudrais est qu'il lise dans un dossier mes fichiers xlsx et me donne ce qu'il y a dans la cellule B2

oui, d'accord, mais si cette cellule B2 est celle de la feuille "Report", et que cette feuille n'existe pas, tu retombes forcément sur le même problème ! donc :

1) si la feuille "Report" existe : OK, pas de problème : tu peux lire la cellule B2 de la feuille "Report".

2) si la feuille "Report" n'existe pas, que faut-il faire ? tu dois détecter la non-existence de la feuille "Report" pour éviter de la lire (sinon, plantage !) ; donc ensuite, si la feuille n'existe pas, tu as ce choix : soit tu ne fais rien du tout ; soit tu lis la cellule d'une autre feuille de remplacement qui elle existe toujours (pour pas retomber dans le problème identique de feuille inexistante) ; et ça, c'est à toi de choisir en fonction du job que tu veux réaliser : je peux pas le deviner, ni le décider pour toi.

dhany

Bonjour et merci pour l'aide.

C'est pour cela que je voudrais comprendre l'utilisation de Sheets(1).Name

On ne peut pas mettre un truc juste devant pour lui demander de vérifier dans un fichier en A1 exemple :

sDossier = "C:\Users\Eric\Desktop\Archives\"
sFichier = Range("A" & I)
sDossier.sFichier.Sheets(1).Name

Je sais que ce n'est pas cette formule mais en existe-il une similaire ?

Enfin je sais que tous les fichiers on un seul onglet et que l'info que je veux chercher est toujours en B2

Bonne journée

Eric

J'ai trouve une façon de faire mais ce n'est pas l’idéal

Sub Importer()
Dim I As Long
Dim sDossier As String, sFichier As String, sFeuille, DerniereLigne, Slocal
CreationListe
    Application.ScreenUpdating = False
    ShDatas.Range("B:B").Clear
DerniereLigne = Range("A" & Rows.Count).End(xlUp).Row
Set appExcel = CreateObject("Excel.Application")

    For I = 1 To DerniereLigne
        With ShDatas
        sDossier = "C:\Users\Eric\Desktop\Archives\"
        sFichier = Range("A" & I)
        Fichier = sDossier & sFichier
Set wbExcel = appExcel.Workbooks.Open(Filename:=Fichier)
NomFeuille = appExcel.Sheets(1).Name
wbExcel.Close
Set wbExcel = Nothing
            sFeuille = NomFeuille ' "Report" ' Sheets(1).Name
            Slocal = "B2"
           .Range("B" & I) = GetValue(sDossier, sFichier, NomFeuille , Slocal)
           .Range("C" & I) = sFeuille
        End With
    Next I

    Application.ScreenUpdating = True
End Sub

Bonjour Eric,

tu a écrit :

je sais que tous les fichiers on un seul onglet et que l'info que je veux chercher est toujours en B2

dans c'cas, il suffit de lire la cellule B2 sans référence de feuille : ça s'ra donc toujours la cellule B2 d'la feuille active, qui est l'unique feuille du classeur.


essaye ceci :

Sub Importer()
Dim I As Long
Dim sDossier As String, sFichier As String, sFeuille, DerniereLigne, Slocal
    CreationListe
    Application.ScreenUpdating = False
    ShDatas.Range("B:B").Clear
    sDossier = "C:\Users\Eric\Desktop\Archives\": Slocal = "B2"
    DerniereLigne = Range("A" & Rows.Count).End(xlUp).Row
    Set appExcel = CreateObject("Excel.Application")

    With ShDatas
        For I = 1 To DerniereLigne
            sFichier = Range("A" & I)
            Fichier = sDossier & sFichier
            '------------------------------------------------------------------
            Set wbExcel = appExcel.Workbooks.Open(Filename:=Fichier)
            NomFeuille = appExcel.Sheets(1).Name
            wbExcel.Close
            Set wbExcel = Nothing
            '------------------------------------------------------------------
            sFeuille = NomFeuille ' "Report" ' Sheets(1).Name
            .Range("B" & I) = GetValue(sDossier, sFichier, NomFeuille, Slocal)
            .Range("C" & I) = sFeuille
        Next I
    End With

End Sub

Application.ScreenUpdating = True : inutile de l'mettre à la fin, car même sans, c'est fait automatiquement et implicitement, juste avant la sortie de sub

With ShDatas et sDossier = "C:\Users\Eric\Desktop\Archives\" : évite de les mettre dans la boucle For ! c'est inutile que ça lise ces instructions à chaque tour de boucle : une seule fois suffit ! Slocal = "B2" : idem


bonne journée à toi aussi !

dhany

Bonjour,

Si on ouvre le fichier, autant récupérer les données !...

Cdlt.

Sub Importer()
Dim wb As Workbook
Dim I As Long
Dim sDossier As String, sFichier As String, sFeuille As String
Dim DerniereLigne As Long
Dim valeur
    CreationListe
    Application.ScreenUpdating = False
    ShDatas.Range("B:B").Clear
    sDossier = "C:\Users\Eric\Desktop\Archives\"
    DerniereLigne = Range("A" & Rows.Count).End(xlUp).Row
    With ShDatas
        For I = 1 To DerniereLigne
            sFichier = Range("A" & I).Value
            sFichier = sDossier & sFichier
            '-------------------------------------------
            Set wb = Workbooks.Open(Filename:=sFichier)
            sFeuille = wb.Sheets(1).Name
            valeur = sFeuille.Cells(2, 2).Value
            wb.Close savechanges:=False
            Set wb = Nothing
            '-------------------------------------------
            .Range("B" & I) = valeur
            .Range("C" & I) = sFeuille
        Next I
    End With
End Sub

Bonjour Jean-Eric,

merci pour le complément !

dhany

Merci pour votre aides

Il est vrai que j'aurai aimé ne pas ouvrir les fichiers

Par contre Jean-Eric il me fait une erreur

capture

Re,

Essaie ainsi :

Set wb = Workbooks.Open(Filename:=sFichier)
            With wb
                sFeuille = .Worksheets(1).Name
                valeur = .Worksheets(sFeuille).Cells(2, 2).Value
                .Close savechanges:=False
            End With
            Set wb = Nothing

C'est bon ça marche merci Jean-Eric

Rechercher des sujets similaires à "nom onglet inconnu"