Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/09/2011, 10h34   #1
Membre Expert
 
Avatar de rvtoulon
 
Homme Hervé
Agent Technique
Inscription : mars 2009
Messages : 823
Détails du profil
Informations personnelles :
Nom : Homme Hervé
Âge : 36
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Agent Technique
Secteur : Santé

Informations forums :
Inscription : mars 2009
Messages : 823
Points : 1 441
Points : 1 441
Par défaut Erreur sur requete sql insert into

Bonjour,
je rencontre un problème avec une requête sql insert to.
Le but de cette requête est d'ajouter une ligne dans un tableau d'un classeur fermé. Après avoir consulter le tutos sur les classeurs fermés, j'ai écrit mon code.

voici mon problème:
cas n°1:
Lorsque je fait ma requête comme ceci:
Code :
texte_SQL = "INSERT INTO [" & NomFeuille & "$] " & "VALUES ('" & numdemande & "', '" & date1 & "', '" & nom1 & "', '" & etbls & "', '" & lieu & "', " & "'" & domaine & "', '" & typeprob & "', '" & descrip & "', '', '', '', '')"
j'obtiens ceci :
Code :
INSERT INTO [Bd$] VALUES ('2011-0120', '19/09/2011', 'Sélection du nom...', 'Etablissement...', 'Pièces...', 'Catégorie...', 'Type de problème...', '', '', '', '', '')
ici la date est un string et la variable est déclaré en tant que string, les derniers champs sont vides. Au moment de l'éxécution ceci provoque une erreur.

cas n°2:
Maintenant lorsque je fais ceci:
Code :
    texte_SQL = "INSERT INTO [" & NomFeuille & "$] " & "VALUES ('" & numdemande & "', #" & date1 & "#, '" & nom1 & "', '" & etbls & "', '" & lieu & "', " & "'" & domaine & "', '" & typeprob & "', '" & descrip & "', '', '', '', '')"
