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 :

Requête trop longue ? Incompatibilité de type


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
    Mai 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    Par défaut Requête trop longue ? Incompatibilité de type
    Bonjour !

    Je suis en train d'essayer de faire un petit peu de code pour automatiser des requêtes pour les utilisateurs. Mon code fonctionnait à merveille tant que la requête était à peu près aussi simple que :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT dtcomm, lib FROM comm WHERE codeaff='2000' AND cdongl='ongl1';

    Voici mon code complet après être passée à une requête un peu plus complexe :

    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
     
    Sub test()
     
    Dim Requete As String, Conn As String, Sh As Worksheet
     
    Set Sh = Sheets("Feuil1")
     
    'La chaîne de connexion
     Conn = "ODBC;"
     Conn = Conn & "DSN=maDSN;"
     Conn = Conn & "DATABASE=bdd;"
     Conn = Conn & "SERVER=monServeur;"
     Conn = Conn & "SRVR=monSrvr;"
     
     
    'la chaîne de la requête
    Requete = "SELECT fzaf.cdsoc, fzaf.noaff, fzre.dtecr, fzre.cdpha, fzre.nosec, fzre.nocpg, fzre.cdnat, fzre.cdmvt, fzre.vlqte, fzre.vlmnt, fzre.cdori, fzea.cdeta" & _
             "FROM fzre, f_no, fzaf, fzea" & _
             "WHERE fzno.noneu  = fzre.noneu" & _
             "AND fzaf.sraff  = fzre.sraff" & _
             "AND fzea  .cdsoc  = fzaf.cdsoc" & _
             "AND fzea  .cdeti  = fzno  .cdeta" & _
             "AND fzaf.cdsoc='maSoc'" & _
             "AND dtecr >= '20100301'" & _
             "AND dtecr <= '20100331'" & _
             "AND nosec='1000'" & _
             "AND cdnat<>'NP' ORDER BY 1, 5, 6, 2; "
     
     
     
    With Sh.QueryTables.Add(Connection:=Array(Conn), Destination:=Sh.Range("A1"))
    Sh.Range("A1").CurrentRegion.ClearContents
    .CommandText = Array(Requete)
    .Name = "xxxx"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = True
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .PreserveColumnInfo = True
    .Refresh BackgroundQuery:=False
    End With
     
    End Sub
    Si j'exécute ce code, ça m'affiche l'erreur "Incompatibilité de type" et le debug s'arrête sur la ligne : .CommandText = Array(Requete) . Mais, je reviens sur ce que je disais au début, si je raccourcis la requête, le code fonctionne correctement.

    Comment dois-je faire dans le cas de longues requêtes ? Merci d'avance !

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    salut,
    regarde le code SQL que tu souhaites utiliser, il y a tantot des espaces en trop apres les points et tantot manquants (cas de tous tes retours a la ligne)...

    Corrige deja cet aspect la, ca fera deja avancer la resolution des bugs
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    Par défaut
    Hop, code de la requête corrigé :

    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
    Sub test()
     
    Dim Requete As String, Conn As String, Sh As Worksheet
     
    Set Sh = Sheets("Feuil1")
     
    'La chaîne de connexion
     Conn = "ODBC;"
     Conn = Conn & "DSN=maDSN;"
     Conn = Conn & "DATABASE=bdd;"
     Conn = Conn & "SERVER=monServeur;"
     Conn = Conn & "SRVR=monSrvr;"
     
     
    'la chaîne de la requête
    Requete = "SELECT fzaf.cdsoc, fzaf.noaff, fzre.dtecr, fzre.cdpha, fzre.nosec, fzre.nocpg, fzre.cdnat, fzre.cdmvt, fzre.vlqte, fzre.vlmnt, fzre.cdori, fzea.cdeta " & _
             "FROM fzre, f_no, fzaf, fzea " & _
             "WHERE fzno.noneu  = fzre.noneu " & _
             "AND fzaf.sraff  = fzre.sraff " & _
             "AND fzea.cdsoc  = fzaf.cdsoc " & _
             "AND fzea.cdeti  = fzno.cdeta " & _
             "AND fzaf.cdsoc='maSoc' " & _
             "AND dtecr >= '20100301' " & _
             "AND dtecr <= '20100331' " & _
             "AND nosec='1000' "  & _
             "AND cdnat<>'NP' ORDER BY 1, 5, 6, 2; "
     
     
    With Sh.QueryTables.Add(Connection:=Array(Conn), Destination:=Sh.Range("A1"))
    Sh.Range("A1").CurrentRegion.ClearContents
    .CommandText = Array(Requete)
    .Name = "xxxx"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = True
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .PreserveColumnInfo = True
    .Refresh BackgroundQuery:=False
    End With
     
    End Sub
    La requête est maintenant toute propre, c'est vrai que c'est mieux. Mais j'ai toujours l'erreur.

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Pourquoi passes tu par un Array ?

    passer plus simplement comme ceci ne fonctionne-t-il pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Sh.QueryTables.Add(Connection:=Conn) Destination:=Sh.Range("A1"))
    Sh.Range("A1").CurrentRegion.ClearContents
    .CommandText = Requete
    .Name = "xxxx"
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    Par défaut
    Je passe par un array parce qu'en fait je découvre comment on fait pour faire une requête sous excel avec VBA. Je me suis simplement inspirée d'un code que j'ai vu sur Internet, je n'ai pas trouvé grand-chose à ce sujet. Et ce qu'Excel m'a généré automatiquement ne m'allait pas en l'état.

    Mais tu as raison, on n'est pas obligé de passer par un array, ça marche très bien sans ! Donc je te remercie bien bas pour ton aide précieuse !

    Mission accomplie : post résolu msieur !

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

Discussions similaires

  1. Requête trop longue en VBA
    Par NicoMon dans le forum VBA Access
    Réponses: 4
    Dernier message: 07/08/2007, 10h25
  2. requéte trop longue sous ie
    Par devboy dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 16/05/2007, 16h43
  3. Réponses: 4
    Dernier message: 15/05/2007, 10h10
  4. [Requête] Requête trop longue
    Par Ithilien dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 08/01/2007, 10h58
  5. [MySQL] Requête trop longue ?
    Par Thomas1434 dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 24/03/2006, 21h55

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