[déplacé VB.NET -> VBA] Requête SQL dans une macro
dadoucha86
Messages postés2Date d'inscriptionlundi 16 novembre 2009StatutMembreDernière intervention17 novembre 2009
-
16 nov. 2009 à 21:57
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 2015
-
18 nov. 2009 à 00:49
Bonjour,
Dans le cadre d'un projet je souhaite récupérer les lignes d'un tableau excel (4colonnes) avec une macro et exécuter une requête d'insertion SQL vers ma base SQL Server 2005. Pour chaque ligne, quatre variables prennent la valeur des 4 champs et ensuite j'exécute la commande SQL mais j'obtiens l'erreur :
"le type ne correspond pas" et même en changeant le type de mes colonnes dans la table en varchar ainsi que le format des cellules même erreur.
Voici le code
Sub req()
Dim VAR_MOIS As Variant
Dim VAR_PROFIL As Variant
Dim VAR_ID_MOIS As Variant
Dim VAR_JRS_INI As Variant
Sheets("import charges initiales").Select
Set R = Worksheets("import charges initiales")
Dim conn, rs
Set conn = CreateObject("ADODB.Connection") '
conn.ConnectionString = "driver={SQL Server};" & "server=BINT;" & "AFORFAIT;" & "uid=Administrateur;" & "pwd=;"
conn.Open
VAR_PROFIL = R.Cells(2, 1).Value
VAR_JRS_INI = R.Cells(2, 2).Value
VAR_MOIS = R.Cells(2, 3).Value
VAR_ID = R.Cells(2, 4).Value
conn.Execute ["INSERT INTO AFORFAIT.dbo.PLAN_INI (ID_MOIS) VALUES ('1')"]
conn.Execute ["INSERT INTO AFORFAIT.dbo.PLAN_INI (PROFIL) VALUES ("VAR_PROFIL")"]
conn.Execute ["INSERT INTO AFORFAIT.dbo.PLAN_INI (MOIS) VALUES ("VAR_MOIS")"]
conn.Execute ["INSERT INTO AFORFAIT.dbo.PLAN_INI (NB_JRS_INI) VALUES ("VAR_JRS_INI")"]
conn.Close
End Sub
Ce code est pour une ligne pour tester et j'ai fait plusieurs insert pour voir de quel variable venait le problème, mais elles sont toutes en erreur.
Pourtant lorsque les valeur dans l'insert sont en dur ça marche, cependant j'ai besoin de ces variables pour insérer toutes les lignes..
Merci d'avance pour votre aide :)
A voir également:
[déplacé VB.NET -> VBA] Requête SQL dans une macro
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 17 nov. 2009 à 00:07
Salut
Si tu veux insérer 4 champs à la fois (dans une même fiche), il ne faut faire qu'une seule requète d'insertion en respectant les règles SQL, exemple :
Insert Into maTable monChamp1, monChamp2, ...
Values (1, 'toto', 'avril', 4012)
Respecter les règles, c'est bien utiliser les ' pour les champs textes (*), ne pas en mettre pour les chiffres (*), utiliser # pour les dates (*), etc.
(*) : Tels que sont définis les types de champ DANS LA DB
Si tu dois insérer le contenu d'une variable VB dans une chaine qui représente la requète, utiliser la syntaxe VB, exemple :
dadoucha86
Messages postés2Date d'inscriptionlundi 16 novembre 2009StatutMembreDernière intervention17 novembre 2009 17 nov. 2009 à 23:41
Bonsoir,
Merci pour ta réponse, cela m'a débloqué :),
seulement j'ai un problème avec le type décimal, j'ai besoin de ce type dans la table où j'insère, y a t il un type pour cela en VB car je n'en ai pas trouvé. Pour l'instant je me contente de multiplier par 10 mais j'aimerais m'éviter cette manip'
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 18 nov. 2009 à 00:49
Re
J'ai personnellement tapé "decimal" dans l'aide de VBA de Excel et il y a une définition, oui.
Il te faut dimensionner une variable en type Variant et utiliser la fonction de conversion CDec.
Tu as choisi ce type de variable sous SQL, parce que tu dois avoir de très gros chiffres à mémoriser.
Si ce n'est pas le cas, reviens à des types Long, Single ou Double, tu auras moins de problème.
Comme cette valeur doit être insérée dans une chaine, il est convenable d'utiliser aussi le CStr pour éviter toute mauvaise interprétation du code (habitude)
Dim maVar As Variant
maVar = CDec(4.02E+22)
"... Values (1, ..., " & CStr(maVar) & ", ...)"
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)