Exporter vers excel [Résolu]

cs_brunaux 34 Messages postés jeudi 25 novembre 2004Date d'inscription 19 octobre 2006 Dernière intervention - 15 juin 2005 à 12:34 - Dernière réponse : Mike Gagnon 381 Messages postés vendredi 15 octobre 2004Date d'inscription 24 octobre 2013 Dernière intervention
- 20 juin 2005 à 14:49
bonjour à tous

voila ,j'ai 3 tables ,exemple : t18,s18,r18 .dans ces 3 bases diverses variables tel que :num_coupon,desc_coupon,mont_coupon,observations etc .toutes 3 ayant un champ commun :
num_unique
est-il possible d'apres ces 3 tables de creer un fichier excel ,exemple f18 qui contiendrais 3 onglets,chacun portant le nom des 3 tables précedentes ?
au final je voudrais a partir des 3 bases (t18,s18,r18) avoir un fichier excel f18 qui aura 3 onglets (t18,s18,r18)

Est-ce quelqu'un à une re
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Mike Gagnon 381 Messages postés vendredi 15 octobre 2004Date d'inscription 24 octobre 2013 Dernière intervention - 20 juin 2005 à 14:49
3
Merci
>>.Sheets(sheetnumero).Select
>>>.Columns(Transform(cColumn)+':'+Transform(cColumn)).IndentLevel = 0

c'est du visual foxpro ou du langage excel que l'on peut ecrire dans VFP ?

C'est du language VFP qui imite ce qu'Excel s'attend à recevoir.

Mike Gagnon

Merci Mike Gagnon 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 122 internautes ce mois-ci

Commenter la réponse de Mike Gagnon
Mike Gagnon 381 Messages postés vendredi 15 octobre 2004Date d'inscription 24 octobre 2013 Dernière intervention - 15 juin 2005 à 20:16
0
Merci
Quelque chose du genre.


CLOSE DATABASES all


oExcel = CREATEOBJECT('Excel.application')


oWorkbook = oExcel.Workbooks.ADD


USE t18 SHARED AGAIN IN 0


SELECT T18


copydata(1,"T18")


USE r18 SHARED AGAIN IN 0


SELECT R18


copydata(2,"R18")


USE s18 SHARED AGAIN IN 0


SELECT S18


copydata(3,"S18")


PROCEDURE copydata(sheetnumero,lcSheetName)


WITH oWorkbook


.Sheets(sheetnumero).SELECT


WITH .activesheet


.NAME = lcSheetname


nfieldno=AFIELDS(arrfielda,lcAlias)


FOR N=1 TO nfieldno


.Cells(1,N).VALUE=arrfielda(N,1)


ENDFOR


nrow=2


SELECT &lcAlias


SCAN


FOR N=1 TO nfieldno


cfield=lcAlias+'.'+arrfielda(N,1)


.Cells(nrow,N).VALUE=(&cfield)


ENDFOR


.Cells(nrow,1).SELECT


nrow=nrow+1


ENDSCAN


nValue = 65


FOR N=1 TO nfieldno


cColumn = CHR(nValue)


.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).EntireColumn.AutoFit


.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).SELECT


.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).HorizontalAlignment = xlCenter


.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).VerticalAlignment = xlBottom


.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).WrapText = .F.


.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).ORIENTATION = 0


.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).AddIndent = .F.


.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).IndentLevel = 0


.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).ShrinkToFit = .F.


.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).ReadingOrder = xlContext


.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).MergeCells = .F.


ENDFOR


.Cells.Select


ENDWITH


ENDWITH


oExcel.VISIBLE =.T.

Mike Gagnon
Commenter la réponse de Mike Gagnon
cs_brunaux 34 Messages postés jeudi 25 novembre 2004Date d'inscription 19 octobre 2006 Dernière intervention - 16 juin 2005 à 07:55
0
Merci
Merci Mike pour la réponse

mais désolé cela ne marche pas
j'ai oublier de préciser quelques petites choses :j'utilise VP6 (cela a peut-etre son importance ?) et suis utilisateur occasionnel donc il y a des choses de ton code que je ne comprends pas trop !