j'obtiens ceci :
Code :
INSERT INTO [Bd$] VALUES ('2011-0120', #19/09/2011#, 'Sélection du nom...', 'Etablissement...', 'Pièces...', 'Catégorie...', 'Type de problème...', '', '', '', '', '')
ici la date est une Date et la variable est déclaré en tant que Date, les derniers champs sont vides. Au moment de l'éxécution ceci provoque toujours une erreur.

Pour les 2 cas l'erreur est la même :
"Erreur d'éxécution '-2147217913(8004e07)':
Type de données incompatible dans l'expression du critère."

J'ai mis les champs vides à la fin pour respecter le nombre de champ. Dans ma table j'ai 12 champs les quatres derniers seront remplis par une requête update par un autre utilisateur.

Est-ce que j'ai loupé quelques choses? Est-ce une erreur de syntaxe?

Merci de votre aide

EDIT: Il me semble utile de mettre le code complet :
Code :
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 MAJ_Bd_2()
 Dim Cn As ADODB.Connection, Fichier As String, NomFeuille As String, texte_SQL As String
 Dim Rst As ADODB.Recordset
 Dim numdemande As String, date1 As Date, nom1 As String
 Dim etbls As String, lieu As String, domaine As String, typeprob As String
 Dim descrip As String
 
 
 
 
    'Définit le classeur fermé servant de base de données
    Fichier = "G:\Atelier\DEMANDE INTERVENTION\DATA Intervention.xlsm"
    'Nom de la feuille dans le classeur fermé
    NomFeuille = "Bd"
 
   Set Cn = New ADODB.Connection
 
 
 
    'Les données à insérer:
    With UserForm1
      numdemande = numserie
      'date1 = Format(.MonthView1, "dd/mm/yyyy")
      date1 = CDate(Format(.MonthView1, "dd/mm/yyyy"))
      nom1 = .ComboBox1.Value
      etbls = .Label3.Caption
      lieu = .Label4.Caption
      domaine = .ComboBox2.Value
      typeprob = .ComboBox3.Value
      descrip = Replace(.TextBox1.Value, "'", "''")
    End With
 
      '--- 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
    '-----------------
    'Les données doivent être indiquées dans le même ordre que les champs dans la base de données.
    texte_SQL = "INSERT INTO [" & NomFeuille & "$] " & "VALUES ('" & numdemande & "', #" & date1 & "#, '" & nom1 & "', '" & etbls & "', '" & lieu & "', '" & domaine & "', '" & typeprob & "', '" & descrip & "', '', '', '', '')"
 
    Debug.Print texte_SQL
 
    Cn.Execute texte_SQL
 
    Cn.Close
    Set Cn = Nothing
End Sub
__________________
@+

Si vous avez trouvé la solution à votre problème n'oubliez pas d'appuyer sur
Et n'oubliez pas de voter en appuyant sur si ce message a repondu à vos attentes.
Ou sur si ce n'est pas le cas
rvtoulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 11h48   #2
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Il se peut que ce soit l'une des facéties de Jet
En fait, même si tu peux spécifier le format date régional que tu utilises, Jet n'accepte que le format américain en # MM/DD/YYYY #.
Je l'avais lu dans l'aide Access mais je ne retrouve plus l'article en question. Un site sérieux qui en parle: http://allenbrowne.com/ser-36.html

Si ça ne fonctionne toujours pas, tu peux essayer de "l'insérer" comme un 'double' et de définir le format de la colonne sous Excel en 'date', la conversion ne devrait pas poser de problème.
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 14h10   #3
Membre Expert
 
Avatar de rvtoulon
 
Homme Hervé
Agent Technique
Inscription : mars 2009
Messages : 823
Détails du profil
Informations personnelles :
Nom : Homme Hervé
Âge : 36
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Agent Technique
Secteur : Santé

Informations forums :
Inscription : mars 2009
Messages : 823
Points : 1 441
Points : 1 441
Merci Sclarckone,
mais même en formatant la date avec comme ceci "mm/dd/yyyy" cela ne fonctionnait pas.

Après quelques essais sur un fichier test je me suis rendu compte que mes requêtes, aussi bien l'une que l'autre fonctionnait très bien lorsque les cellules du tableau n'étaient pas formatées en Date.Ce n'est donc pas un problème de syntaxe.
J'ai donc formaté mes cellules aux format Texte et tout fonctionne à merveille.
Si quelqu'un à une explication je suis curieux de savoir pourquoi.
__________________
@+

Si vous avez trouvé la solution à votre problème n'oubliez pas d'appuyer sur
Et n'oubliez pas de voter en appuyant sur si ce message a repondu à vos attentes.
Ou sur si ce n'est pas le cas
rvtoulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 14h40   #4
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Citation:
Envoyé par rvtoulon Voir le message
J'ai donc formaté mes cellules aux format Texte et tout fonctionne à merveille.
Si quelqu'un à une explication je suis curieux de savoir pourquoi.
J'ai bien une idée à ce sujet mais sans aucune garantie:


Tu le sais probablement déjà mais le format date/heure n'existe pas en tant que tel. Les dates sont en fait stockées sous forme de Double dont la partie entière représente le nombre de jour, et la partie décimale le nombre d'heures, minutes, secondes en "fraction de jour".
L'origine est prise au 01/01/1900 à 00h00m00s.

Donc si tu déclares que ta cellule Excel est au format date, tu ne peux pas rentrer la date sous sa valeur littérale dd/mm/yyyy. Je sais que cela fonctionne quand on le fait à la main mais il doit y avoir une conversion implicitement faite par Excel.
J'en veux pour preuve ce que donne l'enregistreur de macro lorsque je rentre à la main le 05/06/2011 dans une cellule préalablement formatée en date/heure:

Code :
1
2
    Range("P1").Select
    ActiveCell.FormulaR1C1 = "6/5/2011"    'on remarque au passage l'utilisation du format mm/dd/yyyy même si le format régional est défini par dd/mm/yyyy
D'où les problèmes que tu rencontres car c'est la valeur de la cellule que Jet doit modifier avec l'instruction INSERT INTO.

Ceci dit, je pensais qu'en utilisant les tags '#' spécifiques au format date d'Access, la conversion en 'double' serait implicitement faite et que l'on pourrait alimenter des cellules Excel au format 'date'.
Mais ce n'est apparemment pas le cas...l'utilisation de Jet pour les classeurs Excel a donc des limites facilement franchissables!
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 18h03   #5
Membre Expert
 
Avatar de rvtoulon
 
Homme Hervé
Agent Technique
Inscription : mars 2009
Messages : 823
Détails du profil
Informations personnelles :
Nom : Homme Hervé
Âge : 36
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Agent Technique
Secteur : Santé

Informations forums :
Inscription : mars 2009
Messages : 823
Points : 1 441
Points : 1 441
Merci pour tes explications
__________________
@+

Si vous avez trouvé la solution à votre problème n'oubliez pas d'appuyer sur
Et n'oubliez pas de voter en appuyant sur si ce message a repondu à vos attentes.
Ou sur si ce n'est pas le cas
rvtoulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h30.


 
 
 
 
Partenaires

Hébergement Web