|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
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 |
| |
| |
| | | |
|
| | |
| |
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. |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|