IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[XL-2010] Question à propos de ADOX


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 26
    Par défaut [XL-2010] Question à propos de ADOX
    Bonjour,

    J'ai réutilisé ce code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Option Explicit
     
    Sub Tst()
    Dim Cn As ADODB.Connection
    Dim oCat As ADOX.Catalog
    Dim Fichier As Variant
    Dim Feuille As ADOX.Table
    Dim Rst As ADODB.Recordset
    Dim texte_SQL As String
    Dim Ar() As String, i As Long
     
        Fichier = Application.GetOpenFilename("Fichier Excel, *.csv;*.xls")
        If Fichier = False Then Exit Sub
     
        Set Cn = New ADODB.Connection
        Set oCat = New ADOX.Catalog
     
        Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Fichier & ";Extended Properties=Excel 8.0;"
     
        Set oCat.ActiveConnection = Cn
        For Each Feuille In oCat.Tables
            i = i + 1
            ReDim Preserve Ar(i)
            Ar(i) = Feuille.Name
        Next Feuille
     
        texte_SQL = "SELECT * FROM [" & Ar(1) & "]"
     
        Set Rst = New ADODB.Recordset
        Set Rst = Cn.Execute(texte_SQL)
     
        Range("A2").CopyFromRecordset Rst
     
        Set Feuille = Nothing
        Set oCat = Nothing
        Cn.Close
        Set Cn = Nothing
     
    End Sub
    Cependant, si j'ai bien compris, ce code permet de trier les noms de feuilles du classeur. Je cherche uniquement à récupérer le nom de la première feuille, quel qu’il soit.

    J'ai essayer des différentes manières ( sans utiliser ADOX et en utilisant Sheets(1)) et en essayer de modifier la boucle ForEach pour ne récupérer que la première valeur mais je ne trouve pas de solution. Pouvez vous m'aider à trouver une solution?

    Merci d'avance
    Tohrak

  2. #2
    Invité
    Invité(e)
    Par défaut Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim SheetName as string
    SheetName=sheets(1).Name

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 26
    Par défaut
    Bonjour,

    Merci pour votre réponse.

    Cette commande me permet de récupérer le nom de la feuille du classeur actif, alors que je voudrais récupérer le nom de la première feuille du classeur auquel je suis connecter grâce au ADODB.

  4. #4
    Invité
    Invité(e)
    Par défaut
    pour récupérer le nom de la première feuille de ton classeur:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Sub Tst()
    Dim Cn As ADODB.Connection
    Dim oCat As ADOX.Catalog
    Dim Fichier As Variant
    Dim Feuille As ADOX.Table
    Dim Rst As ADODB.Recordset
    Dim texte_SQL As String
    Dim Ar() As String, i As Long
     
        Fichier = Application.GetOpenFilename("Fichier Excel, *.csv;*.xls")
        If Fichier = False Then Exit Sub
     
        Set Cn = New ADODB.Connection
        Set oCat = New ADOX.Catalog
     
        Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Fichier & ";Extended Properties=Excel 8.0;"
     
        Set oCat.ActiveConnection = Cn
    '    Debug.Print oCat.Tables(0).Name
    '    For Each Feuille In oCat.Tables
    '        i = i + 1
    '        ReDim Preserve Ar(i)
    '        Ar(i) = Feuille.Name
    '    Next Feuille
     
        texte_SQL = "SELECT * FROM [" & oCat.Tables(0).Name & "]"
     
        Set Rst = New ADODB.Recordset
        Set Rst = Cn.Execute(texte_SQL)
     
        Range("A2").CopyFromRecordset Rst
     
        Set Feuille = Nothing
        Set oCat = Nothing
        Cn.Close
        Set Cn = Nothing
     
    End Sub
    Dernière modification par AlainTech ; 26/04/2014 à 01h07. Motif: Suppression de la citation inutile

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 26
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    texte_SQL = "SELECT * FROM [" & oCat.Tables(0).Name & "]"
    Cette ligne marche correctement. Mais elle ne me renvoie toujours pas la bonne valeur. Je m'explique: les classeurs que j'ouvre possèdent, normalement, deux feuilles. Seul la première m'intéresse car je dois récupérer les valeurs de cette première feuille. Il faut que je puisse récupérer les valeurs de la première feuille quelque soit le nom et quelque soit le nombre de feuilles existantes.

    Le code que vous m'avez proposé me renvoie ma deuxième feuille en Tables(0) et ma première feuille en Tables(1). Donc la question est: est-ce que il y a un tri alphabétique directement dans le oCat.Tables ou est-ce que le tableau est crée de manière "inverse" ( Avec la première feuille à la fin et la dernière feuille au début)

    Edit: D'après mes test le oCat.Tables tri déjà le nom des pages par ordre alphabétique du coup ça ne m'arrange pas trop (je dois principalement traité des feuilles qui s'appellent soit feuil1 soit sheet1) Pour le moment je ne vois que la solution de passer par un If avant mais si quelqu'un à une autre solution je suis preneur ( dans le cas où un client mettrais un autre nom à sa feuille)

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Regarde si c'est ce que tu souhaite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    Sub Test()
     
        MsgBox NomFeuille("F:\MonClasseur.xls")
     
    End Sub
     
    Function NomFeuille(Fichier As String) As String
     
        Dim Con As Object
        Dim Cat As Object
        Dim Feuille As Object
     
        'crée les objets de connection au classeur
        Set Con = CreateObject("ADODB.Connection")
        Set Cat = CreateObject("ADOX.Catalog")
     
        Set Feuille = CreateObject("ADOX.Table")
     
        Con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
                 & Fichier & _
                 ";Extended Properties=Excel 8.0;"
     
        Set Cat.ActiveConnection = Con
     
        'retourne le nom de la 1ère feuille
        NomFeuille = Replace(Cat.Tables(0).Name, "$", "")
     
        'mets fin à la connection
        Con.Close
     
    End Function
    Hervé.

Discussions similaires

  1. Question à propos des compilateurs
    Par elf dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 20/07/2005, 18h00
  2. Question à propos des niveaux de transaction
    Par davy.g dans le forum Oracle
    Réponses: 3
    Dernier message: 18/01/2005, 16h31
  3. Petite question à propos du redbook...
    Par Michaël dans le forum OpenGL
    Réponses: 3
    Dernier message: 04/11/2004, 13h54
  4. Petite question à propos d'une requete
    Par ViBy dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/09/2004, 13h21
  5. Une question à propos des thread
    Par tscoops dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/11/2003, 15h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo