VBXL : PROGRAMMATION EFFICACE D'EXCEL EN VBA, VB6 ET VB .NET

cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 - 9 nov. 2003 à 01:16
cs_Isabelle31 Messages postés 80 Date d'inscription mardi 20 juillet 2004 Statut Membre Dernière intervention 25 août 2015 - 30 mars 2012 à 11:53
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/17783-vbxl-programmation-efficace-d-excel-en-vba-vb6-et-vb-net

cs_Isabelle31 Messages postés 80 Date d'inscription mardi 20 juillet 2004 Statut Membre Dernière intervention 25 août 2015 1
30 mars 2012 à 11:53
Heuu et ca se fait comment? Je t'avouerais que je maitrise pas DotNet, et il y a longtemps que j'ai plus fait de VB6...
cs_Isabelle31 Messages postés 80 Date d'inscription mardi 20 juillet 2004 Statut Membre Dernière intervention 25 août 2015 1
30 mars 2012 à 11:52
J'ai réussi à faire fonctionner ton programme.
Par contre comment avec cette version, comment peut-on refaire la fonction de vérification du composant?
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
30 mars 2012 à 11:51
Tu pourrais faire juste une fonction d'export en Exe DotNet que tu lancerai depuis VB6, il faudrait juste lui passer les infos. pour construire le classeur.
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
30 mars 2012 à 11:49
J'ai vu tes messages dans le forum : je pense que cela ne marchera pas avec OWC, car la fonction OWC qui permet l'export sous Excel requiert... Excel ! Par contre tu peux générer des fichiers csv facilement.
cs_Isabelle31 Messages postés 80 Date d'inscription mardi 20 juillet 2004 Statut Membre Dernière intervention 25 août 2015 1
30 mars 2012 à 11:49
Le problème c'est que pour le moment je ne dois pas passer en DotNet. Il me faut trouver une solution en attendant de migrer toute l'application en DotNet.
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
30 mars 2012 à 11:45
Hum, il y a mieux à faire à mon avis : passer en DotNet et utiliser les lirairies NPOI ou ExcelLibrary, mais ces librairies ont aussi des limitations.
cs_Isabelle31 Messages postés 80 Date d'inscription mardi 20 juillet 2004 Statut Membre Dernière intervention 25 août 2015 1
30 mars 2012 à 11:23
Merci. Je vais regarder.
Par contre si cela ne te dérange pas trop, je veux bien que tu m'envoi le résultat par mail.
A ton avis, j'utilise owc car excel ne sera pas installé sur le serveur ou doit se trouver mon application et je dois générer des fichier excel. Pour toi c'est une bonne solution?
Merci d'avance.
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
30 mars 2012 à 11:16
Bonjour, j'ai réussi à le faire fonctionner avec OWC11, mais ce n'est pas simple : il faut d'abord supprimer dans le fichier VBXL.vbp via le bloc note, la ligne de référence OWC, puis ajouter le composant dans la barre d'outil, puis remplacer l'ancien oXL OWC9 dans l'interface de la feuille principale via le Designer, puis mettre en commentaire quelques lignes qui ne passent pas (év. double-clic) et la fonction de vérification du composant (resté en OWC9). Je peux t'envoyer le résultat par mail.
cs_Isabelle31 Messages postés 80 Date d'inscription mardi 20 juillet 2004 Statut Membre Dernière intervention 25 août 2015 1
30 mars 2012 à 10:45
Bonjour Patrice,

J'ai voulu tester ton code VB6 avec owc11, mais je n'arrive pas à le compiler.
Ton code est-il compatible?

Merci d'avance pour ta réponse.
Isa
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
23 juin 2010 à 09:26
Petite correction (la plage était incorrecte à partir de la colonne 52) :

Public Function sConvNumEnLettres$(ByVal iCol%)

Dim iValA% = Asc("A") ' 65
If iCol <= 26 Then
sConvNumEnLettres = Chr(iValA + iCol - 1)
Else ' Corrigé le 23/06/2010
Dim iMult26% = (iCol - 1) \ 26
Dim iReste% = (iCol - 1) Mod 26
sConvNumEnLettres = Chr(iValA + iMult26 - 1) & Chr(iValA + iReste)
End If

