Nom d'onglet inconnu

Bonjour,

Ce petit bout de programme est très bien pour lire des infos dans un dossier contenant des fichiers Excel et en récupérant quelques infos sans les ouvrir

Sub Importer()
Dim i As Long
Dim sDossier As String, sFichier As String, sFeuille As String, DerniereLigne
CreationListe
    Application.ScreenUpdating = False
    ShDatas.Range("B:B").Clear
    sDossier = Range("E1").Value
    sFeuille = ActiveSheet.Name
DerniereLigne = Range("A" & Rows.Count).End(xlUp).Row
    For i = 1 To DerniereLigne
        With ShDatas
            sFichier = Range("A" & i)
            .Range("B" & i) = ExtraireValeur(sDossier, sFichier, sFeuille, "A1")
        End With
    Next i
    Application.ScreenUpdating = True
End Sub

Cependant les fichiers dans le dossier sont identique sauf le nom des onglets, il me faut récupérer le premier nom d'onglet

Mais comment puis je faire ça ?

Merci pour votre aide

Eric

Bonsoir,

l'instruction Sheets(1) sous VBA pointe sur la feuille visible (je crois) la plus à gauche du classeur.

Donc sans connaître son nom, utilisons son Index

@ bientôt

LouReeD

Bonsoir LouReeD,

tu a écrit :

l'instruction Sheets(1) sous VBA pointe sur la feuille visible (je crois) la plus à gauche du classeur.

petite confirmation du « (je crois) » : même si la 1ère feuille est masquée, Sheets(1) référence cette 1ère feuille cachée, et Sheets(1).Name retourne le nom de cette feuille cachée ; idem avec Worksheets(1) et Worksheets(1).Name

dhany

Merci pour l'aide, j'ai essayé mais ça ne marche pas :

Worksheets(1).Name

Au vu de ceci :

pointe sur la feuille visible (je crois)

Ce n'est pas une rectification qu'il faut faire...

Ce n'est plus une affirmation, mais une supposition, non ?

Mais de toutes façons vous êtes comme cela, toujours à pointer sur les erreurs des autres...

@ bientôt

LouReeD

Qu'est pour vous le "dossier" ?

Cependant les fichiers dans le dossier sont identique sauf le nom des onglets, il me faut récupérer le premier nom d'onglet

Est-ce le classeur entier ? ou bien un dossier "Windows" dans lequel il y a plusieurs classeurs qui eux même contiennent plusieurs feuilles ou onglet ?

@ bientôt

LouReeD

@Jefekoi

tu a écrit :

Merci pour l'aide, j'ai essayé mais ça ne marche pas :

Worksheets(1).Name

??? j'ai vérifié avec ce fichier :

seule la 2ème feuille est visible

Ctrl e ➯ affichage du nom de la 1ère feuille masquée :

"Feuil1" ... et pas "Feuil2"


@LouReeD

tu a écrit :

si je t'ai vexé ou offensé, c'était pas mon intention !

dhany

Loin de là ! et je pourrais vous retourner le message !

Je disais juste que je pensais que c'était la première feuille visible (je crois) donc je met un doute donc d'une affirmation je passe à une hypothèse qu'il de ce pas essayer, et c'est ce que vous avez fait !

De mon coté je cherche ce qui ne se compte pas, mais même masquées les feuilles "apparaissent" dans worksheets.count, mais je crois que c'est par là "ma trace" de doute car suivant le type de feuille (graph ou autre) worksheets.count le les compte pas à moins que ce soit une autre commande...

Pour ce qui est du problème, sans avoir la procédure appelée (si s'en est une autant c'est une instruction native de VBA) je ne vois pas trop comment cela fonctionne et ce que cela va "voir" ou "chercher"...

@ bientôt

LouReeD

quand une feuille est masquée, elle doit quand même rester accessible pour Sheets.Count ou Worksheets.Count afin de retourner le nombre réel de feuilles, même s'il y a des feuilles masquées ; mais Worksheets est un sous-ensemble de Sheets : c'est uniquement les feuilles de calcul, pas les autres : ni les feuilles graphiques, ni les feuilles d'anciennes macros XL4, ni les anciennes feuilles de boîte de dialogue (qui ont été remplacées par les UserForm) ; donc c'est normal que Worksheets.Count compte uniquement les feuilles de calcul et pas les autres ; mais il compte quand même les feuilles de calcul masquées.

de plus, ça doit pouvoir rester accessible aussi pour démasquer la feuille : de xlSheetHidden à xlSheetVisible !

(et même de xlSheetVeryHidden à xlSheetVisible ! )

d'autre part, si les feuilles masquées n'étaient plus accessibles, on pourrait plus travailler avec : ni les lire, ni y écrire !

dhany

Merci à tous pour votre aide,

Je n'ai pas parlé de feuille masquée

Mais juste récupérer un nom

Dans les fichiers du dossier il y a différents noms (de fichiers) mais chaque fichier à un seul onglet et je vais chercher les infos toujours dans la même cellule le seul truc qui m'embête c'est le nom de l'onglet qui lui n'a pas toujours le même nom.

