[.NET] EXPORT EXCEL XLS RAPIDE PAR MSQUERY (PROC STOCKÉES TABLES VUES REQUETES .
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018
-
11 déc. 2004 à 11:07
cosmos_final
Messages postés1Date d'inscriptionmercredi 1 mars 2006StatutMembreDernière intervention28 avril 2010
-
28 avril 2010 à 14:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cosmos_final
Messages postés1Date d'inscriptionmercredi 1 mars 2006StatutMembreDernière intervention28 avril 2010 28 avril 2010 à 14:07
Je reve ou CommandText a une taille limite ?
J'essaye avec une requete de 15 lignes environ et sa me fait une erreur de type, alors que si je suprime des caracteres il n'y a plus d'erreur ...
Quelqu'un a une idée pour executé des requetes plus longue ?
greg38bj
Messages postés83Date d'inscriptionjeudi 11 mars 2004StatutMembreDernière intervention17 novembre 2008 20 déc. 2007 à 22:45
salut
cette source m'a été trés utile, mais j'aimerais pouvoir changer une image présente sur ma feuille excel par cette méthode.
Est ce possible ?
l'enregistreur de macro ne me fait rien sur les images ...
merci de m'aider si cela est possible
greg38bj
cs_Benouille
Messages postés215Date d'inscriptionjeudi 24 octobre 2002StatutMembreDernière intervention 7 septembre 2007 11 juin 2007 à 12:52
je ne vois pas de différence quelque soit la source des données.
reste juste à trouver la chaine de connection vers ton dataset à mon avis.
en même temps je l'ai jamais fait (datatable vers excel direct) et si j'avais à le faire, je crois que je ferais pas comme ça de toutes façons.
je pense que tu dois avoir un moyen simple de le faire, essaie par exemple de mettre ta datatable dans la 1ère cellule. il se pourrait qu'excell s'aperçoive qu'il s'agit d'un tableau et te le dispatche tout seul.
Dans tous les cas il doit y avoir une méthode plus rapide, moins pénible et surtout moins vilaine que le remplissage cellule par cellule.
Benouille, quelques grammes de grenouille dans un monde de brute
cs_M51
Messages postés63Date d'inscriptiondimanche 20 novembre 2005StatutMembreDernière intervention10 août 2007 7 juin 2007 à 17:29
Salut,
je souhaite Exporter une DataTable vers Excel (cette DataTable est construite d'après des données de Dataset retravaillé)
Existe-t'il un moyen de ne pas passer par de la cellule à cellule ?
Le code ici doit se connecter à une base (voire base Access dans le cas de xtrusion)
Merci d'avance
cs_Benouille
Messages postés215Date d'inscriptionjeudi 24 octobre 2002StatutMembreDernière intervention 7 septembre 2007 6 mars 2007 à 20:52
ah
cmd_raz
Messages postés12Date d'inscriptionmercredi 29 octobre 2003StatutMembreDernière intervention11 mai 2007 16 févr. 2007 à 11:26
C'est trés pratique c'est sur la question; si j'ai un lien de foto et que je veux que la foto sois integre dans la feuille on ne peut pas le faire.
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 19 sept. 2006 à 15:59
Il est possible d'exporter via ODBC vers un fichier Excel, à condition que la première ligne contienne l'entete de chaque colonne (et c'est aussi une bonne idée d'ajouter une ligne d'exemple pour indiquer à Excel le type de donnée à recevoir), voir un exemple ici :
ODBCDotNet : Extraire des requêtes ODBC dans un tableau de tableaux de String
www.vbfrance.com/code.aspx?ID=34701
Je vais mettre à jour cette source prochainement.
cycofred0
Messages postés6Date d'inscriptionlundi 28 août 2006StatutMembreDernière intervention11 décembre 2007 18 sept. 2006 à 15:15
Le code ci-dessus part d'une base de données. Dans mon cas je cherche à exporter vers Excel une matrice en mémoire, donc ODBC est proscrit (à moins d'exporter le contenu de ma matrice vers une base avec 50.000 "INSERT INTO" mais c'est aussi lent je présume...)
cs_Benouille
Messages postés215Date d'inscriptionjeudi 24 octobre 2002StatutMembreDernière intervention 7 septembre 2007 18 sept. 2006 à 14:52
cycofredo: c'est exactement le but de cette source
cycofred0
Messages postés6Date d'inscriptionlundi 28 août 2006StatutMembreDernière intervention11 décembre 2007 28 août 2006 à 15:11
Sympa.
Pour ma part je cherche à balancer le contenu d'un gros tableau en mémoire dans Excel. Problème de performance avec : MyXL.Worksheets(X).cells(Y,Z).value = "BLAH BLAH" qui rame à mort quand il y en a pour plusieurs milliers de lignes.
La méthode la plus rapide que j'ai trouvée est de générer d'exporter mon tableau en HTML, puis de l'importer dans un objet Excel (temps d'exécution passant de 3 minutes à 15 secondes par fichier). Question : y a t'il plus simple / plus rapide ?
Merci :-)
cs_isame
Messages postés31Date d'inscriptionsamedi 6 septembre 2003StatutMembreDernière intervention25 juin 2007 24 févr. 2006 à 15:49
oui j'ai excel 2000
cs_Benouille
Messages postés215Date d'inscriptionjeudi 24 octobre 2002StatutMembreDernière intervention 7 septembre 2007 24 févr. 2006 à 15:37
t'es sur que t'as excel sur le serveur?
ça de mande de la configuration je crois pour les utiliser en distant
SR2
Messages postés46Date d'inscriptionsamedi 17 juillet 2004StatutMembreDernière intervention25 juillet 20061 24 févr. 2006 à 11:56
essaies
dim xlapp as object
set xlapp=createobject("excel.application")
cs_isame
Messages postés31Date d'inscriptionsamedi 6 septembre 2003StatutMembreDernière intervention25 juin 2007 23 févr. 2006 à 15:05
bah si
j'arrive a créer un fichier texte ou xml mais pas excel...
il bloque à
xlapp= new Excel.application
cs_Benouille
Messages postés215Date d'inscriptionjeudi 24 octobre 2002StatutMembreDernière intervention 7 septembre 2007 23 févr. 2006 à 14:59
faut croire que non ;Þ
cs_isame
Messages postés31Date d'inscriptionsamedi 6 septembre 2003StatutMembreDernière intervention25 juin 2007 22 févr. 2006 à 18:12
bonsoir si quelqu'un pourrait m'aider
kan je l'excéute (application web) il me met une erreur
<System.UnauthorizedAccessException: Accès refusé. >
pourtant j'ai donné tous les droits
DocPhiphi
Messages postés42Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 4 novembre 2008 15 févr. 2005 à 22:08
Pour avoir la librairier Microsoft Excel 9 il faut avoir Excel installé sur son poste, donc l'acheter......
cs_guigui43
Messages postés6Date d'inscriptionmercredi 24 septembre 2003StatutMembreDernière intervention25 février 2005 15 févr. 2005 à 11:13
J'ai pas cette librairie Microsoft excel 9 !!!
Comment faire ou peut-on me l'envoyer?
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 3 févr. 2005 à 11:37
XLDOTNET : QUITTER EXCEL SANS LAISSER D'INSTANCE EN RAM
www.vbfrance.com/code.aspx?id=27541
xtrusion
Messages postés51Date d'inscriptionmardi 11 janvier 2005StatutMembreDernière intervention20 mai 2006 3 févr. 2005 à 09:47
bon ben voila, ca fonctionne a merveille ! Merci a vous tous car joré jamais pu y arriver tout seul ! :P
Jsé meme pa kommen vous avé été capable de faire un truc pareil ... ( et encore jme doute ke c pa ce kil y a de plus difficile a faire ... ms kd meme ! lol ) il me reste plus ka virer excel de la RAM automatikement pr eviter kil plante ...
MERCI surtout a BENOUILLE pr sa patience et ses connaissances ! ^^
++
xtrusion
Messages postés51Date d'inscriptionmardi 11 janvier 2005StatutMembreDernière intervention20 mai 2006 1 févr. 2005 à 13:26
OK merci pr tout en tout cas ! La jvé chercher c juste un pb de syntaxe ...
++
cs_Benouille
Messages postés215Date d'inscriptionjeudi 24 octobre 2002StatutMembreDernière intervention 7 septembre 2007 1 févr. 2005 à 11:06
le principe ici d'utiliser msquery à la différence des solutions habituelles de remplissage d'une feuille excell par parcourt d'un recordset (ou dataset maintenant), c'est d'utiliser la puissance de msquery pour qu'il fasse lui meme l'acces a la bdd (ici access).
ça veut dire que tu crées un fichier un excel par le code, et ce fichier excel vit ensuite sa vie tout seul, pouvant meme rafraichir ses données avec la base sans intervention de ton programme qui l'a construit.
ça veut dire aussi puisqu'il n'est pas lié a ton programme, qu'il ne le connait pas, la chaine de connection sera donc créée une fois pour toute.
(mais tu peux la modifier depuis ton classeur xls créé).
si c'est au moment de l'instalation (création du doc excel dans le rep de l'application qui peut être n'importe ou mais qui ne bougera jamais une fois posé) que tu veux déterminer le app.path alors la tu peux le faire.
pour ça faut lui passer une chaine string qui contienne le bon chemin. dans ta chaine tu lui passes en dur "application.startuppath", c'est pas malin: c'est la valeur chaine de application.startuppath qui est interressante pas son nom en lui meme.
autrement dit:
sConnection = "odbc ... " & app.path & " ....
ou la valeur de app.path est insérée au bon endroit.
attention: comme dit plus haut, la chaine de connection est ensuite figée dans excel.
ça me dérange pas de t'aider dans la mesure ou t'attends pas de moi que je resolve tes problemes ou que je te programme ton truc à ta place; dans la mesure ou tu reflechis et que tu cherches les solutions par toi meme avant de poser les questions.
bonne prog.
ouaip tu pourras pas m'aider en vb: je suis passé a vb.net ;)
mais c'est pas grave, tu pourras aider quelqu'un d'autre, c'est pas juste entre nous deux que ça se passe.
xtrusion
Messages postés51Date d'inscriptionmardi 11 janvier 2005StatutMembreDernière intervention20 mai 2006 1 févr. 2005 à 09:08
T'es trop le meilleur Benouille ! :P
Ca fonctionne a merveille !
Dernière question, promis apré je t'embete plus ! ;o)
Ma base de donnée doit pouvoir être deplacée, donc j'essaye de lui mettre un chemin relatif, et quelque soit ce que j'essaye ca marche pas ... Jvoudré simplement kelle soit définie par défaut dans le repertoire de l'executable .... Donc je fé :
Ms il a pa l'air d'apprecier le Application.StartupPath ... J'essaye de le mettre entre "&" et tout ms il aime pa trop trop trop ca ! lol Alor ke ds ma chaine de connection a BDD ca fonctionne ...
J'ai essayé ca aussi ms sans succès :
Si ta une idée merci, sinon, laisse tomber ;o) tu en a deja assez fé ! Merci pour tout! (jdiré bien a charge de revanche ms ... jriske pa de pouvoir t'aider en VB apparement ! :p ) LOL
cs_Benouille
Messages postés215Date d'inscriptionjeudi 24 octobre 2002StatutMembreDernière intervention 7 septembre 2007 31 janv. 2005 à 19:37
ah bin vi c'est plutot caca ton truc
la chaine de connection doit pas être si lourdement vétue, elle doit se retrouver quasi à poil: en string.
moi j'aurais fait comme toi: enlevé les tableaux (array)
"ODBC;DSN=MS Access Database;DBQ=C:\Documents and Settings\Administrateur\Bureau\Projet 2005\Projet 2005\Biblio[FAL62]\bin\biblio.mdb;DefaultDir=C:\Documents and Settings\Administrateur\Bureau\Projet 2005\Projet 2005\Biblio[FAL62]\bin;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;",Destination:=Range("A1"))
idem plus bas
.CommandText = "SELECT Document.Titre, Document.Date, Document.Public, Document.Support, Document.Thème, Document.Service, Document.Auteur, Document.MaisondEdition, Document.NumRevue, Document.DatedePublication, Document.RevuecontenantlArticle, Document.Résumé, Document.Emplacement, Document.NombredExemplaires FROM Document ORDER BY Document.Titre"
s'il attends du string, il faut lui passer du string.
vbnouille, grenouille en string
xtrusion
Messages postés51Date d'inscriptionmardi 11 janvier 2005StatutMembreDernière intervention20 mai 2006 31 janv. 2005 à 13:54
Le soucis c kil me dit ke array est un type donc kil ne pe pa etre utiliser en tant qu'expression ... Et si je les vire les array, ca marche pa .... jcomprends pa ...
Ya kelke chose a faire ? ;o) toi t'en as pa ds ton code source des array .... moi jen ai partout ! lol
T'a pa une idée par hazard? :P
Merci davance !
cs_Benouille
Messages postés215Date d'inscriptionjeudi 24 octobre 2002StatutMembreDernière intervention 7 septembre 2007 28 janv. 2005 à 17:33
la macro sert a récupérer le code.
tu ouvres un nouvelle macro pour commencer l'enregistrement.
ensuite tu vas dans excel, données, données externes, nouvelle requete. la tu dois choisir une source de données, tu choisis MS Access DAtabase, tu pointes sur ton .mdb, et tu fais une requete bidon (select * from matable ou matable est le nom d'une table de ta base access). à la fin tu dois avoir les données de ta tables acces dans excel.
tu arrete ta macro et tu regardes dans le code de la macro la chaine de connection qu'il a utilisé, tu remplaces ma chaine de connection par la tienne et cela devrait fonctionner.
je suppose que tu devrais avoir une différence ici: ODBC;DRIVER=SQL Server; parceque tu ne vas pas passer par odbc mais oledb et pas prendre le driver prévu pour sql server mais celui pour access.
je n'ai pas access donc je ne peux pas tester pour toi, mais tu devrais t'en sortir en faisant les choses calmement et en lisant bien tout.
xtrusion
Messages postés51Date d'inscriptionmardi 11 janvier 2005StatutMembreDernière intervention20 mai 2006 28 janv. 2005 à 13:54
paske la g mi ca ms ca marche pa, ca ouvre excel ms rien de plus :
.CommandText = "select * from Document" ' ou la requete select * from machin si vous n'avez pas de proc
Merci les gars ! ;o)
xtrusion
Messages postés51Date d'inscriptionmardi 11 janvier 2005StatutMembreDernière intervention20 mai 2006 28 janv. 2005 à 13:50
merci a toi ms jcomprends pa commen tu ve ke je me connecte a ma bdd access a partir d'excel, ds outils macro, jvois pa koi faire, jpense avoir tout essayé ! :p
Et kd tu me dis de remplacer le nom du serveur par mes noms a moi, je mets koi ? g koi a remplacer conkretement steplé?
Merci de votre aide ! elle mé precieuse ! :p
cs_Benouille
Messages postés215Date d'inscriptionjeudi 24 octobre 2002StatutMembreDernière intervention 7 septembre 2007 28 janv. 2005 à 01:16
access n'est pas a proprement parlé un serveur, mais a priori ça ne change pas grand chose, remplace donc le nom du serveur de la base par tes noms et la proc stockée par ta requete et cela devrait marcher.
si cela ne fonctionne pas , va dans excel, ouvre une nouvelle macro, connecte toi depuis excel à ta base access, recupère le code et remplace le ici.
ça n'est pas plus compliqué que ça.
-----------------
xtrusion
Messages postés51Date d'inscriptionmardi 11 janvier 2005StatutMembreDernière intervention20 mai 2006 27 janv. 2005 à 16:55
Salu!
Voici ma methode pr me connecter a ma base de données access :
======================================
Imports System.Data
Imports System.Data.OleDb
Imports System.Net
Public Class visudocs
Inherits System.Windows.Forms.Form
'declaration de la connection
Private Connection As New OleDb.OleDbConnection
'declaration du DataSet
Private DtSet As New DataSet
'declaration du dataAdapter
Private Adapbiblio As New OleDb.OleDbDataAdapter("select Titre, Date, Public, Support, Thème, Service, Auteur, MaisondEdition, DatedePublication, RevuecontenantlArticle, Emplacement, NombredExemplaires, Résumé from Document order by Titre", Connection)
Private Sub visudocs_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'on parametre la chaine de connection pour la base de donnée biblio.mdb
Connection.ConnectionString = "provider=microsoft.jet.oledb.4.0;" & _
"data source= " & Application.StartupPath & "" & "biblio.mdb;"
'rempli le dataset
Adapbiblio.Fill(DtSet, "Document")
'remplissage de la liste avec le dataset
Dim Matable As DataTable
Matable = DtSet.Tables("Document")
Grid_docs.DataSource = Matable
end sub
======================================
Commen faire pr appliker cette premiere source déposée par benouille a mon projet sivouplé?
Je suppose ke tout se passe ici :
**************************
With xsSoldesComptes5.QueryTables.Add(Connection:= _
"ODBC;DRIVER=SQL Server;SERVER=MonServeur;Integrated Security=SSPI;" & _
"APP=Microsoft® Query;DATABASE=MaBase;Trusted_Connection=Yes" _
, Destination:=xsSoldesComptes5.Range("A1"))
**************************
Mais commen faire?
C'est vraimen important les gars ! ;o)
Merci davance all !
cs_Benouille
Messages postés215Date d'inscriptionjeudi 24 octobre 2002StatutMembreDernière intervention 7 septembre 2007 12 janv. 2005 à 16:04
je saurais m'en souvenir si je travaille avec un recordset local ou si pour une raison soudaine, l'utilisateur venait a avoir moins de droits que l'appli (mais avec moi il y a peu de chance: l'applis n'a pas de droits, seuls les droits utilisateurs comptent).
dans les autres cas ou je peux connecter excel à la base de données sans passer par vb, sachant en outre que cela permet une mise a jour ultérieure des données (une requete msquery pouvant être mise a jour), j'utiliserais msquery.
en plus en enlevant les options qui servent a rien, ça va un plus vite malgres tout (évite les entetes de colonnes); meme si je reconnais pour le coup que l'argument du gain de 4 secondes d'écriture de code peut être limite :)
a voir en perf aussi si c'est pareil, ou si c'est plus rapide.
En bref je garde les deux et je ferais selon le besoin ;)
merci pour ta réactivité et tes eclaircissements.
VBnouille
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 12 janv. 2005 à 15:47
Oui c'est générique, quelqu'un a fait une démo à ce sujet récemment :
www.vbfrance.com/code.aspx?ID=28744
En plus il est passé par ADODB, on n'est pas obligé de passer par Access, ca devrait donc marcher aussi en .Net
Je confirme que ca marche bien avec toutes les versions d'Access, je viens de livrer un logiciel avec à un client !
Par contre j'ai déjà rencontré un cas où ca ne marche plus sur un poste : on obtenait l'err n°430 (Requete ADO au lieu de DAO avec Excel 97 ???) et je n'ai jamais pu corriger cela (il faut reinstaller Excel dans ce cas je pense)
cs_Benouille
Messages postés215Date d'inscriptionjeudi 24 octobre 2002StatutMembreDernière intervention 7 septembre 2007 12 janv. 2005 à 15:38
visiblement il y a des soucis avec cette fonction
--------------------------------------------------------------------------------
Posté par : PIERRERAVAUX
le 08/08/2003 12:27:41
Re : Exportation d'un recordset
Répondre à ce message - Imprimer ce message
--------------------------------------------------------------------------------
Bonjour,
J'ai un petit problème avec cette instruction Copyfromrecordset qui fonctionnait très bien avec une base ACCESS97 et qui ne fonctionne plus avec ACCESS2000
Est-ce à cause de cette library Microsoft Excel 9.0 que je n'ai pas sur mon poste.
en fait au dela de la version d'excel je suppose que le probleme vient plus de l'acces aux données. donc vérifie si ta fonction marche encore sur une version plus récente.
A part ça et le fait que cela ne récupère pas l'entete des champs, cela semble être assez simple comme méthode.
cs_Benouille
Messages postés215Date d'inscriptionjeudi 24 octobre 2002StatutMembreDernière intervention 7 septembre 2007 12 janv. 2005 à 15:23
oula faut que je regarde ça.
c'est un truc générique le copy from recordset ?
ça peut être pas mal à utiliser si la gestion des droits s'avère insuffisante (ie si l'utilisateur n'a pas les droits sur la requete alors que l'applis les a).
je regarderais ça dans l'apres midi.
merci.
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 8 janv. 2005 à 09:35
Ok, ça fonctionne très bien, mais je viens de m'apercevoir que sous Access, j'avais déjà une fonction pour exporter une requête directement sous Excel via CopyFromRecordset :
Private Sub CopierRqDansXL(sFeuilleXL$, sRq$, oWkb As Object, oXL As Object)
Dim oSht As Object
Dim intLastCol%, intLastRows%, iCols%
Const conMAX_ROWS = 20000
Dim Rq As DAO.Recordset
On Error GoTo ErrCRqXL
Set Rq = CurrentDb.OpenRecordset(sRq, dbOpenSnapshot)
Set oSht = oWkb.Worksheets(sFeuilleXL)
With oSht
.Activate ' Activer la feuille XL
' Suppression du contenu précédent
intLastCol = .UsedRange.Columns.Count
intLastRows = .UsedRange.Rows.Count
.Range(oXL.Cells(1, 1), oXL.Cells(conMAX_ROWS, intLastCol)).ClearContents
' Recopier le nom des champs de la table ou rq
For iCols = 0 To Rq.Fields.Count - 1
.Cells(1, iCols + 1).Value = Rq.Fields(iCols).Name
Next iCols
' Recopier la table ou rq
.Range("A2").CopyFromRecordset Rq
End With
Fin:
On Error Resume Next ' Au cas où la Rq ne serait pas encore ouverte
Rq.Close
Set oSht = Nothing
Exit Sub
ErrCRqXL:
AfficherMsgErreur Err, "CopierRqDansXL"
Resume Fin
End Sub
cs_Benouille
Messages postés215Date d'inscriptionjeudi 24 octobre 2002StatutMembreDernière intervention 7 septembre 2007 5 janv. 2005 à 11:14
pour une listbox c'est pas du tout la bonne methode :)
recherche sur ce site, sur msdn ou sur pimpernet, tu devrais trouver assez facilement.
SR2
Messages postés46Date d'inscriptionsamedi 17 juillet 2004StatutMembreDernière intervention25 juillet 20061 4 janv. 2005 à 23:27
Ca a l'air super votre truc
mais comment on récupère les résultats dans une liste box par exemple
merci
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 13 déc. 2004 à 16:29
Oui mais attention, pendant qu'il y a une instance d'Excel qui reste plantée en RAM, cela risque d'empecher le fonctionnement normal d'Excel tant que ton appli est ouverte.
Dès que j'ai le temps, je teste ton soft.
cs_Benouille
Messages postés215Date d'inscriptionjeudi 24 octobre 2002StatutMembreDernière intervention 7 septembre 2007 13 déc. 2004 à 16:01
si! si! cela pose des soucis effectivement: tant que l'appli est lancée, excel considère qu'il a un "appelant" et l'instance reste active meme une fois fermée.
ceci dit une fois l'appli et excel fermés, l'instance est libérée.
c'est aussi pour ça que j'en ouvre pas un nouveau par défaut et que je regarde d'abord si une instance d'excel est pas déja lancée (cf le try catch)
par contre pour ce qui est de marcher, ça marche bien; moi j'ai fait le test avec 65 000 lignes, je t'invite a le faire aussi, tu me diras ce que t'en penses.
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 11 déc. 2004 à 11:07
Bien, je voulais justement un truc de ce genre, je vais voir si cela marche.
Dans le même genre, je rappele qu'ODBC permet de lire un fichier Excel quasi-instantanément, je ferais une démo bientot...
Au fait, tu n'as pas de problème avec Excel 9 en dotnet ?
Regarde ici :
XLDOTNET : QUITTER EXCEL SANS LAISSER D'INSTANCE EN RAM
www.vbfrance.com/code.aspx?id=27541
28 avril 2010 à 14:07
J'essaye avec une requete de 15 lignes environ et sa me fait une erreur de type, alors que si je suprime des caracteres il n'y a plus d'erreur ...
Quelqu'un a une idée pour executé des requetes plus longue ?
20 déc. 2007 à 22:45
cette source m'a été trés utile, mais j'aimerais pouvoir changer une image présente sur ma feuille excel par cette méthode.
Est ce possible ?
l'enregistreur de macro ne me fait rien sur les images ...
merci de m'aider si cela est possible
greg38bj
11 juin 2007 à 12:52
reste juste à trouver la chaine de connection vers ton dataset à mon avis.
en même temps je l'ai jamais fait (datatable vers excel direct) et si j'avais à le faire, je crois que je ferais pas comme ça de toutes façons.
je pense que tu dois avoir un moyen simple de le faire, essaie par exemple de mettre ta datatable dans la 1ère cellule. il se pourrait qu'excell s'aperçoive qu'il s'agit d'un tableau et te le dispatche tout seul.
Dans tous les cas il doit y avoir une méthode plus rapide, moins pénible et surtout moins vilaine que le remplissage cellule par cellule.
Benouille, quelques grammes de grenouille dans un monde de brute
7 juin 2007 à 17:29
je souhaite Exporter une DataTable vers Excel (cette DataTable est construite d'après des données de Dataset retravaillé)
Existe-t'il un moyen de ne pas passer par de la cellule à cellule ?
Le code ici doit se connecter à une base (voire base Access dans le cas de xtrusion)
Merci d'avance
6 mars 2007 à 20:52
16 févr. 2007 à 11:26
19 sept. 2006 à 15:59
ODBCDotNet : Extraire des requêtes ODBC dans un tableau de tableaux de String
www.vbfrance.com/code.aspx?ID=34701
Je vais mettre à jour cette source prochainement.
18 sept. 2006 à 15:15
18 sept. 2006 à 14:52
28 août 2006 à 15:11
Pour ma part je cherche à balancer le contenu d'un gros tableau en mémoire dans Excel. Problème de performance avec : MyXL.Worksheets(X).cells(Y,Z).value = "BLAH BLAH" qui rame à mort quand il y en a pour plusieurs milliers de lignes.
La méthode la plus rapide que j'ai trouvée est de générer d'exporter mon tableau en HTML, puis de l'importer dans un objet Excel (temps d'exécution passant de 3 minutes à 15 secondes par fichier). Question : y a t'il plus simple / plus rapide ?
Merci :-)
24 févr. 2006 à 15:49
24 févr. 2006 à 15:37
ça de mande de la configuration je crois pour les utiliser en distant
24 févr. 2006 à 11:56
dim xlapp as object
set xlapp=createobject("excel.application")
23 févr. 2006 à 15:05
j'arrive a créer un fichier texte ou xml mais pas excel...
il bloque à
xlapp= new Excel.application
23 févr. 2006 à 14:59
22 févr. 2006 à 18:12
kan je l'excéute (application web) il me met une erreur
<System.UnauthorizedAccessException: Accès refusé. >
pourtant j'ai donné tous les droits
15 févr. 2005 à 22:08
15 févr. 2005 à 11:13
Comment faire ou peut-on me l'envoyer?
3 févr. 2005 à 11:37
www.vbfrance.com/code.aspx?id=27541
3 févr. 2005 à 09:47
Jsé meme pa kommen vous avé été capable de faire un truc pareil ... ( et encore jme doute ke c pa ce kil y a de plus difficile a faire ... ms kd meme ! lol ) il me reste plus ka virer excel de la RAM automatikement pr eviter kil plante ...
MERCI surtout a BENOUILLE pr sa patience et ses connaissances ! ^^
++
1 févr. 2005 à 13:26
++
1 févr. 2005 à 11:06
ça veut dire que tu crées un fichier un excel par le code, et ce fichier excel vit ensuite sa vie tout seul, pouvant meme rafraichir ses données avec la base sans intervention de ton programme qui l'a construit.
ça veut dire aussi puisqu'il n'est pas lié a ton programme, qu'il ne le connait pas, la chaine de connection sera donc créée une fois pour toute.
(mais tu peux la modifier depuis ton classeur xls créé).
si c'est au moment de l'instalation (création du doc excel dans le rep de l'application qui peut être n'importe ou mais qui ne bougera jamais une fois posé) que tu veux déterminer le app.path alors la tu peux le faire.
pour ça faut lui passer une chaine string qui contienne le bon chemin. dans ta chaine tu lui passes en dur "application.startuppath", c'est pas malin: c'est la valeur chaine de application.startuppath qui est interressante pas son nom en lui meme.
autrement dit:
sConnection = "odbc ... " & app.path & " ....
ou la valeur de app.path est insérée au bon endroit.
attention: comme dit plus haut, la chaine de connection est ensuite figée dans excel.
ça me dérange pas de t'aider dans la mesure ou t'attends pas de moi que je resolve tes problemes ou que je te programme ton truc à ta place; dans la mesure ou tu reflechis et que tu cherches les solutions par toi meme avant de poser les questions.
bonne prog.
ouaip tu pourras pas m'aider en vb: je suis passé a vb.net ;)
mais c'est pas grave, tu pourras aider quelqu'un d'autre, c'est pas juste entre nous deux que ça se passe.
1 févr. 2005 à 09:08
Ca fonctionne a merveille !
Dernière question, promis apré je t'embete plus ! ;o)
Ma base de donnée doit pouvoir être deplacée, donc j'essaye de lui mettre un chemin relatif, et quelque soit ce que j'essaye ca marche pas ... Jvoudré simplement kelle soit définie par défaut dans le repertoire de l'executable .... Donc je fé :
(Connection:="ODBC;DSN=MS Access Database;DBQ=Application.StartupPath\biblio.mdb;DefaultDir=Application.StartupPath;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;", Destination:=listedocs.Range("A1"))
Ms il a pa l'air d'apprecier le Application.StartupPath ... J'essaye de le mettre entre "&" et tout ms il aime pa trop trop trop ca ! lol Alor ke ds ma chaine de connection a BDD ca fonctionne ...
J'ai essayé ca aussi ms sans succès :
DBQ=Application.StartupPath & " \ " & biblio.mdb;DefaultDir=Application.StartupPath
Si ta une idée merci, sinon, laisse tomber ;o) tu en a deja assez fé ! Merci pour tout! (jdiré bien a charge de revanche ms ... jriske pa de pouvoir t'aider en VB apparement ! :p ) LOL
31 janv. 2005 à 19:37
la chaine de connection doit pas être si lourdement vétue, elle doit se retrouver quasi à poil: en string.
moi j'aurais fait comme toi: enlevé les tableaux (array)
"ODBC;DSN=MS Access Database;DBQ=C:\Documents and Settings\Administrateur\Bureau\Projet 2005\Projet 2005\Biblio[FAL62]\bin\biblio.mdb;DefaultDir=C:\Documents and Settings\Administrateur\Bureau\Projet 2005\Projet 2005\Biblio[FAL62]\bin;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;",Destination:=Range("A1"))
idem plus bas
.CommandText = "SELECT Document.Titre, Document.Date, Document.Public, Document.Support, Document.Thème, Document.Service, Document.Auteur, Document.MaisondEdition, Document.NumRevue, Document.DatedePublication, Document.RevuecontenantlArticle, Document.Résumé, Document.Emplacement, Document.NombredExemplaires FROM Document ORDER BY Document.Titre"
s'il attends du string, il faut lui passer du string.
vbnouille, grenouille en string
31 janv. 2005 à 13:54
With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
"ODBC;DSN=MS Access Database;DBQ=C:\Documents and Settings\Administrateur\Bureau\Projet 2005\Projet 2005\Biblio[FAL62]\bin\biblio.mdb" _
), Array( _
";DefaultDir=C:\Documents and Settings\Administrateur\Bureau\Projet 2005\Projet 2005\Biblio[FAL62]\bin;DriverId=25;FIL=MS Access" _
), Array(";MaxBufferSize=2048;PageTimeout=5;")), Destination:=Range("A1"))
.CommandText = Array( _
"SELECT Document.Titre, Document.Date, Document.Public, Document.Support, Document.Thème, Document.Service, Document.Auteur, Document.MaisondEdition, Document.NumRevue, Document.DatedePublication, Docu" _
, _
"ment.RevuecontenantlArticle, Document.Résumé, Document.Emplacement, Document.NombredExemplaires" & Chr(13) & "" & Chr(10) & "FROM Document Document" & Chr(13) & "" & Chr(10) & "ORDER BY Document.Titre" _
)
.Name = "Lancer la requête à partir de MS Access Database"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With
Le soucis c kil me dit ke array est un type donc kil ne pe pa etre utiliser en tant qu'expression ... Et si je les vire les array, ca marche pa .... jcomprends pa ...
Ya kelke chose a faire ? ;o) toi t'en as pa ds ton code source des array .... moi jen ai partout ! lol
T'a pa une idée par hazard? :P
Merci davance !
28 janv. 2005 à 17:33
tu ouvres un nouvelle macro pour commencer l'enregistrement.
ensuite tu vas dans excel, données, données externes, nouvelle requete. la tu dois choisir une source de données, tu choisis MS Access DAtabase, tu pointes sur ton .mdb, et tu fais une requete bidon (select * from matable ou matable est le nom d'une table de ta base access). à la fin tu dois avoir les données de ta tables acces dans excel.
tu arrete ta macro et tu regardes dans le code de la macro la chaine de connection qu'il a utilisé, tu remplaces ma chaine de connection par la tienne et cela devrait fonctionner.
je suppose que tu devrais avoir une différence ici: ODBC;DRIVER=SQL Server; parceque tu ne vas pas passer par odbc mais oledb et pas prendre le driver prévu pour sql server mais celui pour access.
je n'ai pas access donc je ne peux pas tester pour toi, mais tu devrais t'en sortir en faisant les choses calmement et en lisant bien tout.
28 janv. 2005 à 13:54
With xsSoldesComptes5.QueryTables.Add(Connection:= _
"ODBC;DRIVER=SQL Server;SERVER=Connection;Integrated Security=SSPI;" & _
"APP=Microsoft® Query;DATABASE=biblio.mdb;Trusted_Connection=Yes" _
, Destination:=xsSoldesComptes5.Range("A1"))
.CommandText = "select * from Document" ' ou la requete select * from machin si vous n'avez pas de proc
Merci les gars ! ;o)
28 janv. 2005 à 13:50
Et kd tu me dis de remplacer le nom du serveur par mes noms a moi, je mets koi ? g koi a remplacer conkretement steplé?
Merci de votre aide ! elle mé precieuse ! :p
28 janv. 2005 à 01:16
si cela ne fonctionne pas , va dans excel, ouvre une nouvelle macro, connecte toi depuis excel à ta base access, recupère le code et remplace le ici.
ça n'est pas plus compliqué que ça.
-----------------
27 janv. 2005 à 16:55
Voici ma methode pr me connecter a ma base de données access :
======================================
Imports System.Data
Imports System.Data.OleDb
Imports System.Net
Public Class visudocs
Inherits System.Windows.Forms.Form
'declaration de la connection
Private Connection As New OleDb.OleDbConnection
'declaration du DataSet
Private DtSet As New DataSet
'declaration du dataAdapter
Private Adapbiblio As New OleDb.OleDbDataAdapter("select Titre, Date, Public, Support, Thème, Service, Auteur, MaisondEdition, DatedePublication, RevuecontenantlArticle, Emplacement, NombredExemplaires, Résumé from Document order by Titre", Connection)
Private Sub visudocs_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'on parametre la chaine de connection pour la base de donnée biblio.mdb
Connection.ConnectionString = "provider=microsoft.jet.oledb.4.0;" & _
"data source= " & Application.StartupPath & "" & "biblio.mdb;"
'rempli le dataset
Adapbiblio.Fill(DtSet, "Document")
'remplissage de la liste avec le dataset
Dim Matable As DataTable
Matable = DtSet.Tables("Document")
Grid_docs.DataSource = Matable
end sub
======================================
Commen faire pr appliker cette premiere source déposée par benouille a mon projet sivouplé?
Je suppose ke tout se passe ici :
**************************
With xsSoldesComptes5.QueryTables.Add(Connection:= _
"ODBC;DRIVER=SQL Server;SERVER=MonServeur;Integrated Security=SSPI;" & _
"APP=Microsoft® Query;DATABASE=MaBase;Trusted_Connection=Yes" _
, Destination:=xsSoldesComptes5.Range("A1"))
**************************
Mais commen faire?
C'est vraimen important les gars ! ;o)
Merci davance all !
12 janv. 2005 à 16:04
dans les autres cas ou je peux connecter excel à la base de données sans passer par vb, sachant en outre que cela permet une mise a jour ultérieure des données (une requete msquery pouvant être mise a jour), j'utiliserais msquery.
en plus en enlevant les options qui servent a rien, ça va un plus vite malgres tout (évite les entetes de colonnes); meme si je reconnais pour le coup que l'argument du gain de 4 secondes d'écriture de code peut être limite :)
a voir en perf aussi si c'est pareil, ou si c'est plus rapide.
En bref je garde les deux et je ferais selon le besoin ;)
merci pour ta réactivité et tes eclaircissements.
VBnouille
12 janv. 2005 à 15:47
www.vbfrance.com/code.aspx?ID=28744
En plus il est passé par ADODB, on n'est pas obligé de passer par Access, ca devrait donc marcher aussi en .Net
Je confirme que ca marche bien avec toutes les versions d'Access, je viens de livrer un logiciel avec à un client !
Par contre j'ai déjà rencontré un cas où ca ne marche plus sur un poste : on obtenait l'err n°430 (Requete ADO au lieu de DAO avec Excel 97 ???) et je n'ai jamais pu corriger cela (il faut reinstaller Excel dans ce cas je pense)
12 janv. 2005 à 15:38
--------------------------------------------------------------------------------
Posté par : PIERRERAVAUX
le 08/08/2003 12:27:41
Re : Exportation d'un recordset
Répondre à ce message - Imprimer ce message
--------------------------------------------------------------------------------
Bonjour,
J'ai un petit problème avec cette instruction Copyfromrecordset qui fonctionnait très bien avec une base ACCESS97 et qui ne fonctionne plus avec ACCESS2000
Est-ce à cause de cette library Microsoft Excel 9.0 que je n'ai pas sur mon poste.
Merci de votre aide
Cordialement
--------------------------------------------------------------------------------
en fait au dela de la version d'excel je suppose que le probleme vient plus de l'acces aux données. donc vérifie si ta fonction marche encore sur une version plus récente.
A part ça et le fait que cela ne récupère pas l'entete des champs, cela semble être assez simple comme méthode.
12 janv. 2005 à 15:23
c'est un truc générique le copy from recordset ?
ça peut être pas mal à utiliser si la gestion des droits s'avère insuffisante (ie si l'utilisateur n'a pas les droits sur la requete alors que l'applis les a).
je regarderais ça dans l'apres midi.
merci.
8 janv. 2005 à 09:35
Private Sub CopierRqDansXL(sFeuilleXL$, sRq$, oWkb As Object, oXL As Object)
Dim oSht As Object
Dim intLastCol%, intLastRows%, iCols%
Const conMAX_ROWS = 20000
Dim Rq As DAO.Recordset
On Error GoTo ErrCRqXL
Set Rq = CurrentDb.OpenRecordset(sRq, dbOpenSnapshot)
Set oSht = oWkb.Worksheets(sFeuilleXL)
With oSht
.Activate ' Activer la feuille XL
' Suppression du contenu précédent
intLastCol = .UsedRange.Columns.Count
intLastRows = .UsedRange.Rows.Count
.Range(oXL.Cells(1, 1), oXL.Cells(conMAX_ROWS, intLastCol)).ClearContents
' Recopier le nom des champs de la table ou rq
For iCols = 0 To Rq.Fields.Count - 1
.Cells(1, iCols + 1).Value = Rq.Fields(iCols).Name
Next iCols
' Recopier la table ou rq
.Range("A2").CopyFromRecordset Rq
End With
Fin:
On Error Resume Next ' Au cas où la Rq ne serait pas encore ouverte
Rq.Close
Set oSht = Nothing
Exit Sub
ErrCRqXL:
AfficherMsgErreur Err, "CopierRqDansXL"
Resume Fin
End Sub
5 janv. 2005 à 11:14
recherche sur ce site, sur msdn ou sur pimpernet, tu devrais trouver assez facilement.
4 janv. 2005 à 23:27
mais comment on récupère les résultats dans une liste box par exemple
merci
13 déc. 2004 à 16:29
Dès que j'ai le temps, je teste ton soft.
13 déc. 2004 à 16:01
ceci dit une fois l'appli et excel fermés, l'instance est libérée.
c'est aussi pour ça que j'en ouvre pas un nouveau par défaut et que je regarde d'abord si une instance d'excel est pas déja lancée (cf le try catch)
par contre pour ce qui est de marcher, ça marche bien; moi j'ai fait le test avec 65 000 lignes, je t'invite a le faire aussi, tu me diras ce que t'en penses.
11 déc. 2004 à 11:07
Dans le même genre, je rappele qu'ODBC permet de lire un fichier Excel quasi-instantanément, je ferais une démo bientot...
Au fait, tu n'as pas de problème avec Excel 9 en dotnet ?
Regarde ici :
XLDOTNET : QUITTER EXCEL SANS LAISSER D'INSTANCE EN RAM
www.vbfrance.com/code.aspx?id=27541