PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Pilotage Excel via Ole Automation
Pilotage Excel via Ole Automation
Débuté par Frank SACCO, 06 nov. 2015 09:23 - 8 réponses
Membre enregistré
17 messages
Popularité : +1 (1 vote)
Posté le 06 novembre 2015 - 09:23
Bonjour à tous,

Avec les commandes OLE vers Excel, depuis mon programme j'arrive facilement :
- à définir la valeur d'une cellule :
Excel>>Range("A1")>>Value = "Test 1"
- à définir une même valeur pour un ensemble de cellules :
Excel>>Range("A1:A10")>>Value = "Test 1"

(Excel est est un objet Automation dynamique)

Mais, je ne trouve pas comment définir en un seul coup différentes valeurs pour un ensemble de cellules.
Par exemple je possède un tableau avec
Tab[1] = "Test 1"
Tab[2] = "test 2"
je voudrai définir un ensemble de cellules avec une fonction du type :
Excel>>Range("A1:A2")>>Value = Tab
ou
Excel>>Range("A1:A2")>>Value = ensemble des valeurs formatées

Existe-t'il une solution qui me permettrait de transférer un ensemble de valeurs vers une plage de cellules ?
Ceci afin de diminuer le temps de traitement actuel qui se fait cellule par cellule.

Merci de votre aide.

Frank SACCO
Posté le 06 novembre 2015 - 14:27
Personnellement je passe souvent par une séquence de ce type :
- Ecriture dans un fichier Texte
- Ouverture de ce fichier Texte via Excel.
- Copier/coller ou Copier CollageSpécial de ce fichier vers mon fichier destination.
- Fermeture du fichier Texte.

J'imagine que je pourrais copier/coller directement via la fonction VersPressePapier(), sans passer par le fichier Texte
Membre enregistré
17 messages
Popularité : +1 (1 vote)
Posté le 06 novembre 2015 - 15:10
Bonjour,

Merci pour cette réponse, mais je ne peux pas procéder de cette façon, je place des données dans un document Excel déjà formaté, qui contient des formules, des macros ...
Je dois juste mettre à jour une zone particulière.

En tous cas, merci pour l'idée.

Frank
Posté le 06 novembre 2015 - 15:24
Bonjour Frank.

Moi j'utiliserais une boucle.

POUR i = 1 A 2
Excel>>Range("A"+i)>>Value = "Test "+i
FIN

Bonne journée

Michel
Membre enregistré
17 messages
Popularité : +1 (1 vote)
Posté le 06 novembre 2015 - 16:07
Bonjour Michel,

Oui, en gros, c'est ce que je fais actuellement, mais avec certains documents c'est très long.
C'est pour cette raison que je cherche un moyen d'envoyer en une seule opération tout le contenu d'une zone, ce qui devrait être normalement plus rapide.

Bonne fin de journée.

Frank
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 07 novembre 2015 - 01:18
hello,
on peut passer par un tableau de variants à deux dimensions.
Voici un exemple qui remplit la plage A1 à B5 (soit 10 cellules) dans une feuille excel en une seule fois :
// Déclaration des objets excel
objXLApp est un objet automation dynamique
MaFeuille est un objet automation dynamique
MaPlage est un objet automation dynamique
MonTableauAutomation est un tableau de 5 par 2 Variant
// Instance de Excel existante ?
SI ObjetActif("Excel.Application") <> Null ALORS
// Récupération de l'instance de Excel existante
objXLApp = ObjetActif("Excel.Application")
SINON
// Allocation de l'objet automation Excel
objXLApp = allouer un objet automation "Excel.Application"
FIN
SI objXLApp = Null ALORS
Erreur("Impossible de lancer Excel.")
RETOUR
FIN
objXLApp>>Visible = True
objXLApp>>workbooks>>Open("F:\temp\monclasseur.xlsx") // ouvre le classeur
MaFeuille = objXLApp>>Worksheets("Feuil1")
POUR i = 1 A 5
MonTableauAutomation[i,1]="Donnée_A_" + i
MonTableauAutomation[i,2]="Donnée_B_" + i
FIN
MaPlage = MaFeuille>>Range("A1:B5")
MaPlage>>Value = MonTableauAutomation


--
Ami calmant, J.P
Membre enregistré
17 messages
Popularité : +1 (1 vote)
Posté le 07 novembre 2015 - 11:21
Bonjour,

Merci pour cette solution, je teste au plus vite.
Bon weekend.

Frank
Membre enregistré
17 messages
Popularité : +1 (1 vote)
Posté le 09 novembre 2015 - 11:10
Bonjour,

Cette solution fonctionne bien, merci et bravo.

J'avais testé la même fonctionnalité, mais, mon tableau était à une seule dimension pour remplir une seule colonne :
Tab[1] = "Ligne1"
Tab[2] = "Ligne 2"

Ce code ne fonctionne pas, il faut faire :
Tab[1][1] = "Ligne1"
Tab[2][1] = "Ligne2"

Merci, j'ai trouvé la solution grâce à votre exemple.
Bonne journée.

Frank
Posté le 15 avril 2019 - 11:14
Monsieur, je cherche comment tracer un graphe en Excel à partir un tableau WinDev