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 :

Modification d'un fichier excel fermé (ADODB) et requête pour importer les données à partir d'une clef


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2013
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 81
    Par défaut Modification d'un fichier excel fermé (ADODB) et requête pour importer les données à partir d'une clef
    Bonjour à tous,

    Je suis complètement bloqué sur un codage. Je voudrais à partir d'un fichier "File_Source.xlsx" importer ses valeurs vers un fichier "File_Target".
    En particulier, je voudrais modifier la colonne nommée "AModif" (l'endroit de la colonne peut varier !) dans le fichier "File_Target" à partir de la colonne C de mon fichier "File_Source".
    Pour cela, je voudrais utiliser une clef unique "Id".

    Dans la mesure où cette modif doit être rapide et s'effectuer par la suite dans plusieurs fichiers, je préférerais passer par une méthode ADODB. Malheureusement je ne suis pas familiarisé avec la méthode et j'ai perdu mes notions de SQL.

    J'ai réussi à updater mes valeurs via un code SQL UPDATE Feuill$ SET Id1=ChampStocké(i) WHERE AModif=ChampStocké2(i).
    Malheureusement en fonction des fichiers, le programme va penser que la colonne clef "Id" est numérique, parfois il va penser que la colonne clef est texte. Serait-il possible de ne rapprocher QUE si le champ est considéré comme numérique ?

    Quelqu'un saurait-il m'aider ?

    Merci beaucoup,
    Novice_vba


    Edit: Je vois que personne n'a pu m'aider. J'aurais du donner mon code, désolé. Le voici (dans AModif(i) et Id(i) se trouvent des valeurs pré-enregistrées du fichier "File_Source") :
    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
    Exemple(Fichier As String, NomFeuille As String)
     
        Dim Cn As ADODB.Connection
        Dim Cd As ADODB.Command
        Dim Rst As ADODB.Recordset
     
        'Définit le classeur fermé servant de base de données
        'Fichier = "C:\Documents and Settings\mimi\dossier\NomClasseur.xlsx"
        'Nom de la feuille dans le classeur fermé
        'NomFeuille = "Feuil1"
     
        Set Cn = New ADODB.Connection
        '--- Connexion ---
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            .Open
        End With
        '-----------------
     
        For i = 1 To NbIssue
                    strSQL = "UPDATE [" & NomFeuille & "$] SET " & _
                        "`AModif` = '" & AModif(i) & "' WHERE `Id` = " & Id(i)
                    Cn.Execute strSQL, DbFailOnError
        Next i
     
        '--- Fermeture connexion ---
        Cn.Close
        Set Cn = Nothing
        Set Cd = Nothing
     
    End Sub
    Le problème est que dans ce code, je considère Id(i) comme nécessairement numérique. Or la colonne sur Excel comprend également du texte. Je voudrais que s'il y a du texte, le rapprochement ne se fasse pas, mais que les autres lignes avec des valeurs numériques soient quand même analysées ! Ce n'est vraiment pas possible ?

    Merci d'avance,
    N'hésitez pas à me demander si je ne suis pas clair

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2013
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 81
    Par défaut
    Quelqu'un saurait-il m'aider ?

    Je suis certain que quelqu'un a déjà eu ce problème. Ce n'est pas si spécifique : Si une colonne Excel contient des valeurs numériques et des valeurs textes, comment faire pour faire marcher un code SQL UPDATE (via une connection ADODB) qui a nécessairement besoin de savoir si la colonne est du texte ou du numérique.
    Je voudrais simplement que seules les valeurs numériques soient traitées. Tantôt ça marche (sur certains fichiers), tantôt non (sur d'autres fichiers... sans doute considère-t-on qu'il y a trop de valeur texte ?)

    Ca fait plusieurs jours que je suis bloqué avec le problème. Je serais vraiment reconnaissant si quelqu'un pouvait trouver le temps de m'aider !

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    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 Exemple(Fichier As String, NomFeuille As String) 
        Dim Cn As ADODB.Connection
        Dim Cd As ADODB.Command
        Dim Rst As ADODB.Recordset
     
        'Définit le classeur fermé servant de base de données
        Fichier = "C:\Documents and Settings\mimi\dossier\NomClasseur.xlsx"
        'Nom de la feuille dans le classeur fermé
        NomFeuille = "Feuil1$"
     
        Set Cn = New ADODB.Connection
        '--- Connexion ---
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            .Open
        End With
        '-----------------
     
        For i = 1 To NbIssue
                    strSQL = "UPDATE [" & NomFeuille & "] SET " & _
                        "[AModif] = '" & AModif(i) & "' WHERE [Id] = '" & Id(i) & "'"
                    Cn.Execute strSQL, DbFailOnError
        Next i
     
        '--- Fermeture connexion ---
        Cn.Close
        Set Cn = Nothing
        Set Cd = Nothing
     
    End Sub

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2013
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 81
    Par défaut
    Bonjour dysorthographie,

    Tout d'abord merci pour la réponse.

    Ensuite, j'ai analysé le changement entre le code que j'avais inséré et celui que vous m'avez donné (l'analyse est nécessaire, puisque mon code réel est légèrement plus compliqué). J'ai identifié deux différences:
    1) La colonne appelée n'utilise plus `Colonne`, mais [Colonne]
    2) Traitement des valeurs Id(i) comme du texte par l'ajout de ' '

    En effectuant ces deux changements, j'ai toujours un message d'erreur : "type de données incompatible dans l'expression du critère".
    N'ai-je pas identifié une troisième différence fondamentale ?
    Est-ce au niveau de la création de Id(i) (qui est une variable "Collection" que je dois spécifier qu'il ne s'agit pas d'une valeur numérique, mais d'un texte ? (mais comment ?)

    Merci d'avance,

  5. #5
    Invité
    Invité(e)
    Par défaut
    c'est une collection ou un dictionary?

    il faut s'avoir également que ADO définit le type de champ par apprentissage sur les 10 première ligne si c'est du numérique alors le champ est numérique!

    il faut ajouter une valeur bidon au format texte sur la ligne 2 pour le tromper!
    Dernière modification par Invité ; 02/08/2017 à 14h10.

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2013
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 81
    Par défaut
    Bonjour,

    Désolé, mon premier message induisait en erreur. C'est une collection.

    En changeant la seconde valeur de la colonne, le problème intervient toujours. Pour autant quand je change les cinq premières valeurs (moitié de 10), le problème semble totalement disparu ! Merci beaucoup !

    Je suis à présent confronté à un autre problème : Si le classeur que je souhaite modifier est ouvert, la modification ne se fait pas ! Est-ce possible de garder le même code (et probablement changer une petite propriété) pour que la modification se fasse tout de même ? (préférez-vous que je crée un nouveau sujet spécifique ?)

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2013
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 81
    Par défaut
    Bonjour,

    Pour information pour les futurs lecteurs de ce post :
    1) J'ai vu sur internet que ce n'était pas évident d'utiliser ce type de connection avec un fichier ouvert. J'ai donc créé un second programme d'import de valeurs avec des recherchev au cas où le fichier est ouvert (fonction Dir).
    2) Pour éviter que le fichier ne soit trop "moche" avec l'ajout de cinq lignes factices ; et pour éviter que ces cinq lignes du haut du classeur lorsque les utilisateurs trieraient leurs valeurs ; j'ai dupliqué l'entête sur les six premières lignes, ai masqué les cinq premières, puis ai placé la barre de tri sur la sixième ligne.

    Je ferme le post, le sujet est résolu,
    Merci encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/01/2012, 14h49
  2. Pour importer les données en fichier CSV, toujours une erreur
    Par wangying dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 16/12/2011, 14h38
  3. adresse variable pour importer les données sous excel
    Par nezguich dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/09/2010, 12h42
  4. [XL-2003] adresse variable pour importer les données txt sous excel
    Par renfei1984 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/07/2010, 10h29
  5. [VBA-E]Importer des données de fichiers excel fermés
    Par bart64 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 20/04/2006, 11h35

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