PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV (précédentes versions) → MàJ fichier xlsx
MàJ fichier xlsx
Débuté par Jean-Loup CHAUMET, 13 fév. 2018 23:55 - 10 réponses
Membre enregistré
5 messages
Posté le 13 février 2018 - 23:55
Bonsoir ;
J'ai une fonction qui permet de mettre à jour un fichier xls. Mais mon client utilise maintenant des fichiers xlsx. Je n'ai pas réussi à modifier ma fonction pour mettre à jour le fichier avec la nouvelle extension. J'ai utilisé la version Windev 21.
Merci d'avance pour votre aide.
J-L. C.
Membre enregistré
2 569 messages
Popularité : +222 (260 votes)
Posté le 14 février 2018 - 08:56
Bonjour,

Impossible de t'aider sans le bout de code incriminé

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Posté le 15 février 2018 - 14:06
Bonjour, Philippe ;
Voici le code (mais peut-être est-il un peu long) ; dans "NomXLS =...", j'ai essayé de mettre xlsx au lieu de xls. Ca semblait fonctionner, mais, dans les cellules, les valeurs contiennent des nombres à plusieurs dizaines de chiffres.

Tab_Articles est un tableau de 100 entiers
DateXLS est une Date
RetourSaisie est un entier
NoJour est un entier
Repertoire est une chaîne = "C:\ARCHIVE GM-HDM\HDM\RC "
NomXLS est une chaîne
DocXLS est un xlsDocument
Anc_Client est un entier = 0
I est un entier
NoCol est un entier = 2
Valeur est un numérique (7,2)
xl est un objet OLE dynamique = ObjetActif("Excel.Application")
ID_Param est une chaîne

SI OuiNon(0,"Le document Excel est-il bien fermé ?") = Faux ALORS RETOUR

DateXLS = DateSys()
RetourSaisie = Saisie("Date des BL à transférer ?", DateXLS)
SI RetourSaisie = 0 ALORS RETOUR

ID_Param = "TR." + Droite(DateVersChaîne(DateXLS),2) + Milieu(DateVersChaîne(DateXLS),4,2) + Gauche(DateVersChaîne(DateXLS),2)
HLitRecherchePremier(PARAMETRES,CODE,ID_Param)
SI HTrouve(PARAMETRES) ALORS
FIN
Repertoire = Repertoire + DateXLS..Année + "\"
NoJour = DateVersJour(DateXLS)
NomXLS = "CUMUL S" + NuméroDeSemaine(DateXLS) + ".xls"

DocXLS = xlsOuvre(Repertoire + NomXLS,xlsEcriture)

Tr_Excel..Visible = Vrai
Multitâche()

I = 0
HExécuteRequête(REQ_Articles)
HLitPremier(REQ_Articles)
TANTQUE PAS HEnDehors(REQ_Articles)
I ++
SI I > 100 ALORS
Info("Attention ; le maximum de 100 articles est atteint ; tout ne sera pas transféré.")
SORTIR
FIN
Tab_Articles[I] = REQ_Articles.IDARTICLES
HLitSuivant(REQ_Articles)
FIN

REQ_BLXLS.DateBL = DateXLS
HExécuteRequête(REQ_BLXLS)
HLitPremier(REQ_BLXLS)
TANTQUE PAS HEnDehors(REQ_BLXLS)
SI xlsFeuilleEnCours(DocXLS, 15+NoJour) = Faux ALORS
Info("La feuille des quantités correspondant à cette date n'existe pas.")
Tr_Excel..Visible = Faux
RETOUR
FIN
SI REQ_BLXLS.IDCLIENTS <> Anc_Client ALORS
SI NoCol < 254 ALORS NoCol ++
DocXLS.Ligne[3].Cellule [NoCol] = REQ_BLXLS.NOM
Anc_Client = REQ_BLXLS.IDCLIENTS
FIN

