Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Petit problème d'exécution de la requête SQL

SCorbeil

XLDnaute Nouveau
Bonjour,

Je suis à créer une petite application avec un UserForm qui se connecte à un fichier Excel fermé qui sert de base de données.

Je me suis inspiré de l'approche de SilkyRoad sur Développez.com afin de bâtir mon code. J'ai modifié le driver afin de permettre la connexion au fichier de base de données de type .xlsx. De plus, je confirme que :
  • l'ensemble des variables de type String sont identiques aux entêtes de colonnes du fichier de base de données,
  • les données sont dans le même ordre que les champs dans la base de données,
  • le fichier de référence ainsi que la feuille sont des Constantes établies.
En avançant la progression du code, je rencontre un problème d'exécution lié à un opérateur absent à l'étape de la "ConnLog.Execute StrSQL". Le contenu de la StrSQL contient l'ensemble des informations souhaitées, mais ne s’exécute pas vers le fichier de base de données.

De plus, je me questionne aussi sur l'aspect d'insertion d'une ligne à la base de données pour chaque nouvelle entrée en provenance du UserForm.

Voici mon code actuel

VB:
Private Sub CmdDeclaration_Click()

'Les variables
    Dim ConnLog As ADODB.Connection
    Dim StrSQL As String
    Dim DtHr As Date
    Dim NoYe As Integer
    Dim NomComplet As String, Ordi As String, SIGN As String
    Dim Q1 As String, Q2 As String, Q3 As String, Q4 As String, Q5 As String, Q6 As String, Q7 As String
  
'Les données à insérer:
    NomComplet = Me.CboListeEmpl
    NoYe = Me.LblNoDeclare
    Ordi = ""
    Q1 = Me.CboQ1
    Q2 = Me.CboQ2
    Q3 = Me.CboQ3
    Q4 = Me.CboQ4
    Q5 = Me.CboQ5
    Q6 = Me.CboQ6
    Q7 = Me.CboQ7
    SIGN = Me.TxtAA & Me.TxtMM & Me.TxtJJ & Me.LblNoDeclare
    DtHr = Now()
    
    Set ConnLog = New ADODB.Connection
    
    With ConnLog
        .Provider = "MSDASQL"
        .ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _
            "DBQ=" & Fichier1 & "; ReadOnly=False;"
        .Open
    End With

'Les données doivent être indiquées dans le même ordre que les champs dans la base de données.
    StrSQL = "INSERT INTO [" & Feuille & "] " _
        & "VALUES (" & NomComplet & ", " & NoYe & ", " & Ordi & ", " & Q1 & ", " & Q2 & ", " & Q3 & ", " & Q4 & ", " & Q5 & ", " & Q6 & ", " & Q7 & ", " & SIGN & ", #" & DtHr & "# )"
    
    ConnLog.Execute StrSQL  'Erreur d'exécution...[Microsoft][Pilote ODBC Excel] Erreur de syntaxe (opérateur absent) dans l'expression "Valeur de NomComplet"
    
    ConnLog.Close
    Set ConnLog = Nothing

End Sub

Merci à l'avance pour votre collaboration.
 

_Thierry

XLDnaute Barbatruc
Repose en paix
StrSQL = "INSERT INTO [" & Feuille & "] " _ & "VALUES (" & NomComplet & ", " & NoYe & ", " & Ordi & ", " & Q1 & ", " & Q2 & ", " & Q3 & ", " & Q4 & ", " & Q5 & ", " & Q6 & ", " & Q7 & ", " & SIGN & ", #" & DtHr & "# )"


Bonsoir @SCorbeil , le Forum

Je fais souvent de l'ADO SQL, et ce qui me choque dans la syntax si dessus, c'est que si on parle d'un serveur SQL en destination, ça ne passerait pas (Pour destination sur Excel, je ne sais pas)

"INSERT INTO [" & Feuille & "] " _ & "VALUES ('" & NomComplet & "',.............
Le simple quote doit encadrer toutes les variables de type String....

Ca n'est peut-être que ça...

Bien à toi, à vous
@+Thierry
 

_Thierry

XLDnaute Barbatruc
Repose en paix
De plus, je me questionne aussi sur l'aspect d'insertion d'une ligne à la base de données pour chaque nouvelle entrée en provenance du UserForm.

Pour cette question, la commande INSERT INTO s'en charge toute seule, maintenant sur SQL Serveur c'est plus "natif" de faire ces manips, sur Excel je ne le fais pas, et si tu a l'intention de te lancer dans ADO piloté par VBA, je te conseille d'installer un SQL Serveur Express Gratuit, tu verras c'est bien plus "pro" (et fiable) que d'utiliser une feuille Excel en Base de Données...

Bonne découverte du monde ADO
@+Thierry
 

dysorthographie

XLDnaute Accro
Bonsoir,
Indépendant de ce qui à été dit, qu'elle est l'intérêt de ça ?
Code:
NomComplet = Me.CboListeEmpl
    NoYe = Me.LblNoDeclare
    Ordi = ""
    Q1 = Me.CboQ1
    Q2 = Me.CboQ2
    Q3 = Me.CboQ3
    Q4 = Me.CboQ4
    Q5 = Me.CboQ5
    Q6 = Me.CboQ6
    Q7 = Me.CboQ7
 

SCorbeil

XLDnaute Nouveau
Bonjour dysorthographie,

Il s'agit des réponses de l'employé à un questionnaire...

Q1 pour la réponse à la Question #1 et qui représente aussi l'entête d'une colonne dans le fichier de BDD.
 

dysorthographie

XLDnaute Accro
J'ai compris ce que représentent ces variable mais je ne vois pas l'intérêt de créer une variable Q1, lui affecter Me.CboQ1 puis d'utiliser Q1 dans ta requête alors que tu pourrais utiliser CboQ1 directement dans ta requête !

Ceci dit le plus important de savoir c'est qu'un champ texte et encadré par de simple côté ['] une date par dièse [#] un nombre pas encadré
Code:
texte='texte'
date=#2020-05-20#
Numeric=25.3
 
Dernière édition:

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonsoir à tous,

C'est bien ce que j'écrivais dans mon post #2, oui il faut les simples quotes ' pour encadrer une variable text. (et "jouer" entre les simples quotes ' pour SQL et les double quote " pour VBA pour encadrer les variables String au milieu, ou l'objet ComboBox)

Par contre, SQL Serveur est plus tolérent, pour les dates il n'a pas besoin de #, et je ne sais même pas si ça passerait... Et pour le numérique, oui sans rien.

Bonne soirée
@+Thierry
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…