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 :

Recupération d'un format texte dans un classeur fermé via méthode ADODB


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    autodidacte
    Inscrit en
    Novembre 2013
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 517
    Par défaut Recupération d'un format texte dans un classeur fermé via méthode ADODB
    Bonjour,

    J'ai un problème via une récupération d'une feuille dans un classeur fermé via la méthode ADODB....
    J'ai dans mon fichier source la colonne A qui est au format texte et qui contient des nombre commençant par 0 (ex:04512800)

    Lorsque cette feuille est copier dans mon classeur lors de son ouverture, malgré avoir mis la colonne A au format Texte, ces nombre deviennent des nombres sans le "0" devant (ex: 04512800 devient 4512800)

    Comment faire pour éviter ca?
    Pour info j'ai activé la référence: Microsoft ActiveX data object 2.7 Library

    Voici mon 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Private Sub Workbook_Open()
    If Not (ThisWorkbook.ReadOnly) Then
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
        '===================================================================================================
                        'Mise à jour de la base de données
        '===================================================================================================
        Worksheets("Base").Range("A2:I4000").ClearContents
        Dim Source As ADODB.Connection
        Dim Rst As ADODB.Recordset
        Dim ADOCommand As ADODB.Command
        Dim Fichier As String, Plage As String, Feuille As String
     
        'Adresse de la Plage contenant les données à récupérer
        Plage = "A2:I4000"
        Feuille = "Base$" 'n'oubliez pas d'ajouter $ au nom de la feuille.
        'Chemin complet du classeur fermé
        Fichier = "" & Worksheets("Paramètres").Cells(5, 3) & ""
     
        Set Source = New ADODB.Connection
        Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & Fichier & ";Extended Properties=""Excel 8.0;IMEX=1;HDR=No;"";"
        Set ADOCommand = New ADODB.Command
     
        With ADOCommand
        .ActiveConnection = Source
        .CommandText = "SELECT * FROM [" & Feuille & Plage & "]"
        End With
        Set Rst = New ADODB.Recordset
        Rst.Open ADOCommand, , adOpenKeyset, adLockOptimistic
        Set Rst = Source.Execute("[" & Feuille & Plage & "]")
     
        ThisWorkbook.Worksheets("Base").Range("A2").CopyFromRecordset Rst
        Rst.Close
        Source.Close
        Worksheets("Base").Visible = True
        Worksheets("Base").Activate
     
        On Error GoTo SkipFormatting
        Columns("A:A").Select
            Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
                TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
                Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
                :=Array(1, 1)
    SkipFormatting:
        Worksheets("Base").Visible = False
     
        Set Source = Nothing
        Set Rst = Nothing
        Set ADOCommand = Nothing
        Application.Windows(ThisWorkbook.Name).Visible = True
        End If
    End Sub
    Merci de votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Quand je vois que ta plage commence en A2, je me dis que la première ligne est les entêtes de colonnes !

    Comme le dit Clément Marcotte Excel n'est pas une base de données, les champs ne sont pas typé et peut importe que les cellules sources et cible soient aux format texte.

    Ado considère les 10 premières lignes pour typer ses colonnes!

    Dans la configuration de ta connexion, la première colonne s'appel [F1] la deuxième [F2] etc..

    Il faut formater tes colonnes dans ta requête SQL!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sql="select format([F1],'0000'),[F2],[Etc] from..."

  3. #3
    Membre chevronné
    Homme Profil pro
    autodidacte
    Inscrit en
    Novembre 2013
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 517
    Par défaut
    Bonjour Rdurupt et merci pour l'interêt que tu portes à mon problème,

    Merci pour tes explications
    j'ai donc remplacer ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        With ADOCommand
            .ActiveConnection = Source
            .CommandText = "SELECT * FROM [" & Feuille & Plage & "]"
        End With
    par ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        With ADOCommand
            .ActiveConnection = Source
            .CommandText = "SELECT format([F1],'@'),* FROM [" & Feuille & Plage & "]"
        End With
    mais ca ne fonctionne toujours pas, je dois donc me tromper quelque part. J'ai une question concernant ma première colonne s'appelant selon ma requete F1, pourquoi s'appelle t'elle F1? et non pas A:A?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Ado et Excel c'est pas la même chose même si tu te connecte via le driver Excel.

    Il y a le nom physique dans Ado Feid1,2,etc et le nom d'alliance qui serait le la valeur de ta ligne 1 si ta connexion était configuré en HDR=Yes (entête colonne 1).

    Maintenant dans ta requête tu format ta sortie en texte et dans Excel le résultat doit bien être du texte ("10") et pas 10 écris à gauche dans ta cellule. Format modifie la valeur de sortie de la requête, pas comme Ado l'a compris!

    Si il pense avoir à faire à du numérique le jeux son fait! 00001,devient 1 et le format retourne "1".
    UI
    Si tu veux un retour du genre "00001" c'est bien ce format qu'il faut appliquer.

    Format(1,'0000')

    Maintenant si tu veux qu'il n'y ait aucune ambiguïté pour Excel Sql="select ''' & Format([F1] '0000')

  5. #5
    Membre chevronné
    Homme Profil pro
    autodidacte
    Inscrit en
    Novembre 2013
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 517
    Par défaut
    D'accord merci pour tes explications.

    Je ne maitrise pas du tout l'ADO, j'essaye de me renseigné un peu sur les site pour comprendre mais j'étant pas dans le domaine, c'est un peu du charabia parfois mdrr. Et comme c'est un tout autre language, je suis un peu pomé.

    en fait je ne souhaite pas forcément que les nombres soit en texte mais comme certains sont dans ma base avec un "0" devant, j'aimerai juste pas qu'il se fasse squeezer et qui reste la où j'importe la base. Juste que les données se reportent telle qu'elle sont dans la base source

    j'ai donc essayé de multiples tentatives mais rien n'y fait j'ai un message d'erreur suivant à chaque fois: "erreur de syntaxe, opérateur absent"


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     With ADOCommand
            .ActiveConnection = Source
            .CommandText = "SELECT ''' & format([F1],'0000') FROM [" & Feuille & Plage & "]"
     End With
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     With ADOCommand
            .ActiveConnection = Source
            .CommandText = "SELECT * & format([F1] '0000') FROM [" & Feuille & Plage & "]"
     End With
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     With ADOCommand
            .ActiveConnection = Source
            .CommandText = "SELECT * , format([F1] '@') FROM [" & Feuille & Plage & "]"
     End With
    Je ne vois donc pas comment lui dire de mettre la première colonne en texte tout en gardant toute la base
    Je suis désolé, j'ai un peu de mal

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    en mettant HDR à YES et en récupérant depuis A1, on retrouve pas la possibilité étendue du IMEX=1 ?

Discussions similaires

  1. Réponses: 15
    Dernier message: 20/05/2015, 13h23
  2. [XL-2010] ouverture et copie de donnée dans un classeur fermée via connection
    Par bernadin.m dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 02/01/2014, 11h43
  3. [AC-2003] Format Texte Dans Création de Table
    Par Philippe-Auguste dans le forum Access
    Réponses: 6
    Dernier message: 30/09/2009, 08h29
  4. [MySQL] Comparaison de date au format texte dans requete mysql
    Par doudoustephane dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 22/04/2008, 16h27
  5. incrementation d'un format texte dans une zone de texte
    Par frederic.go dans le forum Access
    Réponses: 6
    Dernier message: 18/10/2005, 14h47

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