POUR I = 1 A 100
SI REQ_BLXLS.IDARTICLES = Tab_Articles[I] ALORS
Valeur = REQ_BLXLS.QTE
SI REQ_BLXLS.AVOIR = Vrai ALORS
SI DocXLS.Ligne[3+I].Cellule[NoCol] = "" ALORS DocXLS.Ligne[3+I].Cellule[NoCol] = 0
DocXLS.ligne[3+I].Cellule[NoCol] = DocXLS.Ligne[3+I].Cellule[NoCol] - Valeur
SINON
DocXLS.ligne[3+I].Cellule[NoCol] = DocXLS.Ligne[3+I].Cellule[NoCol] + Valeur
FIN
SI xlsFeuilleEnCours(DocXLS, 21+NoJour) = Faux ALORS
Info("La feuille des montants correspondant à cette date n'existe pas.")
Tr_Excel..Visible = Faux
RETOUR
FIN
DocXLS.Ligne[3].Cellule[NoCol] = REQ_BLXLS.NOM
Valeur = REQ_BLXLS.QTE * REQ_BLXLS.PRIX
SI REQ_BLXLS.AVOIR = Vrai ALORS
SI DocXLS.Ligne[3+I].Cellule[NoCol] = "" ALORS DocXLS.Ligne[3+I].Cellule[NoCol] = 0
DocXLS.Ligne[3+I].Cellule[NoCol] = DocXLS.Ligne[3+I].Cellule[NoCol] - Valeur
SINON
DocXLS.Ligne[3+I].Cellule[NoCol] = DocXLS.Ligne[3+I].Cellule[NoCol] + Valeur
FIN
SORTIR
FIN
FIN
HLitSuivant(REQ_BLXLS)
FIN

//Sauve et ferme la feuille Excel modifiée
xlsSauve(DocXLS)
xlsFerme(DocXLS)
//
// On réouvre le fichier par Automation (Excel doit être installé)
//
SI xl<>Null ALORS
xl>>Quit()
xl=allouer un objet OLE "Excel.Application"
FIN
SI xl=Null ALORS xl=allouer un objet OLE "Excel.Application"

xl>>Visible=OLEFaux // On n'a pas besoin d'ouvrir Excel
//ouvre la feuille Excel
xl>>Workbooks>>Open(Repertoire + NomXLS,OLEIgnore,OLEFaux)
//déclenche le recalcul de toutes les formules
xl>>Application>>CalculateFull()
// Sauve, ferme et libère
xl>>ActiveWorkBook>>Save()
xl>>ActiveWorkBook >>Close(Faux)
xl>>Quit()
libérer xl

Merci par avance pour ton aide.
Jean-Loup
Posté le 15 février 2018 - 14:10
Bonjour, Philippe ;
Voici le code, un peu long... Dans "NomXLS = ...", j'ai remplacé ".xls" par ".xlsx" ; le résultat est que les cellules sont remplies par des chaînes de plusieurs de dizaines de chiffres...

Tab_Articles est un tableau de 100 entiers
DateXLS est une Date
RetourSaisie est un entier
NoJour est un entier
Repertoire est une chaîne = "C:\ARCHIVE GM-HDM\HDM\RC "
NomXLS est une chaîne
DocXLS est un xlsDocument
Anc_Client est un entier = 0
I est un entier
NoCol est un entier = 2
Valeur est un numérique (7,2)
xl est un objet OLE dynamique = ObjetActif("Excel.Application")
ID_Param est une chaîne

QUAND EXCEPTION
Info("Un problème est survenu lors de l'ouverture du fichier Excel",Repertoire + NomXLS,"Transfert non effectué.",errInfo)
Tr_Excel..Visible = False
RETOUR
FIN

SI OuiNon(0,"Le document Excel est-il bien fermé ?") = Faux ALORS RETOUR

DateXLS = DateSys()
RetourSaisie = Saisie("Date des BL à transférer ?", DateXLS)
SI RetourSaisie = 0 ALORS RETOUR

ID_Param = "TR." + Droite(DateVersChaîne(DateXLS),2) + Milieu(DateVersChaîne(DateXLS),4,2) + Gauche(DateVersChaîne(DateXLS),2)
HLitRecherchePremier(PARAMETRES,CODE,ID_Param)
SI HTrouve(PARAMETRES) ALORS
SI OuiNon("Des BL de cette date ont déjà été transférés " + PARAMETRES.VALEUR + " fois dans Excel.", "Confirmez-vous votre demande ?") = Non ALORS
RETOUR
FIN
FIN
Repertoire = Repertoire + DateXLS..Année + "\"
NoJour = DateVersJour(DateXLS)
NomXLS = "CUMUL S" + NuméroDeSemaine(DateXLS) + ".xls"

DocXLS = xlsOuvre(Repertoire + NomXLS,xlsEcriture)

SI ErreurDétectée = Vrai ALORS
Info(ErreurInfo(errComplet))
RETOUR
FIN

Tr_Excel..Visible = Vrai
Multitâche()

