Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 [Résolu] - [VBA] Récupérer le nom de la feuille 1 d'un fichier externe ouvert dans la procédure

Fredox

XLDnaute Occasionnel
Bonjour,

Grâce à la macro suivant, j'ouvre un fichier externe pour récupérer les donneées d'une feuille au nom déja défini:

VB:
' ------------------------------------------------------------------------------------------------------------------------------------------------
   
    Dim Shell, DesktopPath
    Set Shell = CreateObject("WScript.Shell")
    DesktopPath = Shell.SpecialFolders("Desktop")
    ChDir DesktopPath
   
FichierImport = Application.GetOpenFilename("Fichier (*.mhtml; *.xlsx), *.mhtml; *.xlsx", , "Selectionnez votre fichier 'ANGLI Batteries'")
' FichierImport = Environ("USERPROFILE") & "\Desktop\Export\01 - ANGLI Batterie.MHTML"
If FichierImport = "Faux" Then GoTo Fin

ExtNom = Mid(FichierImport, InStrRev(FichierImport, ".") + 1)

A_Patientez ' <----- Boite de dialogue  |  Patientez

Application.StatusBar = "Importation des données...)"
'ActiverPatientez

'>----------<
On Error Resume Next
Worksheets(1).ShowAllData
On Error GoTo 0

' <---------- Supprime la feuille Sh_Importation si elle existe déja
On Error Resume Next
Sheets("Sh_Importation").Delete
On Error GoTo 0

' Ajoute une feuille nomée "Sh_Importation"
Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = "Sh_Importation"

' Copie le fichier ".MHTML" vers ".xlsx"
    Workbooks.Open Filename:=FichierImport
    ActiveWorkbook.SaveAs Filename:=Environ("USERPROFILE") & "\Desktop\Fichier01.xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
    fichier01 = Environ("USERPROFILE") & "\Desktop\Fichier01.xlsx"

' Ferme le classeur
Workbooks("Fichier01.xlsx").Close False

    Dim Cn As ADODB.Connection
    Dim NomFeuille As String, texte_SQL As String
    Dim Rst As ADODB.Recordset
   
    'Définit le classeur fermé servant de base de données
    'Nom de la feuille dans le classeur fermé
    NomFeuille = "Sheet1"
   
    Set Cn = New ADODB.Connection
   
    '--- Connexion ---
    With Cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
            & fichier01 & ";Extended Properties=""Excel 12.0;HDR=NO;""" ' HDR=YES pour ne pas récupérer le contenu de la première ligne
        .Open
    End With
    '-----------------
   
    '... la requête ...
    '
    texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
   
    Set Rst = New ADODB.Recordset
    Set Rst = Cn.Execute(texte_SQL)
   
    'Ecrit le résultat de la requête dans la cellule A2
    Range("A1").CopyFromRecordset Rst
   
    '--- Fermeture connexion ---
    Cn.Close
    Set Cn = Nothing


' ------------------------------------------------------------------------------------------------------------------------------------------------


J'aimerais que le nom de feuille défini actuellement par "Sheet1" soit remplacé par le nom de la première feuille du fichier sur lequel la connexion se fait.
Jai essayer de placer un simpe NomFeuille = Worksheets(1).Name après "La requête", sans succes.

Quelqu'un aurait-il une idée ?


Merci
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Vous voulez quoi au fond ?
Simplement récupérer tout le contenu de la 1ère feuille d'un autre classeur connu ?
Et vous êtes sûr qu'il vous faut quelque chose d'aussi compliqué pour ça ?
L'ouvrir, le sauvegarder sous un autre nom, le fermer, puis utiliser sur celui là un dispositif pour récupérer les données d'un classeur fermé ?
Il me semble y avoir beaucoup de contradictions là dedans !
 

Fredox

XLDnaute Occasionnel
Bonjour Dranreb,

Merci de votre intérêt à mon post.
Le but rechercher: importer dans mon classeur ouvert la feuille 1 du fichier sélectionner
Comme mes noms de feuilles diffèrent, j'ai besoin que le nom ne soit pas figé.
C'est "juste" cela que je cherche a faire

Merci encore
 

fanch55

XLDnaute Barbatruc
bonjour,
pour obtenir le nom véritable de la table ( ou feuille dans ce cas ) sur laquelle vous allez "re-quêter",
mettez juste avant votre requête de select :
Code:
            With CreateObject("ADOX.Catalog")
                .ActiveConnection = Cn
                NomFeuille = .Tables(0).Name
            End With
 

Fredox

XLDnaute Occasionnel
Danreb,

La question qui demandait si cela servait d'avoir quelque chose d'aussi compliqué m'a interpelé:
- Depuis ce matin, je n'ai plus besoin d'importer les données depuis un fichier *.MHTML
- Du coup c'est vrai que plutot que de me reposer sur ma base, j'ai tout refait
- Et importer la feuille 1 est très simple

Mon code:
VB:
Private Sub Importation()

Application.ScreenUpdating = False
Application.DisplayAlerts = False

' <---------- Supprime la feuille si elle existe déja
On Error Resume Next
Sheets("Import").Delete
On Error GoTo 0
0:
' <--------------------------------------------------

Dim i As Integer
Dim nom As String
 Dim ClasseurDestination As String
 Dim ClasseurSource As String
 Dim Chemin As Variant


Chemin = Application.GetOpenFilename("Classeurs Excel (*.xlsx), *.xlsx")
Workbooks.Open (Chemin)

ClasseurSource = ActiveWorkbook.Name
Workbooks(ClasseurSource).Activate
FeuilleSource = Worksheets(1).Name
ClasseurDestination = ThisWorkbook.Name
Sheets(FeuilleSource).Select
Sheets(FeuilleSource).Copy After:=Workbooks(ClasseurDestination).Sheets(1)
Sheets(FeuilleSource).Move After:=Sheets(Sheets.Count)

Workbooks(ClasseurDestination).Sheets(1).Activate
Workbooks(ClasseurDestination).Worksheets("Sheet1").Name = "Import"
Workbooks(ClasseurSource).Close

Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub

Merci pour le post !!!
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…