et aussi ,outre le fait de vouloir mettre les 3 tables t18,s18 et r18 dans un fichier excel f18 ayant 3 onglets portant le nom des 3 bases,je veux creer autant de fichiers
excel qu'il y a de num_unique different dans les bases:
je m'explique:
dans t18 je vais par exemple avoir les 3 premiers enregistrement ayant 1030 en num_unique (donc egalement en s18 1030 sur x enregis. et en r18 1030 sur x enregis.),ensuite 5 enregis. ayant 1031 (idem au-dessus pour s18 et r18), puis mettons 10 enregis. ayant 1032 (idem au-dessus pour s18 et r18), etc ....
au final je vais donc avoir un fichier excel f1030(avec les onglets t18 de 3 lignes,s18 sur x lignes,r18 sur x lignes),un autre f1031(idem au-dessus),un autre f1032, etc ....

donc en fait quand je lance le programme,cela bloque tout de suite sur :

nfieldno=AFIELDS(arrfielda,lcAlias)

message "variable 'lcalias' introuvable" ?

j'ai donc besoin de nouveau d'aide !!!
merci d'avance
Commenter la réponse de cs_brunaux
Mike Gagnon 381 Messages postés vendredi 15 octobre 2004Date d'inscription 24 octobre 2013 Dernière intervention - 16 juin 2005 à 11:08
0
Merci
Les choses se compliquent. Je m'excuse je connaisait pas ton niveau de comprehension de FoxPro. Mais pour ce qui est de la première erreur que tu obtient, on peut la corriger comme ceci.
oExcel = CREATEOBJECT('Excel.application')
oWorkbook = oExcel.Workbooks.ADD
PRIVATE lcAlias
USE t18 SHARED AGAIN IN 0
SELECT T18
lcAlias = ALIAS()
copydata(1,"T18")
USE r18 SHARED AGAIN IN 0
SELECT R18
lcAlias = ALIAS()
copydata(2,"R18")
USE s18 SHARED AGAIN IN 0
SELECT S18
lcAlias = ALIAS()
copydata(3,"S18")


PROCEDURE copydata(sheetnumero,lcSheetName)


WITH oWorkbook


.Sheets(sheetnumero).SELECT


WITH .activesheet


.NAME = lcSheetname
nfieldno=AFIELDS(arrfielda,lcAlias)
FOR N=1 TO nfieldno
.Cells(1,N).VALUE=arrfielda(N,1)
ENDFOR
nrow=2
SELECT &lcAlias
SCAN
FOR N=1 TO nfieldno
cfield=lcAlias+'.'+arrfielda(N,1)
.Cells(nrow,N).VALUE=(&cfield)
ENDFOR
.Cells(nrow,1).SELECT
nrow=nrow+1
ENDSCAN
nValue = 65
FOR N=1 TO nfieldno
cColumn = CHR(nValue)
.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).EntireColumn.AutoFit
.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).SELECT
.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).HorizontalAlignment = xlCenter
.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).VerticalAlignment = xlBottom
.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).WrapText = .F.
.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).ORIENTATION = 0
.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).AddIndent = .F.
.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).IndentLevel = 0
.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).ShrinkToFit = .F.
.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).ReadingOrder = xlContext
.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).MergeCells = .F.
ENDFOR
.Cells.Select
ENDWITH



Mike Gagnon
Commenter la réponse de Mike Gagnon
cs_brunaux 34 Messages postés jeudi 25 novembre 2004Date d'inscription 19 octobre 2006 Dernière intervention - 16 juin 2005 à 12:02
0
Merci
merci mike

petit probleme dans le programme :
message d'erreur :
variable XLCENTER introuvable
variable XLBOTTOM introuvable
variable XLCONTEXT introuvable

en appuyant tout le temps sur 'ignorer' au bout d'un moment on sors de la boucle
et on a bien un fichier excel ouvert avec les 3 onglets(t18,r18,s18) avec les donnes
donc a priori cela marche
peut-etre faut-il supprimer les lignes pour ces 3 variables?

mais mon autre souci est que je pensais que l'on pouvait donner tout de suite dans le programme un nom de fichier excel (exemple:"premier_fichier") qui s'enregistre dans le repertoire ou on a les données

en fait ce que voudrais reellement c'est en lancant le programme avoir au final
mettons 4 fichier excel : un fichier 1030.xls, puis 1031.xls,puis 1032.xls,puis 1033.xls
dans le 1030.xls j'aurais mettons 3 lignes en onglet t18,puisque dans t18 j'ai 3 lignes avec 1030 en num_unique, 3 lignes en onglet r18 puisque 3 enregis.dans r18 avec 1030 en num_unique,pareil pour l'onglet s18

puis dans le 1031.xls mettons 5 lignes (5 enregis. dans t18 avec 1031 en num_unique
etc.... comme au-dessus)