I = 0
HExécuteRequête(REQ_Articles)
HLitPremier(REQ_Articles)
TANTQUE PAS HEnDehors(REQ_Articles)
I ++
SI I > 100 ALORS
Info("Attention ; le maximum de 100 articles est atteint ; tout ne sera pas transféré.")
SORTIR
FIN
Tab_Articles[I] = REQ_Articles.IDARTICLES
HLitSuivant(REQ_Articles)
FIN

REQ_BLXLS.DateBL = DateXLS
HExécuteRequête(REQ_BLXLS)
HLitPremier(REQ_BLXLS)
TANTQUE PAS HEnDehors(REQ_BLXLS)
SI xlsFeuilleEnCours(DocXLS, 15+NoJour) = Faux ALORS
Info("La feuille des quantités correspondant à cette date n'existe pas.")
Tr_Excel..Visible = Faux
RETOUR
FIN
SI REQ_BLXLS.IDCLIENTS <> Anc_Client ALORS
SI NoCol < 254 ALORS NoCol ++
DocXLS.Ligne[3].Cellule [NoCol] = REQ_BLXLS.NOM
Anc_Client = REQ_BLXLS.IDCLIENTS
FIN

POUR I = 1 A 100
SI REQ_BLXLS.IDARTICLES = Tab_Articles[I] ALORS
Valeur = REQ_BLXLS.QTE
SI REQ_BLXLS.AVOIR = Vrai ALORS
SI DocXLS.Ligne[3+I].Cellule[NoCol] = "" ALORS DocXLS.Ligne[3+I].Cellule[NoCol] = 0
DocXLS.ligne[3+I].Cellule[NoCol] = DocXLS.Ligne[3+I].Cellule[NoCol] - Valeur
SINON
DocXLS.ligne[3+I].Cellule[NoCol] = DocXLS.Ligne[3+I].Cellule[NoCol] + Valeur
FIN
SI xlsFeuilleEnCours(DocXLS, 21+NoJour) = Faux ALORS
Info("La feuille des montants correspondant à cette date n'existe pas.")
Tr_Excel..Visible = Faux
RETOUR
FIN
DocXLS.Ligne[3].Cellule[NoCol] = REQ_BLXLS.NOM
Valeur = REQ_BLXLS.QTE * REQ_BLXLS.PRIX
SI REQ_BLXLS.AVOIR = Vrai ALORS
SI DocXLS.Ligne[3+I].Cellule[NoCol] = "" ALORS DocXLS.Ligne[3+I].Cellule[NoCol] = 0
DocXLS.Ligne[3+I].Cellule[NoCol] = DocXLS.Ligne[3+I].Cellule[NoCol] - Valeur
SINON
DocXLS.Ligne[3+I].Cellule[NoCol] = DocXLS.Ligne[3+I].Cellule[NoCol] + Valeur
FIN
SORTIR
FIN
FIN
HLitSuivant(REQ_BLXLS)
FIN

//Sauve et ferme la feuille Excel modifiée
xlsSauve(DocXLS)
xlsFerme(DocXLS)
//
// On réouvre le fichier par Automation (Excel doit être installé)
//
SI xl<>Null ALORS
xl>>Quit()
xl=allouer un objet OLE "Excel.Application"
FIN
SI xl=Null ALORS xl=allouer un objet OLE "Excel.Application"

xl>>Visible=OLEFaux // On n'a pas besoin d'ouvrir Excel
//ouvre la feuille Excel
xl>>Workbooks>>Open(Repertoire + NomXLS,OLEIgnore,OLEFaux)
//déclenche le recalcul de toutes les formules
xl>>Application>>CalculateFull()
// Sauve, ferme et libère
xl>>ActiveWorkBook>>Save()
xl>>ActiveWorkBook >>Close(Faux)
xl>>Quit()
libérer xl
Membre enregistré
5 messages
Posté le 15 février 2018 - 14:13
Bonjour, Philippe ;

Voici mon code, un peu long... Dans "NomXLS = ...", j'ai remplacé ".xls" par ".xlsx" ; du coup, les cellules sont remplies par des chaînes de plusieurs dizaines de chiffres.

Tab_Articles est un tableau de 100 entiers
DateXLS est une Date
RetourSaisie est un entier
NoJour est un entier
Repertoire est une chaîne = "C:\ARCHIVE GM-HDM\HDM\RC "
NomXLS est une chaîne
DocXLS est un xlsDocument
Anc_Client est un entier = 0
I est un entier
NoCol est un entier = 2
Valeur est un numérique (7,2)
xl est un objet OLE dynamique = ObjetActif("Excel.Application")
ID_Param est une chaîne

