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 :

Erreur d'execution'-2147467259(80004005)': ORA-00933:SQL command not properly ended


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2017
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Erreur d'execution'-2147467259(80004005)': ORA-00933:SQL command not properly ended
    Bonjour , je viens vous soumettre deux préoccupations urgentes. Mais je souhaiterais commencer par la première qui est la suivante.Il m'a été demandé d'écrire un code VBA capable d’exécuter des requêtes SQL et de les transférer sur des pages Excel. Alors j'ai effectué des simulations su mon poste à la maison en localhost. Los de l’exécution du code VBA tous se passe bien pour la première page Excel ensuite lorsque nous passons à la seconde page alors apparaît le code suivant: "Erreur d’exécution'-2147467259(80004005)': ORA-00933:SQL command not properly ended"; Or le même code exécuter sur SQL developper marche très bien.
    Je vous communique mon code ainsi que le fichier Excel sur lequel s’exécute le 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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
     
    Option Explicit
     
    Sub chargement_Fiche()
    Dim identifianteleveur As Integer
    Dim OuiNon As String
    Dim Path_name As String
    Dim NomSauvegarde As String
    fin:
    debut:
    identifianteleveur = InputBox("Saisissez le n°de l'identifiant eleveur sur 1 caractère")
    If Not Len(identifianteleveur) <> 1 Then
    OuiNon = MsgBox("Veuillez saisir un numero sur un caractères")
    If OuiNon = vbOK Then
    GoTo debut:
    Else
    GoTo fin:
    End If
    End If
    Eleveurfin:
    Eleveurdebut:
    Sheets("Eleveur").Select
    Range("A2").Select
    OuiNon = MsgBox("Charger l'onglet eleveur?", 1)
    If OuiNon = vbCancel Then GoTo Eleveurfin:
    Call Requete_Sql(identifianteleveur)
    Volaillefin:
    Volailledebut:
    Sheets("Volaille").Select
    Range("A2").Select
    OuiNon = MsgBox("charger l'onglet volaille?", 1)
    If OuiNon = vbCancel Then GoTo Volaillefin:
    Call Requete_Sqlv(identifianteleveur)
    Distributeurdebut:
    DistributeurFin:
    Sheets("Distributeur").Select
    Range("A2").Select
    OuiNon = MsgBox("charger l'onglet Distributeur?", 1)
    If OuiNon = vbCancel Then GoTo DistributeurFin:
    Call Requete_Sqld(identifianteleveur)
    'distributeurfin:
    Sheets("Eleveur").Select
    Path_name = ThisWorkbook.Path
    NomSauvegarde = Path_name & " \" & identifianteleveur
    saveAsFin:
    OuiNon = MsgBox("fermeture?")
    If OuiNon = vbCancel Then GoTo fin:
    'fin:
    End Sub
    Sub Requete_Sql(identifianteleveur)
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim mtxData As Variant
    Dim colonne As Integer
    Dim ligne As Integer
    'Dim feuil2 As Worksheet
    Dim var_nom As String
    Dim Requete As String
    'Dim ligne As Long
    Dim col As Integer
    Dim feuille As Worksheet
     
    ligne = Selection.Rows.Count
    col = Selection.Columns.Count
    'Dim c As Integer
    var_nom = InputBox("donner le numero ")
    Requete = "select * from  eleveur where id_eleveur = " & var_nom
    MsgBox Requete
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    cn.Open ("User ID=system" & ";Password = " & ";Data Source = localhost" & "; Provider = OraOledB.Oracle")
    rs.CursorType = adOpenForwardOnly
    rs.Open (Requete), cn
    ligne = 2
    rs.MoveFirst
    While Not rs.EOF
        For colonne = 0 To rs.Fields.Count - 1
            Worksheets("Eleveur").Cells(ligne, colonne + 1) = rs.Fields(colonne).Value
        Next colonne
        rs.MoveNext
    ligne = ligne + 1
    Wend
     
     
    Set rs = Nothing
    Set cn = Nothing
    End Sub
    Sub Requete_Sqlv(identifianteleveur)
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim mtxData As Variant
    Dim colonne As Integer
    Dim ligne As Integer
    'Dim feuil2 As Worksheet
    Dim var_nom As String
    Dim Requete As String
    'Dim ligne As Long
    Dim col As Integer
    Dim feuille As Worksheet
     
    ligne = Selection.Rows.Count
    col = Selection.Columns.Count
    'Dim c As Integer
    var_nom = InputBox(" donner le numero ")
    Requete = "select eleveur.id_eleveur , eleveur.nom , abattoir.id_abattoir , abattoir.nom , count(id_volaille)" & _
    " from " & _
    " eleveur, volaille, abattoir " & _
     " where " & _
    "(eleveur.id_eleveur = volaille.id_eleveur)" & _
    " And " & _
    "(volaille.id_abattoir = abattoir.id_abattoir)" & _
    " And " & _
    "(date_vente Is Not Null)" & _
    " (group by) " & _
    " (eleveur.id_eleveur, eleveur.nom, abattoir.id_abattoir, abattoir.nom) =  " & var_nom
    MsgBox Requete
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    cn.Open ("User ID=system" & ";Password = " & ";Data Source = localhost" & "; Provider = OraOledB.Oracle")
    rs.CursorType = adOpenForwardOnly
    rs.Open Requete, cn
    ligne = 2
    rs.MoveFirst
    While Not rs.EOF
        For colonne = 0 To rs.Fields.Count - 1
            Worksheets("Eleveur").Cells(ligne, colonne + 1) = rs.Fields(colonne).Value
        Next colonne
        rs.MoveNext
    ligne = ligne + 1
    Wend
     
     
    Set rs = Nothing
    Set cn = Nothing
    End Sub
     
    Sub Requete_Sqld(identifianteleveur)
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim mtxData As Variant
    Dim colonne As Integer
    Dim ligne As Integer
    'Dim feuil2 As Worksheet
    Dim var_nom As String
    Dim Requeted As String
    'Dim ligne As Long
    Dim col As Integer
    Dim feuille As Worksheet
     
    ligne = Selection.Rows.Count
    col = Selection.Columns.Count
    'Dim c As Integer
    var_nom = InputBox("donner le numero ")
    Requeted = "select volaille.id_volaille , eleveur.nom , abattoir.nom , distributeur.nom" & _
    " from " & _
    "volaille, eleveur, abattoir, fournir, distributeur" & _
    "where" & _
    "(eleveur.id_eleveur = volaille.id_eleveur)" & _
    "And" & _
    "(volaille.id_abattoir = abattoir.id_abattoir)" & _
    "and" & _
    "(volaille.id_volaille=fournir.id_volaille)" & _
    "and" & _
    "(fournir.id_distributeur=distributeur.id_distributeur)"
    MsgBox Requeted
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    cn.Open ("User ID=system" & ";Password = " & ";Data Source = localhost" & "; Provider = OraOledB.Oracle")
    rs.CursorType = adOpenForwardOnly
    rs.Open (Requeted), cn
    ligne = 2
    rs.MoveFirst
    While Not rs.EOF
        For colonne = 0 To rs.Fields.Count - 1
            Worksheets("Distributeur").Cells(ligne, colonne + 1) = rs.Fields(colonne).Value
        Next colonne
        rs.MoveNext
    ligne = ligne + 1
    Wend
     
     
    Set rs = Nothing
    Set cn = Nothing
    End Sub
    Fichiers attachés Fichiers attachés

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bénévolat et urgence ne sont pas compatibles sur ce forum.

    Presque personne n'ouvre les pièces balancées avec la première question et encore moins avec des fichiers de macros

    Tu pourrais faire l'effort de zigouiller tes Goto et d'indenter ton code.

    Le seul Goto obligatoire en VBA, c'est le GOto de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    On error Goto quelquepart
    Tout le reste de la Gotologie c'est de la programmation de broche à foin. VBA, n'est pas le BASIC original qui se pratiquait sur un terminal à imprimante au bout d'une ligne téléphonique branchée à un ordinateur central à l'autre bout du monde.

    Et puis cela veut dire quoi en français changer de page. Excel ne peut pas changer de feuille s'il n'a pas l'ordre de changer de feuille. Dans ton code spaghetti, il n'y a pas de changement de feuille.

    Et tu devrais dire au zouf qui t'a montré le BASIC, qu'il a un sérieux besoin de se recycler.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2017
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    oulala milles escuses je suis nouveau dans le ce forum en particulier et nouveau en informatique et je suis désolé si mon code est de la merde. Mais je fais comme je peux et merci pour l'info je ne remettrai plus mon fichier en ligne. J'ai pensé qu'il fallait que je donne le maximum d'information possible. Encore une fois milles excuses.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code si tu ne mets pas d'espaces! : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "where" & _
    "(eleveur.

    rs.MoveFirst ne rime à rien après l'ouverture de ta requête!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     range("A2").copyfromrecordset cn.execute(Requete)

  5. #5
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 955
    Points
    55 955
    Billets dans le blog
    131
    Par défaut
    Salut.

    Si j'avais eu à le dire, je l'aurais probablement dit autrement, mais je plussoie Clément.

    Pour éviter le code spaghetti dont il parle, j'identifierais les différentes actions à mener et je créerais une fonction pour chaque action (Principe incontournable de la programmation: une fonction possède une et une seule responsabilité).

    J'aurais donc au moins quatre fonctions qui seraient appelées par une cinquième qui les lierait toutes...

    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
    Function GetConnection(ConnectionString) As ADODB.Connection
     
    End Function
     
    Function getRecordset(sql As String, cn As ADODB.Connection) As ADODB.Recordset
     
    End Function
     
    Function CopyRecordsetHeader(rs As ADODB.Recordset, Target As Range)
     
    End Function
     
    Function CopyRecordsetToRange(rs As ADODB.Recordset, Target As Range)
     
    End Function
    Pour transférer le contenu du recordset sur la plage voulue, je m'intéresserais à la méthode Range.CopyFromRecordset, que j'utiliserais dans ma fonction CopyRecordsetToRange.

    Il y a plusieurs avantages à procéder ainsi:
    • tests et débogages aisés;
    • réutilisation du code très aisée car il suffit de modifier les paramètres;
    • constitution d'une "boite à outils" qui évite de réinventer la roue à chaque fois;
    • ...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Avril 2017
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur VBA
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2017
    Messages : 122
    Points : 194
    Points
    194
    Par défaut
    Sql non properly ended, signifie en français la requête est mal terminée (=écrite), Excel ne sait pas où elle se termine. La requête se poursuit alors qu Excel pense qu elle est terminée.


    Je peux me tromper mais il me semble que votre souci vient de requête sqld, tous vos and n ont ni espace avant ni après, l imagine que ca doit gêner pour repérer les arguments.
    Si vous avez encore l erreur, donnez nous le texte de la requête avec l emplacement précis dans le code de où elle s exécute.
    Je ne teste quasi jamais le code que je propose. il s'agit juste d'indication sur comment je m'y prendrais, comment faire, des lignes d'intention.
    Il y a donc souvent des erreurs, le déboggage existe pour cela.

  7. #7
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 955
    Points
    55 955
    Billets dans le blog
    131
    Par défaut
    De plus, le code proposé pour le sql indique que var_nom contiendra une valeur numérique... Est-ce le cas?

    Il serait judicieux de terminer la chaine sql par ;

    Si var_nom est numérique, on aurait la ligne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Requete = "select * from  eleveur where id_eleveur = " & var_nom & ";"
    Si var_nom contient du texte, il conviendra d'encadrer sa valeur par ' dans la chaîne sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Requete = "select * from  eleveur where id_eleveur = '" & var_nom & ';"
    Il conviendrait également de tester qu'une valeur a été saisie et qu'elle correspond à ce qui est attendu (valeur numérique, chaine de caractère, longueur de la chaîne, ...). C'est pourquoi je propose de découper le code en petites fonctions faciles à tester puis à assembler...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2017
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci pour vos reponses et vous dire que vous avez raison de dire que le probleme se trouve spécialement au niveau de la requete SQL. J' ai suivi vos conseils en decoupant le code en petite fonction et c'est effectivement la première tranche de code qui marche par contre les deux dernières ne s'executes pas. Par première tranche je parle de la partie du code ou le SQL est tres simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     select * from eleveur where id_eleveur = " & var_nom
    . Cepandant j'ai utilisé le code de dysorthographie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("A2").copyfromrecordset cn.execute(Requete)
    lui aussi ne fonctionne bien que seulement avec la première tranche du code. Par contre avec les deux autres codes il marque l'erreur suivante :
    Erreur d'exécution '-2147217908 (80040e0c)': Aucun texte de commande n'a été défini pour l'objet de commande.
    Alors c'est a ce niveau que je suis et je comprends pas pourquoi il reconnait le premier code SQL et puis pas les autres.
    NB: le debogage indique l'erreur se trouve sur le " range("A2").copyfromrecordset cn.execute(Requete) ".
    merci.

  9. #9
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 955
    Points
    55 955
    Billets dans le blog
    131
    Par défaut
    Salut.

    Tu aurais intérêt à passer par une variable de type adodb.recordset et de découper ton code sur plusieurs lignes plutôt que d'utiliser une ligne qui réalise deux choses différentes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("A2").copyfromrecordset cn.execute(Requete)
    , après avoir déclaré une variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    dim rs as adodb.recordset
    ...
    ...
    set rs = cn.execute(requete)
    range("a2").copyfromrecordset rs
    Ca te permet de mettre un point d'arrêt sur la ligne range("a2").copy... pour vérifier ton recordset.

    Cela étant, vu l'erreur et sans avoir un serveur Oracle pour vérifier, je dirais que ta variable Requete semble être vide. Tu devrais y aller en pas à pas pour pouvoir observer chaque ligne.

    N'hésite pas à nous remettre le code que tu utilises qu'on puisse y voir clair
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    C'est pas compliqué,il te suffis d'ajouter un espace en début de chaque lignes de ta requête!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sql=" Select *" & _
    " From" & _
    " Where"
    Dans la majorité de cas si ta requête fonctionne sur Sql développeur elle fonctionne sur ado!
    Dernière modification par Invité ; 17/08/2017 à 10h55.

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2017
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    bonjour , effectivement tu as parfaitement raison Pierre fauconnier ma requete doit etre vide. j'ai suivie ton conseil et le probleme se trouve maintenant au niveau du [code]Set rs = cn.Execute (Requete)[code\] .Le motif de l'erreur demeure toujours commande SQL not properly ended.
    Comme tu l'a dit dysorthographie j'ai tous séparé mas j'y arrive pas toujours et donc je mets une version découpé du code en ligne
    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
     
    Sub Requete_Sqld()
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim mtxData As Variant
    Dim colonne As Integer
    Dim ligne As Integer
    'Dim feuil2 As Worksheet
    Dim var_nom As Integer
    Dim Requete As String
    'Dim ligne As Long
    Dim col As Integer
    Dim feuille As Worksheet
     
    ligne = Selection.Rows.Count
    col = Selection.Columns.Count
    'Dim c As Integer
    var_nom = InputBox("donner le numero ")
    Requete = " select volaille.id_volaille , eleveur.nom , abattoir.nom , distributeur.nom " & _
    " from " & _
    " volaille, eleveur, abattoir, fournir, distributeur" & _
    " where" & _
    "(eleveur.id_eleveur = volaille.id_eleveur )" & _
    " and " & _
    " (volaille.id_abattoir = abattoir.id_abattoir )" & _
    " and " & _
    " (volaille.id_volaille = fournir.id_volaille )" & _
    " and " & _
    " (fournir.id_distributeur = distributeur.id_distributeur) = " & var_nom
    MsgBox Requeted
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    cn.Open ("User ID=system" & ";Password = Thiernolefou1 " & ";Data Source = localhost" & "; Provider = OraOledB.Oracle")
    rs.CursorType = adOpenForwardOnly
    'Set rs = cn.Execute(Requete)
    'Range("A2").CopyFromRecordset cn
    Range("A2").CopyFromRecordset cn.Execute(Requete)
    merci.

  12. #12
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 955
    Points
    55 955
    Billets dans le blog
    131
    Par défaut
    Balises de code: Pour mettre facilement tes balises de code, sélectionne le code, puis clique sur le bouton #, car tu les mets manuellement mais tu les fermes mal...

    Nom : 2017-08-17_104103.png