puis dans le 1032.xls mettons 10 lignes (idem comme au dessus)

etc....

est-ce-que tout cela est vraiment possible ???
j'espere ne pas etre trop brouillon dans mes explications !!

merci d'avance
Commenter la réponse de cs_brunaux
Mike Gagnon 381 Messages postés vendredi 15 octobre 2004Date d'inscription 24 octobre 2013 Dernière intervention - 16 juin 2005 à 12:20
0
Merci
Je sais ou tu veux arriver, mais je travaille la solution avec toi, en esperant que tu va pouvoir prendre le controle de la solution éventuellement. Mais pour ce qui est des constantes, j'ai oublié des définir au debut, ajoute ceci au début de la routine.

#DEFINE xlCenter -4108


#DEFINE xlBottom -4107


#DEFINE xlContext -5002

Je reviens avec le restant de la solution bientot (je dois quitter pour quelques instants). Mais techniquement la solution est faisable. Il s'agit d'utliser ddes curseurs SQL. Un qui contient les valeurs distinctes de ton num_unique, et en faisant un loop, on peut grouper le restant des données par numero unique, et une fois le curseur crée, on l'envoye à un nouvelle feuille excel.

Mike Gagnon
Commenter la réponse de Mike Gagnon
cs_brunaux 34 Messages postés jeudi 25 novembre 2004Date d'inscription 19 octobre 2006 Dernière intervention - 16 juin 2005 à 13:58
0
Merci
merci mike, cela marche avec les nouvelle lignes de codes pour les constantes (d'ailleurs je ne sais pas a quoi cela correspond !!!).


pour le reste je suis plutot perdu , je ne sais meme pas comment dans VFP on peut donner un nom de fichier excel lorque ce dernier est ouvert et créer en programmation


ni comment on le ferme et on l'enregistre dans un repertoire precis
j'avais vaguement penser pour le repertoire de faire un truc comme ca:
repertoire_travail = 'd:\etudes\comptages\'
CD (repertoire_travail)
mettre deja ces 2 lignes au debut du programme

je me disais aussi peut-etre decomposer en autant fichiers dbf que l'on a de num_unique different dans chacun des 3 bases
exemple pour t18
copier ds un fichier la 1ere valeur de num_unique ,ex:1030 (donc =t18_1030.dbf) avec copy to t18_1030.dbf for num_unique=1030
balayer le fichier puis des que la valeur suivante change recommencer
copy to t18_1031.dbf for num_unique=1031
etc... etc ... pour avoir au final exemple t18_1030.dbf à t18_1080.dbf (j'aurais aussi la meme chose pour r18 et s18 evidemment) et puis lancer ton programme en changeant manuellement les intitulés d'alias() ,plus enregistrer manuellement aussi le fichier excel ouvert (t18_1030.xls) ,fermer excel puis relancer le prg avec un nouvel intitule d'alias() ,etc etc jusqu'a t18_1080.xls , mais bon cela fait beaucoup,beaucoup de manipulations.
je compte donc beaucoup plus sur ton aide pour la suite que moi je ne pourrais d'aider en prenant le controle de la solution pour ce programme





j'attends donc tjrs encore ton aide !
merci
Commenter la réponse de cs_brunaux
Mike Gagnon 381 Messages postés vendredi 15 octobre 2004Date d'inscription 24 octobre 2013 Dernière intervention - 16 juin 2005 à 14:37
0
Merci
>>>merci mike, cela marche avec les nouvelle lignes de codes pour les constantes (d'ailleurs je ne sais pas a quoi cela correspond !!!).

ILes trois valeurs en question correspondent à des contantes qu'Excel s'attend pour formatter la colone (dans l'exemple ci-haut). Tu aurrai aussi pu mettre les valeurs correspondant à la place, mais cela n'est pas un bon style de programmation. Par exemple on pourrait changer le ligne qui suit avac la valeur.

.COLUMNS(TRANSFORM(cColumn)+':'+TRANSFORM(cColumn)).HorizontalAlignment = -4108

Mais pour revenir au probleme, comme j'ai expliqué, si on prend la table T8 qui contient je crois 3 valeurs différentes. Et on utilise ce qui suit.

SELECT num_unique from T8 group by num_unique into cursor premier

La on a un curseur qui contient juste le champs num_unique, et seulement un entrée pour chaque valeurs.

Ensuite tu reprend la table T8 pour récupérer les autres champs, basé sur la valeur unique dans le curseur premier. Donc
SELECT num_unique from T8 group by num_unique into cursor premier
SELECT premier
SCAN
lnNum = premier.num_unique
SELECT * from T8 where t8.num_unique - lnNUM into moncurseur
*** la tu envoye les données du curseur moncurseur vers un nouvelle feuille Excel avec la fonction postée plus haut

ENDSCAN

Donc pour reprendre le tout (Avec une table seulement - il faut refraire avec les autres)

#DEFINE xlCenter -4108
#DEFINE xlBottom -4107
#DEFINE xlContext -5002
oExcel = Createobject('Excel.application')
oWorkbook = oExcel.Workbooks.Add
Private lcAlias
Select num_unique From T8 Group By num_unique Into Cursor premier
Select premier
Scan
lnNum = premier.num_unique
Select * From T8 Where T8.num_unique - lnNum Into moncurseur
Select moncurseur
lcAlias= Alias()
copydata(1,Transform(lnNum))
Endscan
Procedure copydata(sheetnumero,lcSheetName)
With oWorkbook
.Sheets(sheetnumero).Select
With .activesheet
.Name = lcSheetName
nfieldno=Afields(arrfielda,lcAlias)
For N=1 To nfieldno
.Cells(1,N).Value=arrfielda(N,1)
Endfor
nrow=2
Select &lcAlias
Scan
For N=1 To nfieldno
cfield=lcAlias+'.'+arrfielda(N,1)
.Cells(nrow,N).Value=(&cfield)
Endfor
.Cells(nrow,1).Select
nrow=nrow+1
Endscan
nValue = 65
For N=1 To nfieldno
cColumn = Chr(nValue)
.Columns(Transform(cColumn)+':'+Transform(cColumn)).EntireColumn.AutoFit
.Columns(Transform(cColumn)+':'+Transform(cColumn)).Select
.Columns(Transform(cColumn)+':'+Transform(cColumn)).HorizontalAlignment = xlCenter
.Columns(Transform(cColumn)+':'+Transform(cColumn)).VerticalAlignment = xlBottom
.Columns(Transform(cColumn)+':'+Transform(cColumn)).WrapText = .F.
.Columns(Transform(cColumn)+':'+Transform(cColumn)).Orientation = 0
.Columns(Transform(cColumn)+':'+Transform(cColumn)).AddIndent = .F.
.Columns(Transform(cColumn)+':'+Transform(cColumn)).IndentLevel = 0
.Columns(Transform(cColumn)+':'+Transform(cColumn)).ShrinkToFit = .F.
.Columns(Transform(cColumn)+':'+Transform(cColumn)).ReadingOrder = xlContext
.Columns(Transform(cColumn)+':'+Transform(cColumn)).MergeCells = .F.
Endfor
.Cells.Select
Endwith
Endproc



Mike Gagnon
Commenter la réponse de Mike Gagnon
cs_brunaux 34 Messages postés jeudi 25 novembre 2004Date d'inscription 19 octobre 2006 Dernière intervention - 20 juin 2005 à 14:41
0
Merci
Merci Mike pour toute l'aide apportée, mais malheureusement j'toujours l'erreur une fois les données copies vers excel (avec l'aide de ton code), une fois qu'on enregistre le fichier excel ouvert quand on revient dans le formulaire ,si l'on veut de nouveau saisir des données dans les grilles qui appartiennent aux 3 tables,ca plante toujours toujours avec des messages style "les données sont déjà ouvertes dans d'autres zone de travail !"
j'ai donc laissé tomber et je fais un truc de débutant ! (on fait comme on peut !)
je copie chaque base (ex:t18_1030) avec un copy to monfichier(t18_1030) type xl5 ,la meme chose avec les 2 autres bases ,une fois les 3 copy faits ,avec un zap
je peux de nouveau resaisir des données dans mes grilles du formulaires.
Et apres pour excel quelqu'un fera une macro pour mettre les 3 fichiers excel (t18_1030, r18_1030 et s18_1030) ensemble avec les 3 onglets avec le nom des bases. c'est tiré par les chevaux mais bon ...
une derniere chose: les ligne des codes style :
.Sheets(sheetnumero).Select
.Columns(Transform(cColumn)+':'+Transform(cColumn)).IndentLevel = 0

c'est du visual foxpro ou du langage excel que l'on peut ecrire dans VFP ?

encore merci pour tout l'aide
Commenter la réponse de cs_brunaux

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.