QUAND EXCEPTION
Info("Un problème est survenu lors de l'ouverture du fichier Excel",Repertoire + NomXLS,"Transfert non effectué.",errInfo)
Tr_Excel..Visible = False
RETOUR
FIN

SI OuiNon(0,"Le document Excel est-il bien fermé ?") = Faux ALORS RETOUR

DateXLS = DateSys()
RetourSaisie = Saisie("Date des BL à transférer ?", DateXLS)
SI RetourSaisie = 0 ALORS RETOUR

ID_Param = "TR." + Droite(DateVersChaîne(DateXLS),2) + Milieu(DateVersChaîne(DateXLS),4,2) + Gauche(DateVersChaîne(DateXLS),2)
HLitRecherchePremier(PARAMETRES,CODE,ID_Param)
SI HTrouve(PARAMETRES) ALORS
SI OuiNon("Des BL de cette date ont déjà été transférés " + PARAMETRES.VALEUR + " fois dans Excel.", "Confirmez-vous votre demande ?") = Non ALORS
RETOUR
FIN
FIN
Repertoire = Repertoire + DateXLS..Année + "\"
NoJour = DateVersJour(DateXLS)
NomXLS = "CUMUL S" + NuméroDeSemaine(DateXLS) + ".xls"

DocXLS = xlsOuvre(Repertoire + NomXLS,xlsEcriture)

SI ErreurDétectée = Vrai ALORS
Info(ErreurInfo(errComplet))
RETOUR
FIN

Tr_Excel..Visible = Vrai
Multitâche()

I = 0
HExécuteRequête(REQ_Articles)
HLitPremier(REQ_Articles)
TANTQUE PAS HEnDehors(REQ_Articles)
I ++
SI I > 100 ALORS
Info("Attention ; le maximum de 100 articles est atteint ; tout ne sera pas transféré.")
SORTIR
FIN
Tab_Articles[I] = REQ_Articles.IDARTICLES
HLitSuivant(REQ_Articles)
FIN

REQ_BLXLS.DateBL = DateXLS
HExécuteRequête(REQ_BLXLS)
HLitPremier(REQ_BLXLS)
TANTQUE PAS HEnDehors(REQ_BLXLS)
SI xlsFeuilleEnCours(DocXLS, 15+NoJour) = Faux ALORS
Info("La feuille des quantités correspondant à cette date n'existe pas.")
Tr_Excel..Visible = Faux
RETOUR
FIN
SI REQ_BLXLS.IDCLIENTS <> Anc_Client ALORS
SI NoCol < 254 ALORS NoCol ++
DocXLS.Ligne[3].Cellule [NoCol] = REQ_BLXLS.NOM
Anc_Client = REQ_BLXLS.IDCLIENTS
FIN

POUR I = 1 A 100
SI REQ_BLXLS.IDARTICLES = Tab_Articles[I] ALORS
Valeur = REQ_BLXLS.QTE
SI REQ_BLXLS.AVOIR = Vrai ALORS
SI DocXLS.Ligne[3+I].Cellule[NoCol] = "" ALORS DocXLS.Ligne[3+I].Cellule[NoCol] = 0
DocXLS.ligne[3+I].Cellule[NoCol] = DocXLS.Ligne[3+I].Cellule[NoCol] - Valeur
SINON
DocXLS.ligne[3+I].Cellule[NoCol] = DocXLS.Ligne[3+I].Cellule[NoCol] + Valeur
FIN
SI xlsFeuilleEnCours(DocXLS, 21+NoJour) = Faux ALORS
Info("La feuille des montants correspondant à cette date n'existe pas.")
Tr_Excel..Visible = Faux
RETOUR
FIN
DocXLS.Ligne[3].Cellule[NoCol] = REQ_BLXLS.NOM
Valeur = REQ_BLXLS.QTE * REQ_BLXLS.PRIX
SI REQ_BLXLS.AVOIR = Vrai ALORS
SI DocXLS.Ligne[3+I].Cellule[NoCol] = "" ALORS DocXLS.Ligne[3+I].Cellule[NoCol] = 0
DocXLS.Ligne[3+I].Cellule[NoCol] = DocXLS.Ligne[3+I].Cellule[NoCol] - Valeur
SINON
DocXLS.Ligne[3+I].Cellule[NoCol] = DocXLS.Ligne[3+I].Cellule[NoCol] + Valeur
FIN
SORTIR
FIN
FIN
HLitSuivant(REQ_BLXLS)
FIN