End Function
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
20 juin 2009 à 09:18
Petite précision sur le bug qui prend aléatoirement 1 seconde : en fait cela se produit aussi sur des fonctions comme ParseText, et seulement s'il n'y a qu'une seule ligne, à partir de 2 lignes cela ne se produit plus :
.ActiveSheet.Range(sPlage).ParseText(sbValeurs.ToString, vbTab)
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
13 mai 2009 à 08:30
Note : en OWC11 la fonction ClearContents() prend aléatoirement 1 seconde (au lieu de qq millisec.) : on peut la remplacer ainsi :
.ActiveSheet.Range(sPlage).Cells.Value = ""
au lieu de :
.ActiveSheet.Range(sPlage).ClearContents() ' Bug
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
12 mai 2009 à 09:56
Note : pour les graphiques de type ChartChartTypeEnum.chChartTypeColumnStacked (1) en OWC 10 et 11, il faut appliquer le type au graphique et non plus à chaque série (comme cela fonctionnait en OWC9), et cela fonctionne aussi en OWC9.
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
23 août 2008 à 12:41
Nouvelle version 1.03 : compatible Vista ! Oubliez ma remarque précédente, OWC 9 et 10 ne fonctionnent pas avec Vista, il faut passer à OWC 11.
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
12 févr. 2008 à 12:45
Pour Windows Vista, il faut simplement recompiler les sources depuis un poste de développement sous Vista, car dans ce cas, une mise à jour de Visual Studio spécifique pour Vista est proposée et doit être installée : elle permet de produire des exécutables compatibles Vista (et rétro-compatibles XP bien sûr). Sinon je crois qu'il n'est pas possible de produire des applications compatibles Vista depuis un poste XP, si ces applications contiennent des contrôles ActiveX comme c'est le cas ici (en tout cas en DotNet2 cela pose problème, mais en DotNet1, les anciennes applications, elles, fonctionnent !).
Ne pas oublier aussi qu'il faut être administrateur pour pouvoir enregistrer des contrôles ActiveX (exécuter en tant qu'Administrateur), et que pour désenregistrer un ActiveX, il faut maintenant le faire depuis le chemin où est enregistré le contrôle (sinon on obtiendra des faux messages d'erreur ou incohérent ou même vide !).
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
23 janv. 2007 à 12:48
Dans la doc j'ai signalé :

> Le changement de la taille de la police de caractère provoque l'adaptation automatique de la hauteur des lignes (pas toujours, il y a parfois des bugs en OWC9 et 10 sur quelques lignes), mais pas de la largeur des colonnes ;

Ce n'est pas un bug, c'est une fonctionnalité d'Excel ! Il faut remettre les lignes en "Ajustement automatique" dans Excel, dans le menu Format : Ligne
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
21 janv. 2007 à 11:44
Voici une mise à jour pour la version DotNet 1 & 2 !
(note : l'export Word peut prendre quelques minutes, testez avec pas trop de lignes)
EPS32HAY Messages postés 100 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 1 février 2009
26 oct. 2005 à 13:39
Salut Patrice99,

Je tiens à te remercier pour ton code, je pense que je vais enfin réussir à faire mon appli.
Je tiens aussi à remercier les autres participants à cette discution. Toutes les infos ici sont de qualité et je vous en remercie

Bonne prog à tous.
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
11 nov. 2004 à 10:59
Merci Patrice ...En fait j'ai trouvé.
Plus quelques fonctions d'Excel sur les données,
Par exemple, stocker des enregistrements sur
une feuille et faire des extractions sur une autre ...

Encore merci et bonne journée.

Afyn
Navedac
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
11 nov. 2004 à 09:54
Si ta feuille s'appelle feuil1, alors ton sql doit etre Select * from feuil1$
La seule chose que tu dois vérifier c'est que la premiere ligne du fichier Excel contienne les entetes de colonne (et bien sur les 2 chemins d'accès dans le fichier ODBC). Sinon, il ne reste plus qu'a analyser les messages d'erreur, voici une fonction :

Public Sub AfficherErreursADO(oConnexion As Object)

If oConnexion Is Nothing Then Exit Sub

Dim sMsg$, errDB As Object 'ADODB.Error
For Each errDB In oConnexion.Errors
sMsg = sMsg & "Erreur ADO : " & errDB.Description & vbLf
sMsg = sMsg & "Numéro : " & errDB.Number & " (" & _
Hex$(errDB.Number) & "), Détail : " & errDB.SQLState & vbLf
MsgBox sMsg, vbCritical
Next

End Sub
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
10 nov. 2004 à 17:20
Salut Patrice ...
Je sais que je vais paraitre idiot ... mais bon ...
J'y arrive pas a charger une Liste dans un fichier Excel à partir du driver ODBC ...
J'ai créé une liste Prénom et nom dans Excel ...
J'essaye d'ouvrir avec MSQuery et j'ai le message
Cette source de données ne contient aucune table visible !

Quesque j'ai loupé ?

Merci d'avance

Afyn
Navedac
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
10 nov. 2004 à 16:09
Il y a peut être mieux à faire pour charger une feuille XL : ouvrir une connexion directement sur la feuille XL via ODBC (le nom de la table est le nom de la feuille XL avec $ après), cela sera sans doute beaucoup plus rapide. Voici comment utiliser ODBC :
www.vbfrance.com/code.aspx?ID=17847
et voici un exemple de fichier ODBC pour Excel :

[ODBC]
DRIVER=Microsoft Excel Driver (*.xls)
UID=admin
UserCommitSync=Yes
Threads=3
SafeTransactions=0
ReadOnly=1
PageTimeout=5
MaxScanRows=8
MaxBufferSize=2048
FIL=excel 8.0
DriverId=790
DefaultDir=C:\ImportXL
DBQ=C:\ImportXL\MonFichierXL.xls
Ayoros12 Messages postés 7 Date d'inscription mercredi 24 septembre 2003 Statut Membre Dernière intervention 21 juin 2004
9 nov. 2004 à 17:26
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
9 nov. 2004 à 17:00
-> Ayoros
Si tu peux nous poster un petit exemple de ta solution, ca m'interresse également.

Merci d'avance

Afyn
Navedac
Ayoros12 Messages postés 7 Date d'inscription mercredi 24 septembre 2003 Statut Membre Dernière intervention 21 juin 2004
9 nov. 2004 à 09:51
Merci. J'ai essayé depuis un fichier HTML crée manuellement, mais il met trois plombes à charger ce fichier (8Mo en Xls, 26Mo en HTM...).
J'ai trouvé plus rapide, et suis maintenant à 2s seulement pour la même opération : j'affecte à une donnée Variant le résultat de Range(...).resize
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
9 nov. 2004 à 09:40
C'est facile ! via l'automation, pilote Excel pour sauver en html, puis recharge le fichier html !
Ayoros12 Messages postés 7 Date d'inscription mercredi 24 septembre 2003 Statut Membre Dernière intervention 21 juin 2004
8 nov. 2004 à 23:27
Très bon code.
Ce controle me desespère hélas de n'importer les données que depuis un fichier HTM.
Sais-tu comment importer rapidement les données depuis un fichier xls ?
J'utilise l'object Excel et Cell ou Range, mais je mets 20s pour lister les valeurs d'une colonne pour 9000 enregistrements. C'est loooonng.
J'ai tenté d'utiliser l'advancedfilter mais j'ai une erreur de syntaxe dont je ne sors pas par manque de documentation.
Cdlt
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
17 oct. 2004 à 08:38
Version .Net : plus besoin d'OWC !!! :
www.codeproject.com/vb/net/xmlsscp.asp

Il y a même le code complet du tableur compatible Excel !

Et pour la version VB6, on peut recréer un composant com en .Net !
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
4 avril 2004 à 09:39
Nouveau : ADO en liaison tardive, version en VB .Net !
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
3 déc. 2003 à 08:58
Je n'ai pas testé, mais pourquoi ne pas imprimer toute la feuille VB ? Il faut chercher comment imprimer une feuille contenant un controle ActiveX en général. Une chose est sûr : dans un état Access, la feuille s'imprimera certainement.
KAKANOU Messages postés 1 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 2 décembre 2003
2 déc. 2003 à 18:13
Ce code m'a débloqué de beaucoup de situations, mais la seule difficulté que j'ai en ce moment c'est comment imprimer etant sur VB l'affichage qui se presente?
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
9 nov. 2003 à 18:26
Normalement, tu peux acceder a chaques cellules du Spreadsheet, donc tu peux sauvegarder ...
Tu faire copier coller aussi dans exel !!! et sauvegarder.

Pour votre info on peut charger des Fichiers Csv trés rapidement avec Owc ...

A+

Afyn
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
9 nov. 2003 à 01:22
#ERRATUM#

Rectification ....

J'ai passé le code au peigne fin, et je doit dire que
c'est impressionnant ! malheureusement il n'y a aucun
moyen de sauvegarder le spreedsheat.

@+
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
9 nov. 2003 à 01:16
Tu peut créer le meme effet avec une flexgrid, msgrid ou bien
encore une simple listview !

de plus la rapidité est relative compte tenu du fait que les
1 000 enregistrements ne sont pas chargé en memoire
mais seulement les enregistrements visible a l'ecran sont
effectivement dans le cache. Le reste ne s'affiche que lorsque
l'on fait defiller les données...

Tu peut faire le test sur une db de 100 000 Rec ou bien de 5 Rec
le resultat sera le meme. Cela dit c'est un jolie exemple de combiné VB/Office !

Quand au voyage de Chihiro... c'est un pure chef d'oeuvre ;-)

@+
Rejoignez-nous