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 :

[E-03] Incompatibilité de type


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 22
    Par défaut [E-03] Incompatibilité de type
    Bonjour,

    dans ce code je crée une requête avec des données externes (Access). J'ai voulu rendre variable la première partie de la condition WHERE. J'ai donc créé une variable cpte qui contient la première partie de la condition WHERE.
    Cette variable cpte est de type variant mais lorsque je lance ma macro, j'ai un message d'erreur 13 :
    "Incompatibilité de type"
    J'ai essayé de transformer ma variable "cpte" en type long mais ça ne fonctionne pas avec "CLng"

    Quelqu'un aurait-il une idée?

    PS : j'ai mis en rouge le passage que je suppose faux...

    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
    dim cpte as Variant
    
    cpte = "(DELAIS.EXDCOQY = " & 208131 & ") OR (DELAIS.EXDCOQY = " & 208102 & ") OR (DELAIS.EXDCOQY = " & 208107 & ")"
    With ActiveSheet.QueryTables.Add(Connection:= _
        "ODBC;DSN=CLT;DBQ=J:\ACCESS\CLIENTS.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;" _
        , Destination:=Range("A2"))
        .CommandText = Array( _
        "SELECT DELAIS.EXDDTKV, DELAIS.EXDCOQY, DELAIS.EXDCD, DELAIS.EXDHESI, DELAIS.DELAIS" & Chr(13) & "" & Chr(10) & "FROM `J:\BASE_DE_DONNEES_ACCESS\INFOS_CLIENTS`.DELAIS DELAIS" & Chr(13) & "" & Chr(10) & "WHERE " & cpte & " AND (DELAIS.EXDHESI>" & heure_theo & ")" & Chr(13) & "" & Chr(10) & "ORDER BY DELAIS.EXDCD")
        .Name = "Lancer la requête à partir de CLT_test3"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .Refresh BackgroundQuery:=False
    End With
    Merci de votre aide!

  2. #2
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    Je crois que tu devrais enlever Array dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .CommandText = Array( _
    Ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .CommandText = "SELECT DELAIS.EXDDTKV, DELAIS.EXDCOQY, DELAIS.EXDCD, DELAIS.EXDHESI, DELAIS.DELAIS" & Chr(13) & "" & Chr(10)& "FROM `J:\BASE_DE_DONNEES_ACCESS\INFOS_CLIENTS`.DELAIS DELAIS" & Chr(13) & "" & Chr(10) & "WHERE " & cpte & " AND (DELAIS.EXDHESI>" & heure_theo & ")" & Chr(13) & "" & Chr(10) & "ORDER BY DELAIS.EXDCD"
    Par ailleurs, je ne suis pas sûr que les ne puissent pas être avantageusement remplacés par des espaces.

    LE type approprié pour cpte est String.

    Cordialement,

    PGZ

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut Eleda et le forum
    et en remplaçant cpte par la valeur que doit avoir cette variable, ça fonctionne ?
    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
    With ActiveSheet.QueryTables.Add(Connection:= _
        "ODBC;DSN=CLT;DBQ=J:\ACCESS\CLIENTS.mdb;DriverId=25; _
         FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;" _
        , Destination:=Range("A2"))
        .CommandText = Array( _
        "SELECT DELAIS.EXDDTKV, DELAIS.EXDCOQY, DELAIS.EXDCD, DELAIS.EXDHESI, DELAIS.DELAIS" & " FROM `J:\BASE_DE_DONNEES_ACCESS\INFOS_CLIENTS`.DELAIS DELAIS" &  " WHERE (DELAIS.EXDCOQY = 208131) OR (DELAIS.EXDCOQY = 208102) OR (DELAIS.EXDCOQY = 208107) AND (DELAIS.EXDHESI>" & heure_theo & ")" & " ORDER BY DELAIS.EXDCD")
        .Name = "Lancer la requête à partir de CLT_test3"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .Refresh BackgroundQuery:=False
    End With
    Tu colles des chr(13) et chr(10) dans la définition d'une requête ? Je ne pense pas (c'est normel chez moi ), que ça soit judicieux : les retour chariot et fin de ligne ne sont là que pour la visualisation (comme _ sous VBA Excel) et ne font pas partie du critère.

    Rajouter des & est pas une bonne idée :
    DELAIS" & "WHERE (
    donne
    DELAISWHERE (
    ce qui est loin de valoir
    DELAIS" & " WHERE (
    qui donne
    DELAIS WHERE (
    qui semble plus lisible pour access
    A+

  4. #4
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 22
    Par défaut
    Le fait d'enlever "Array" supprime le problème "d'incompatibilité de type" mais engendre une "erreur générale ODBC" quand la macro se trouve sur la dernière ligne, juste avant "With".
    Nouveau problème... quelqu'un aurait-il une idée?

    Les Chr(13) & "" & Chr(10) ne viennent pas de moi mais de l'enregistreur de macro et ne posaient pas de problème dans le cas d'un seul compte donc je ne pense pas que le problème vienne de là, mais comme je ne suis pas un expert, j'attends vos avis!

    Donc je récapitule, si je passe par "Outils/Données externes/Créer une requête", j'ai la possibilité de mettre plusieurs comptes (ex : 208136, 548006...) et la macro se lance correctement. Le problème c'est que ces comptes doivent pouvoir être changés et le nombre de compte à inclure dans la clause "WHERE" aussi...! (sans retourner dans "Créer une requête" bien sur)
    En passant par l'enregistreur de macro, j'ai donc obtenu une trame et je souhaite maintenant rendre variable ce qui se trouve dans "WHERE". Ce que je n'arrive pas à faire correctement...

    Merci de votre aide!

  5. #5
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    Le 'Array', c'était toi ou l'enregistreur de macro?
    Tu en es où de ton code?
    Tu as un enregistrement de macro qui fonctionne?

    PGZ

  6. #6
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 22
    Par défaut
    Le "Array" c'est l'enregistreur de macro qui l'a mis. J'ai essayé de l'enlever et du coup il ne bloque plus sur "Incompatibilité de type", mais sur "Erreur générale ODBC" en fin de macro...

    Voilà où j'en suis dans le code :
    Ce code fonctionne uniquement si il n'y a qu'un seul compte, cad que la macro ne rentre pas dans la boucle "Do while". Dès qu'elle rentre dans la boucle, ça ne fonctionne plus ("Incompatibilité de type"), donc je suppose que c'est le "OR" qui est génant???

    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
        
    Range("B4").Select
       cpte = "(DELAIS.EXDCOQY = " & ActiveCell.Value & ")"
        ActiveCell.Offset(1, 0).Select
        Do While ActiveCell.Value <> ""
            cpte = cpte & " " & "OR" & " " & "(DELAIS.EXDCOQY = '" & ActiveCell.Value & "' )"
            ActiveCell.Offset(1, 0).Select
        Loop
        Sheets("1").Select
            With ActiveSheet.QueryTables.Add(Connection:= _
                "ODBC;DSN=CLTS;DBQ=J:\BASE_DE_DONNEES_ACCESS\CLIENTS.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;" _
                , Destination:=Range("A2"))
                .CommandText = Array("SELECT DELAIS.EXDDTKV, DELAIS.EXDCOQY, DELAIS.EXDCD, DELAIS.EXDHESI, DELAIS.DELAIS" & Chr(13) & "" & Chr(10) & "FROM `J:\BASE_DE_DONNEES_ACCESS\CLIENTS`.DELAIS DELAIS" & Chr(13) & "" & Chr(10) & "WHERE " & cpte & " AND (DELAIS.EXDHESI>" & heure_theo & ")" & Chr(13) & "" & Chr(10) & "ORDER BY DELAIS.EXDCD")
                .Name = "Lancer la requête à partir de CLT_test3"
                .FieldNames = True
                .RowNumbers = False
                .FillAdjacentFormulas = False
                .PreserveFormatting = True
                .RefreshOnFileOpen = False
                .BackgroundQuery = True
                .RefreshStyle = xlInsertDeleteCells
                .SavePassword = False
                .SaveData = True
                .AdjustColumnWidth = True
                .RefreshPeriod = 0
                .PreserveColumnInfo = True
                .Refresh BackgroundQuery:=False
            End With
    Merci de votre aide!

  7. #7
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Citation Envoyé par Eleda Voir le message
    Ce code fonctionne uniquement si il n'y a qu'un seul compte, ...
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cpte = "(DELAIS.EXDCOQY = " & ActiveCell.Value & ")"
    est correct.
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cpte = cpte & " " & "OR" & " " & "(DELAIS.EXDCOQY = '" & ActiveCell.Value & "' )"
    ne l'est pas.

    Tu pourrais essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cpte = cpte & " OR (DELAIS.EXDCOQY = " & ActiveCell.Value & ")"
    D'autre part, dans la chaîne SQL, cette portion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ..."WHERE " & cpte & " AND (DELAIS.EXDHESI>"...
    doit probablement être remplacée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "WHERE (" & cpte & ") AND (DELAIS.EXDHESI>"
    L'utilisation de la fonction Array avec CommandText reste mystérieuse pour moi.
    Extrait de l'aide
    Pour les sources ODBC, la propriété CommandText fonctionne exactement comme la propriété SQL et la définition de la propriété génère l'actualisation des données.

    Exemple
    Cet exemple montre comment définir la chaîne de commande de la source de données ODBC de la première table de requête. Notez que la chaîne de commande constitue une instruction SQL.

    Set qtQtrResults = _
    Workbooks(1).Worksheets(1).QueryTables(1)
    With qtQtrResults
    .CommandType = xlCmdSQL
    .CommandText = "Select ProductID From Products Where ProductID < 10"
    .Refresh
    End With
    C'est vrai que tu ne définis pas CommandType, mais xlCmdSQL est la valeur par défaut...

    Cordialement,

    PGZ

Discussions similaires

  1. Incompatibilité de type ListBox
    Par priest69 dans le forum Access
    Réponses: 1
    Dernier message: 16/11/2005, 11h19
  2. Message incompatibilité de type
    Par Daniel MOREAU dans le forum Access
    Réponses: 5
    Dernier message: 10/10/2005, 20h57
  3. incompatibilité de type
    Par zooffy dans le forum Access
    Réponses: 2
    Dernier message: 13/06/2005, 15h12
  4. Incompatibilité de types dans un formulaire
    Par ahage4x4 dans le forum ASP
    Réponses: 3
    Dernier message: 03/05/2005, 15h39
  5. [XSD] Incompatibilité des types xs:ID et xs:IDREF ?
    Par Cpt.FLAM dans le forum Valider
    Réponses: 6
    Dernier message: 08/04/2005, 14h54

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