Affichages : 848
Taille : 28,9 Ko

    Dans ton code, tu as msgbox requeted et tu utilises plus bas requete...

    As-tu bien Option Explicit en tout début de module? Sinon, je t'encourage fortement à le mettre et à modifier les options de l'éditeur VBA pour que la déclaration des variables soient obligatoires...

    Comme demandé plus haut dans la discussion, donne-nous le texte de ta requête. Tu dois comprendre qu'on ne peut pas installer une base Oracle avec des tables de manière à faire le test...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #13
    Invité
    Invité(e)
    Par défaut
    Ta requête {(fournir.id_distributeur = distributeur.id_distributeur) = " & var_nom} ne peut en aucun cas fonctionner!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Requete = " select volaille.id_volaille , eleveur.nom , abattoir.nom , distributeur.nom " & _
    " from " & _
    " volaille, eleveur, abattoir, fournir, distributeur" & _
    " where" & _
    "(eleveur.id_eleveur = volaille.id_eleveur )" & _
    " and " & _
    " (volaille.id_abattoir = abattoir.id_abattoir )" & _
    " and " & _
    " (volaille.id_volaille = fournir.id_volaille )" & _
    " and " & _
    " (fournir.id_distributeur = distributeur.id_distributeur) = " & var_nom
    Debug.print Requete
    Debug.print envoi vers la fenêtre d'exécution!
    Raccourci clavier [ctrl] + [g] copies colle le résultat dans Sql développeur!

    En plus toujours l'espace!
    Code espace "(eleveur : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    " where" & _
    "(eleveur.id_eleveur = volaille.id_eleveur )" & _
    Dernière modification par Invité ; 17/08/2017 à 12h17.

  14. #14
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 955
    Points
    55 955
    Billets dans le blog
    131
    Par défaut
    Au passage, si tu as la main sur le serveur Oracle, tu aurais intérêt à travailler avec des procédures stockées, ce serait plus efficace et plus simple que de reconstruire la requête en VBA... Le fait de créer ce code sql comme tu le fais amène souvent à des problèmes de parenthèses et autres petits grains de sable qui viennent se mettre dans les rouages. C'est pourquoi il est impératif de vérifier que ta variable Requete contient une chaine sql valide en Oracle. Tu dois passer par ce stade de vérification (et au passage nous donner le texte final de la requête) pour pouvoir comprendre où le bât blesse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A2").CopyFromRecordset cn.Execute(Requete)
    Je t'ai dit que travailler ainsi n'est pas une bonne chose puisque la ligne fait deux choses:
    exécuter la requête et récupérer un recordset "volatile";
    utiliser ce recordset via la méthode CopyFromRecordset.

    Même si ce code peut fonctionner quand il n'y a pas de problèmes, ce n'est jamais une bonne chose qu'une ligne de code exécute plusieurs instructions. Si tu ne suis pas ce que l'on te propose, ne t'étonne pas d'un résultat foireux.

    Découper ton code en lignes "à fonction unique" te permet de déboguer beaucoup plus facilement, notamment en faisant fonctionner ton code pas à pas.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  15. #15
    Invité
    Invité(e)
    Par défaut
    Je rebondi sur la remarque de Pierre un me vue serait suffisante!

  16. #16
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2017
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    merci.Tu as completement raison ma requete ne fonctionne pas du tout sur SQL developper en faite voici la requete à l'origine celle qui fonctionne sur SQL DEVELOPPER
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select eleveur.id_eleveur"identifiant eleveur";  eleveur.nom "Eleveur";  abattoir.id_abattoir "identifiant abattoir" ;  abattoir.nom "Abattoir";  count(id_volaille)"Nombre de volaille" from eleveur;  volaille;  abattoir where (eleveur.id_eleveur=volaille.id_eleveur) and (volaille.id_abattoir = abattoir.id_abattoir) and (date_vente is not null) group by eleveur.id_eleveur;  eleveur.nom;  abattoir.id_abattoir;  abattoir.nom;
    J'ai essayé de la modifier à cause de l'interface VBA afin que sa n'apparaisse plus en rouge.Voila maintenant 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
    Option Explicit
    Sub victoire()
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim mtxData As Variant
    Dim colonne As Integer
    Dim ligne As Integer
    'Dim feuil2 As Worksheet
    Dim var_nom As String
    Dim Requete As String
    'Dim ligne As Long
    Dim col As Integer
    Dim feuille As Worksheet
     
    ligne = Selection.Rows.Count
    col = Selection.Columns.Count
    'Dim c As Integer
    var_nom = InputBox(" donner le numero ")
    Requete = "select eleveur.id_eleveur , eleveur.nom , abattoir.id_abattoir , abattoir.nom , count(id_volaille)" & _
    " from " & _
    " eleveur, volaille, abattoir " & _
     " where " & _
    "(eleveur.id_eleveur = volaille.id_eleveur)" & _
    " And " & _
    "(volaille.id_abattoir = abattoir.id_abattoir)" & _
    " And " & _
    "(date_vente Is Not Null)" & _
    " (group by) " & _
    " (eleveur.id_eleveur, eleveur.nom, abattoir.id_abattoir, abattoir.nom) = " & var_nom
    MsgBox Requete
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    cn.Open ("User ID=system" & ";Password = Thiernolefou1" & ";Data Source = localhost" & "; Provider = OraOledB.Oracle")
    rs.CursorType = adOpenForwardOnly
    Set rs = cn.Execute(Requete)
    Range("A2").CopyFromRecordset rs
    'Range("A2").CopyFromRecordset cn.Execute(Requete)
    Pierre je pense que tu fais allusion à l'ecriture du code que tu m'a envoyé toute à l'heure c'est à dire le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set rs = cn.Execute(Requete)
    Range("A2").CopyFromRecordset rs
    je pense l'avoir respecter.

  17. #17
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 955
    Points
    55 955
    Billets dans le blog
    131
    Par défaut
    Remplace les ; par , !!! (B.A.BA du langage SQL, tout de même!)

    Le ; ne vient que comme tout dernier caractère pour fermer ta chaîne.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  18. #18
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2017
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    oui pierre j'en suis conscient je comprends pas d'ou il viennent c'est fou. OK je reprends
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select eleveur.id_eleveur , eleveur.nom, abattoir.id_abattoir,abattoir.nom ,  count(id_volaille) from eleveur, volaille, abattoir where (eleveur.id_eleveur=volaille.id_eleveur) and (volaille.id_abattoir = abattoir.id_abattoir) and (date_vente is not null) group by eleveur.id_eleveur, eleveur.nom, abattoir.id_abattoir, abattoir.nom;
    .
    oulala sa me fait passer pour le dernier des cons. Désolé pierre.

  19. #19
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 955
    Points
    55 955
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par donkidle Voir le message
    [...]
    oulala sa me fait passer pour le dernier des cons. Désolé pierre.
    Mais non, ça nous arrive à tous, quand on est le nez sur le code, on ne voit pas forcément ce genre d'erreurs. C'est pourquoi il est important de découper le code en lignes simples et de travailler en pas à pas pour tester les variables...

    Et maintenant, ça fonctionne?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  20. #20
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2017
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Non sa ne fonctionne pas toujours mais pas contre j'ai une nouvelle erreur: "'91' Variable objet ou variable de bloc With non definie" .

Discussions similaires

  1. ORA-00933: SQL command not properly ended
    Par yupa dans le forum Oracle
    Réponses: 3
    Dernier message: 29/03/2022, 16h12
  2. ORA-00933 : SQL COMMAND NOT PROPERLY ENDED
    Par karnass dans le forum SQL
    Réponses: 2
    Dernier message: 20/12/2012, 15h40
  3. [AC-2007] ORA-00933: SQL command not properly ended (#933)
    Par zoom61 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 14/12/2010, 10h38
  4. Réponses: 1
    Dernier message: 08/02/2008, 18h32

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