Exemple d'insertion de données sql dans excel

Soyez le premier à donner votre avis sur cette source.

Snippet vu 16 588 fois - Téléchargée 33 fois

Contenu du snippet

Ce code montre comment créer un recordset à partir d'une base SQL et l'insérer dans une feuille Excel à la suite des lignes existantes. La sélection se fait selon un date saisie par l'utilisateur dans un formulaire.

Source / Exemple :


Private Sub CommandButton1_Click()

'   ***** DEMANDE L'ACTIVATION DU COMPOSANT MICROSOFT ACTIVEX DATA OBJECT 2.7 LIBRARY
'   ***** DEPUIS MENU "OUTILS" - "RÉFÉRENCES" DE L'ÉDITEUR VISUAL BASIC

    Dim Cnx As New ADODB.Connection
    Dim Rst As New ADODB.Recordset
    Dim Année As String * 4
    Dim Mois As String * 2
    Dim Jour As String * 2
    Dim AMJ As String * 8
    Dim Req1 As String
    Dim Req2 As String
    Année = TextBox1
    Mois = TextBox2
    Jour = TextBox3
    AMJ = Année & Mois & Jour

'   ***** INSTRUCTIONS DE SÉLECTION DES CHAMPS ET DE JOINTURE *****
    Req1 = "select d.inputdate, cu.inv_name, c.sit_name, c.sit_town, a.ct_name, a.ct_town, d.dwgbbsnum, "
    Req1 = Req1 & "d.esrc_file, d.rc_num, r.ps_code, r.fabweight, d.delivstart, r.cust_ref from dwgbbs as d "
    Req1 = Req1 & "join ref_ps as r on r.esrc_file = d.esrc_file and r.rc_num = d.rc_num and r.ps_title = d.dwgbbsnum "
    Req1 = Req1 & "join contract as c on c.esrc_file = d.esrc_file and c.rc_num = d.rc_num "
    Req1 = Req1 & "left join contradr as a on a.esrc_file = d.esrc_file and a.es_num = d.es_num and a.seq_num = r.addr_num "
    Req1 = Req1 & "join customer as cu on cu.cust_code = c.cust_code"

'   ***** SÉLECTION SELON DATE SAISIE DANS LE FORMULAIRE *****
    Req2 = "where d.esrc_file = 'cht05' and d.rc_num <> 4 and d.inputdate = " & AMJ
    Req1 = Req1 & " " & Req2

'   ***** OUVERTURE DE LA BASE *****
    Cnx.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Initial Catalog=Favre;Data Source=Serveur-corc"

'   ***** RECHERCHE DE LA DERNIÈRE CELLULE NON VIDE *****
    Range("A10000").Select
    Selection.End(xlUp).Select

'   ***** OUVERTURE DU RECORDSET *****
    Rst.Open Req1, Cnx, adOpenKeyset

'   ***** COPIE DU RECORDSET DEPUIS LA LIGNE SUIVANTE *****
    ActiveCell.Offset(1, 0).CopyFromRecordset Rst

'   ***** FERMETURE ET VIDAGE *****
    Rst.Close: Set Rst = Nothing
    Cnx.Close: Set Cnx = Nothing
    Unload UserForm1
    Application.ScreenUpdating = True
End Sub

Conclusion :


Notez bien le premier commentaire, je suis resté bloqué un moment à cause de ça.

A voir également

Ajouter un commentaire

Commentaires

zen69
Messages postés
588
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
29 avril 2010
1 -
C'est bien beau tout ça... mais comment faire pour transférer le nom des colonne avec les données ?

Si c'est possible ça m'aiderait beaucoup parce que certaines de mes requêtes on un nombre de colonne variables du entre autre à des pivot tables...

J'utilise la fonction CopyFromRecordset depuis un bon bout, mais je n'arrive pas à faire quelque chose d'aussi simple.

C'est plate parce que cette fonctionnalité manquante (du moins je crois), m'oblige à créer du code lourd et non standard du côté SQL.

Voici donc un exemple de code que j'utilise dans une de mes procédure stockées afin de transférer les headers avec le reste.

SET @i=(SELECT COUNT(*)
FROM information_schema.columns
WHERE TABLE_NAME='ut_RptQryProdTemp')

SET @loop = 1
SET @fld_list = ''
SET @val_list = ''
WHILE (@loop <= @i)
BEGIN
SELECT @select = 'SELECT ''['' + COLUMN_NAME + ' + '''],''' + ' AS F
INTO ##fld_list
FROM information_schema.columns
WHERE TABLE_NAME=''ut_RptQryProdTemp'' AND ORDINAL_POSITION=' + convert(varchar(3),@loop)
EXEC (@select)
SELECT @tmp = (SELECT REPLACE(F, ',', '') + ' AS ' + REPLACE(F, 'PRODOUT],', '],') + '' FROM ##fld_list)
SELECT @val_list = @val_list + @tmp
SELECT @fld_list = @fld_list + REPLACE(STUFF(@tmp, 1, 0, 'CAST('), ' AS [', ' AS varchar) AS [')
DROP TABLE ##fld_list
SET @loop = @loop + 1
END
SET @fld_list = LEFT(@fld_list, LEN(@fld_list) - 1)
SET @val_list = LEFT(@val_list, LEN(@val_list) - 1)
SET @val_list = REPLACE(@val_list, ',[', ',''')
SET @val_list = REPLACE(@val_list, '] AS', ''' AS')
SET @val_list = REPLACE(@val_list, 'PRODOUT', '')
SET @val_list = STUFF(@val_list, 1, 1, '''')

EXEC ('SELECT ' + @val_list + ' UNION ALL SELECT ' + @fld_list + ' FROM ut_RptQryProdTemp ORDER BY _DEP, _FAM, _STYLE, _COLOR, [_SIZE]')
Utilisateur anonyme -
Bonjour,

Pour le support de ADO par Excel, la procédure est différente selon la version d'Excel.

Pour Excel 97, le support primaire va à DAO, et il faut programmer différemment la manipulation des données que pour Excel 2000 et +

L'article microsoftien suivant compare les deux méthodes. Je laisse des lignes vides avant et après le lien

http://support.microsoft.com/default.aspx?scid=kb;fr;246335


D'autre part le numéro de version de la bibliothèque ADO, suit les numéros de version de MDAC. Sauf que je n'ai jamais essayé de savoir si le GUID de la dll changeait d'une version à l'autre.
dp_favresa
Messages postés
132
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
11 mai 2010
-
Bonjour,
Je suis loin d'être spécialiste en ce domaine, mais si
la base de départ est un tableau Excel (comme je crois
comprendre la question), je n'utiliserai pas un recordset
mais par exemple quelquechose comme :

Cells(x, y) = Cells(a ,b)

Salutations. dp
SR2
Messages postés
46
Date d'inscription
samedi 17 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2006
1 -
Est-ce que la fonction " COPYFROMRECORDSET" fonctionne depuis une base Excel
car Chez moi ca marche pas

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.