[Catégorie modifiée .Net -> VBA] Génération d'un fichier SQL sous EXCEL 2010 en

Résolu
MisterSalm Messages postés 2 Date d'inscription vendredi 6 juillet 2012 Statut Membre Dernière intervention 9 juillet 2012 - 6 juil. 2012 à 10:25
MisterSalm Messages postés 2 Date d'inscription vendredi 6 juillet 2012 Statut Membre Dernière intervention 9 juillet 2012 - 9 juil. 2012 à 10:04
Bonjour,
J'ai un petit souci de création d'une macro.
Mon problème.
J'ai des tables SQL de taille XXX et de longueur YYY
Ce que je ne connais pas c'est :
Le nom de la table (Record)
Le nombre de colonne par ligne
Le nombre de ligne.
Mon objectif est de générer automatiquement des scripts.
J'ai un petit table dans ma page de garde ou j'ai mis à "compléter" mes 3 informations.
et je récupère sous cette forme (exemple pour l'INSERT) :
'Tableau des valeurs
p = ActiveSheet.Range("D2").Value (mon nom de Record)
i = ActiveSheet.Range("C2").Value (Nb de colonne)
r = ActiveSheet.Range("B2").Value ( Nb de ligne)

sPhrase = "INSERT INTO" + " " + p + " " + "VALUES"
J'arrive à faire une boucle pour prendre sur une colonne via ça :
Sub GOBRA()
Dim sPhrase As String
Dim i As Integer
sPhrase = "("
For i = 2 To ActiveSheet.Range("F2").Value
sPhrase = sPhrase + "'" + ActiveSheet.Range("A" + CStr(i)).Text + "',"
Next i
sPhrase = sPhrase + "'" + ActiveSheet.Range("A" + CStr(i)).Text + "')"
ActiveSheet.Range("C6") = sPhrase
ActiveSheet.Range("C6").Copy
End Sub
Mais je n'y arrive pas pour prendre en compte les colonnes.
Un exemple :
Données :
Robert MARCEL H CDI
Marc PIGEON H CDD
Table : PASSE

J'aimerai en cliquant sur mon bouton, retrouver sur une page annexe
INSERT INTO PASSE VALUES ('Robert','MARCEL','H','CDI');
INSERT INTO PASSE VALUES ('Marc','PIGEON','H','CDD');


Par avance merci de votre aide.

2 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
6 juil. 2012 à 16:00
Salut

Première chose : Le VB de Excel est du VBA, pas du VB.Net (catégorie)

Ensuite, quand tu colles du code, merci d'utiliser la coloration syntaxique 3ème icone à droite plus facile à relire et conserve les indentations en tête de ligne

Enfin, prends 5 minutes pour te relire. Tes explications ne sont pas très compréhensibles.
De même, le code utilise des noms de cellules, mais on ne sais pas où sont tes données.

Ton code :
'Tableau des valeurs
p = ActiveSheet.Range("D2").Value (mon nom de Record)
i = ActiveSheet.Range("C2").Value (Nb de colonne)
r = ActiveSheet.Range("B2").Value ( Nb de ligne)
- Ce que tu appelles 'Record' est un nom de table, c'est important d'appeler correctement les objets (Record est une ligne de données).
- Tu ranges des valeurs dans des variables, mais que deviennent ces variables ?
D'autant que tu redimensionnes un 'i' dans la Sub qui suit ...

Range("A" + CStr(i)).Text
Pas beau.
Mieux vaudrait utiliser les syntaxes propres comme :
Range("A1").Offset(0, i - 1).Text
Je te laisse regarder dans l'aide l'intérêt de Offset

For i = 2 To ActiveSheet.Range("F2").Value
- Pourquoi commences-tu à 2 ?
- Qu'y a t-il dans F2 ?
Je suppose le nombre de colonnes.
Si tu as 10 dans F2, tu vas donc utiliser les colonnes 2 à 10.
Exact ?
- Sais-tu que, à la sortie d'un For-Next, la variable est égale au maxi de la boucle + 1 ?
Dans ce cas, la ligne qui suit le Next va utiliser la colonne 11 (dans mon hypothèse de 10 dans F2)
Correct ?

ActiveSheet.Range("C6") = sPhrase
ActiveSheet.Range("C6").Copy
Quel est l'intérêt du "Copy" ?

" Mais je n'y arrive pas pour prendre en compte les colonnes. "
Si, tu listes les colonnes, là.
Ce sont les lignes que tu ne scannes pas.

Tout ceci nécessite des éclaircissements.
Rappelle toi qu'on n'a pas ta feuille sous les yeux et qu'il faut décrire le plus simplement ce dont tu disposes.

Vala
Jack, =fr 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)
3
MisterSalm Messages postés 2 Date d'inscription vendredi 6 juillet 2012 Statut Membre Dernière intervention 9 juillet 2012
9 juil. 2012 à 10:04
Bonjour,

Il n'est jamais facile de faire un premier thread sans oublier les regles de base. Comme les explications même annexes ont leur importance...

Quoiqu'il en soit, j'ai réussi à faire ce que je voulais via du VBScript.

' Information sur l'emplacement du fichier EXCEL
nomFichierExcel = InputBox("Entrer le nom du fichier Excel ","Nom du fichier Excel & Emplacement","C:\SCRIPTS\MATRICE.xlsx")

nomFichierSQL = InputBox("ATTENTION, le nom du fichier SQL (sera écrasé si existant) ","Emplacement du fichier SQL","C:\SCRIPTS\INSERT.sql")

nomTable = InputBox("Veuillez indiquer le nom de la Table ","Nom de la Table (Record)","XXXXX")

' Ouverture du fichier Excel pour la création du fichier SQL
Set objExcel = CreateObject("Excel.Application")
Set xlBook = objExcel.Workbooks.Open(nomFichierExcel)
Set xlSht = xlBook.Worksheets("INSERT")
Set format = CreateObject("Scripting.Dictionary")

' Lire la première ligne pour connaitre le format des données (n Numérique / s Autre)
colonne = 1
Do Until objExcel.Cells(1,colonne).Value = ""
format.Add colonne, xlSht.Cells(1, colonne).value
colonne = colonne + 1
Loop

' Lire les lignes et dumper dans un fichier sql
Set fso = CreateObject("Scripting.FileSystemObject")
Set fsql = fso.CreateTextFile(nomFichierSQL, True)

ligne = 2
Do Until objExcel.Cells(ligne,1).Value = ""
colonne = 1
valueString = ""
Do Until objExcel.Cells(ligne,colonne).Value = ""
If colonne > 1 Then
valueString = valueString & ","
End If
' Echaper les simples cotes dans les chaînes de caractères
myValue = Replace(xlSht.Cells(ligne, colonne).value,"'","''")

If format.Item(colonne) = "s" and myValue <> "NULL" Then
valueString = valueString & "'" & myValue & "'"
Else
valueString = valueString & xlSht.Cells(ligne, colonne).value
End If
colonne = colonne + 1
Loop
fsql.WriteLine "INSERT INTO " & nomTable & " VALUES (" & valueString & ");"
ligne = ligne + 1
Loop

fsql.Close
objExcel.Quit

WScript.Echo "Le Traitement terminé"

' Fin du Script 


Désolé pour la gène et merci d'avoir répondu à mon message.

Mister Salm
0
Rejoignez-nous