Dim i As Long
Dim sDossier As String, sFichier As String, sFeuille As String, DerniereLigne
CreationListe
    Application.ScreenUpdating = False

    ShDatas.Range("B:B").Clear
    sDossier = Range("E1").Value
    sFeuille = Worksheets(1).Name
DerniereLigne = Range("A" & Rows.Count).End(xlUp).Row
    For i = 1 To DerniereLigne
        With ShDatas
            sFichier = Range("A" & i)
            .Range("B" & i) = ExtraireValeur(sDossier, sFichier, sFeuille, "B1")

'            .Cells(2, i) = CDate(Cells(2, i))
        End With
    Next i

    Application.ScreenUpdating = True
End Sub

Il me renvoie : #REF!

donc sheets(1) suffit sans avoir besoin de son nom.

S'il vous faut le nom de l'onglet unique d'un classeur alors $Feuille = Workbooks(Fichier).Sheets(1).Name

Je pense, je ne suis pas sur... c'est une hypothèse...

@ bientôt

LouReeD

Si je fait ça

    For i = 1 To DerniereLigne
        With ShDatas
            sFichier = Range("A" & i)
            sFeuille = Sheets(1).Name
            .Range("B" & i) = ExtraireValeur(sDossier, sFichier, sFeuille, "B1")
           .Range("C" & i) = sFeuille
'            .Cells(2, i) = CDate(Cells(2, i))
        End With
    Next i
    

Le résultat est = Feuil1 alors que si j'ouvre les fichiers la plupart on le nom : "Report" pas tous mais la plus part .

sans donner le nom du classeur avant l'instruction Sheets(1).Name, alors ce sera le nom de la première feuille du classeur actif qui sera retourné !

Il faut donc spécifier de quel classeur on parle c'est pourquoi je disais : $Feuille = Workbooks(Fichier).Sheets(1).Name

@ bientôt

LouReeD

Merci à tous pour vos réponses

Passez de bonnes fêtes

Je reviendrais sur le sujet une fois que je l'aurais testé à mon retour

Eric

Bonjour.

DerniereLigne = Range("A" & Rows.Count).End(xlUp).Row
    For i = 1 To DerniereLigne
        With ShDatas
            sFichier = Range("A" & i)
            sFeuille = Sheets(1).Name  ' "Report"
            .Range("B" & i) = sFeuille
         End With
    Next i

J'ai tout essayé rien à faire ...

Je lui demande de m'afficher le nom de l'onglet il m'affiche Feuil1 alors que le vrai nom est Report

Je viens de comprendre

Ce que je cherche à obtenir c'est le nom de l'onglet du fichier fermé

ma formule lui demande la feuille active donc sur le fichier principale et non celui qui est fermé

Comment puis récupérer le nom de l'onglet fermé ?

Essayez ce qui est inscrit dans mon message du 21/12 à 21h33 un peu plus haut...

@ bientôt

LouReeD

Merci LouReed

Voici ce que j'ai mis

En A i c'est le nom du fichier

    For i = 1 To DerniereLigne
        With ShDatas
            sFichier = Range("A" & i)
            sFeuille = Workbooks(sFichier).Sheets(1).Name
            .Range("B" & i) = ExtraireValeur(sDossier, sFichier, sFeuille, "B2")
            .Range("C" & i) = sFeuille
        End With
    Next i

Et il me retourne .

Erreur d’exécution '9'

L'indice n'appartient pas à la sélection

Bonsoir Jefekoi, LouReeD,

tu a écrit :

Et il me retourne Erreur d’exécution '9' L'indice n'appartient pas à la sélection

dans ton court extrait de code VBA, ça peut arriver uniquement pour ce qui utilise la variable i ; or tout est correct : Range("A" & i) ; .Range("B" & i) ; .Range("C" & i) : aucun n'est en cause car les cellules Ai Bi Ci existent forcément ; note que i = 0 ou i > 1 048 576 ➯ plantage car ces lignes n'existent pas, mais le message d'erreur est autre :

'Erreur d'exécution '1004': La méthode 'Range' de l'objet '_Global' a échoué

et si i est en dehors des bornes du type spécifié :

'Erreur d'exécution '6': Dépassement de capacité

la seule explication qui reste est que ShDatas est incorrect ! malheureusement, même dans la sub complète Importer() de ton post initial, on ne voit pas à quoi ça fait référence ! c'est ça qui faut vérifier, et si c'est sur les feuilles d'une boucle

For Each shDatas in Sheets : ça plante si une des feuilles n'est pas une feuille de calcul : feuille graphique par exemple.

alors qu'avec une boucle For Each shDatas in Worksheets : impossible que ça plante, car Worksheets est l'sous-ensemble des feuilles de calcul uniquement !


à tout hasard : vérifie aussi si t'as pas oublié un point devant le 1er Range : .Range("A" & i) ; idem pour d'autres Range de ta sub Importer()

dhany

Rechercher des sujets similaires à "nom onglet inconnu"