//Sauve et ferme la feuille Excel modifiée
xlsSauve(DocXLS)
xlsFerme(DocXLS)
//
// On réouvre le fichier par Automation (Excel doit être installé)
//
SI xl<>Null ALORS
xl>>Quit()
xl=allouer un objet OLE "Excel.Application"
FIN
SI xl=Null ALORS xl=allouer un objet OLE "Excel.Application"

xl>>Visible=OLEFaux // On n'a pas besoin d'ouvrir Excel
//ouvre la feuille Excel
xl>>Workbooks>>Open(Repertoire + NomXLS,OLEIgnore,OLEFaux)
//déclenche le recalcul de toutes les formules
xl>>Application>>CalculateFull()
// Sauve, ferme et libère
xl>>ActiveWorkBook>>Save()
xl>>ActiveWorkBook >>Close(Faux)
xl>>Quit()
libérer xl

Merci par avance pour ton aide.
Jean-Loup
Membre enregistré
2 569 messages
Popularité : +222 (260 votes)
Posté le 16 février 2018 - 09:05
Il semble que la conversion xls en xlsx par Windev perde une partie des formatages, j'ai bien peur que le formatage de la cellule en fasse partie.

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Membre enregistré
41 messages
Popularité : +7 (7 votes)
Posté le 16 février 2018 - 12:57
hello,

je suggère d'utiliser la méthode saveas() plutôt que save, ça te permet de spécifier le format de sortie :

xl>>ActiveWorkBook>>Saveas(Repertoire + NomXLS,51)




aqui toutes les valeurs possibles https://msdn.microsoft.com/fr-fr/vba/excel-vba/articles/xlfileformat-enumeration-excel et la méthode :
https://msdn.microsoft.com/fr-fr/vba/excel-vba/articles/workbook-saveas-method-excel
Membre enregistré
5 messages
Posté le 19 février 2018 - 13:47
Bonjour, Philippe ;
Merci pour ta réponse, bien qu'elle ne m'arrange pas trop :(
Jean-Loup
Membre enregistré
5 messages
Posté le 19 février 2018 - 14:10
Bonjour, Fred ;
Dans la mesure où le fichier excel est une fichier déjà existant que je mets juste à jour, n'est-ce pas plutôt au niveau de la définition du nom du fichier et de son ouverture et de sa fermeture que le problème se pose ?
Membre enregistré
41 messages
Popularité : +7 (7 votes)
Posté le 19 février 2018 - 22:09
Bonjour Jean-Loup,

A vue de nez, c'est difficile à dire, on ne sait pas ce que les fonctions windev comme xlsouvre encapsule comme traitement vba, moi personnellement , j'utilise la classe Cexcel fourni avec un exemple windev (pilotage excel) que je modifie en fonction de mes besoins, dans ton cas , je pense que soit tu codes tout avec un objet d'automation comme tu le fais en partie comme ça tu peux déboguer pas à pas , soit tu utilises la méthode saveas et supprime éventuellement les vieux fichiers xls avec fsupprime.
tu peux aussi m'envoyer le fichier xls vide qui pose problème...
Membre enregistré
5 messages
Posté le 01 mars 2018 - 15:06
Bonjour, Fred ;
Désolé de ne pas t'avoir répondu, plus tôt ; j'ai été occupé par d'autres sujets.
J'ai mis en commentaires toute cette partie :
xl>>Visible=OLEFaux // On n'a pas besoin d'ouvrir Excel
//ouvre la feuille Excel
xl>>Workbooks>>Open(Repertoire + NomXLS,OLEIgnore,OLEFaux)
//déclenche le recalcul de toutes les formules
xl>>Application>>CalculateFull()
// Sauve, ferme et libère
xl>>ActiveWorkBook>>Save()
xl>>ActiveWorkBook >>Close(Faux)
xl>>Quit()
libérer xl

Le résultat est le même.
Voici une copie d'écran de ce que l'on obtient :




Entourée en rouge, la case sur laquelle on a cliqué, avec la chaîne de chiffre obtenue dans la fonction.
Malheureusement, la comptable ne souhaite pas que je t'envoie le fichier Excel.
Je ne sais pas si j'ai été très clair, mais le fichier Excel, "autrefois", était un fichier .xls ; le problème est apparu du fait que le service comptable qui l'utilise a modifié le document pour qu'il soit en .xlsx. Donc, le fsupprime, de ce que je comprends, n'a pas lieu d'être ; je ne modifie pas un document .xls que je veux sauvegarder en .xlsx, mais je modifie un document qui est déjà en .xlsx.