[Résolu][Calc] Activer un fichier ouvert

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
gwered33
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 05 mars 2017 22:45

[Résolu][Calc] Activer un fichier ouvert

Message par gwered33 »

Bonjour
Je sais bien qu'il faut consulter le forum avant de poster. Croyez moi, j'ai beaucoup cherché, et pas seulement sur le forum, dans le Guide de programmation, dans l'ouvrage d'Andrew Pitonyak et ailleurs... Alors je me décide à poster.
J'ai fait une macro qui ouvre un fichier existant dans mon PC.
Je pensais qu'après la ligne oDoc1 = StarDesktop.CurrentComponent les instructions de la macro s'appliqueraient au classeur correspondant à la variable oDoc1 mais je n'arrive pas à entrer dans le fichier correspondant. Comment activer le classeur que la macro vient d'ouvrir ?
Pour poser le problème, j'ai imaginé une petite macro, la plus simple possible.
Je crée la macro dans un classeur « destination » (oDoc2 dans la macro)
la macro ouvre un autre classeur existant « source », (oDoc1 dans la macro)
je lui demande de peindre en vert la cellule B4 de ce classeur.

Le fichier « source » s'ouvre mais je n'arrive pas à l'activer (= y mettre le focus?) pour y intervenir !
La macro (code ci-dessous) peint bien en vert une cellule B4 mais pas celle du fichier « source ». C'est celle du classeur « destination » (dans lequel j'ai créé la macro) qui est colorée. Je reste dans le fichier « destination » !
  • Quelles instructions faut-il ajouter ou corriger pour intervenir dans le classeur « source » ?
    Comment revenir ensuite au fichier « destination » ?
Avec les réponses à ces deux questions j'espère finaliser une macro (créée facilement il y a plus de 15 ans dans Excel VBA) qui doit ouvrir successivement plusieurs classeurs, y copier une cellule contenant une formule et coller le résultat (la valeur) dans un tableau récapitulatif (dans le classeur initial).

Merci d'avance aux spécialistes d'OOo Basic qui voudront bien m'aider.

GML

Code : Tout sélectionner

Sub OuvreColoreCellule

dim oDoc1, oDoc2
Dim sUrl As String

oDesk = createUnoService("com.sun.star.frame.Desktop")
'Définit l'URL du fichier source et ouvre ce fichier
sUrl = "File:///C:/Users/gmaze/Desktop/Apprentissage Macros OOo/2018_0809_gml_source.ods"

rem get access to the document
Dim Args1()
oDoc1=oDesk.loadComponentFromURL(sUrl,"_blank",0,Args1())   
'le fichier "2018_0809_gml_source.ods" s'ouvre mais il n'est pas activé !
'__________________________________________________________________________________
'
'JE VEUX METTRE LE FOCUS SUR oDoc1, mon fichier "2018_0809_gml_source.ods"
'ThisComponent.CurrentController
'oDoc1.CurrentController.Frame.ContainerWindow.ToFront 'réponse de Piaf 25/09/2015
'oDoc1.CurrentController.Frame.ContainerWindow.setFocus 'réponse Alain de la Chaume 13/3/2009
oDoc1 = StarDesktop.CurrentComponent
'__________________________________________________________________________________
'A PARTIR DE LA, COPIE DU CODE ENREGISTRE A LA SOURIS
'-------------------------------------------------------------------------
oDoc1 = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem --------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$B$4"

dispatcher.executeDispatch(oDoc1, ".uno:GoToCell", "", 0, args2())
'_______________________________________________________________________

rem COLORE EN VERT LA CELLULE B4--------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "BackgroundColor"
args3(0).Value = 10079334

dispatcher.executeDispatch(oDoc1, ".uno:BackgroundColor", "", 0, args3())

end sub

Dernière modification par gwered33 le 01 sept. 2018 22:54, modifié 3 fois.
Apache OpenOffice 4.1.3
Windows 10
toucan
MOOdérateur
MOOdérateur
Messages : 182
Inscription : 22 févr. 2016 23:49

Re: Activer un fichier ouvert dans une macro

Message par toucan »

Bonjour et bienvenue,

Image

Cette section a des règles très précises que vous devez obligatoirement suivre pour obtenir de l'aide. C'est indiqué dans le cadre rouge en haut de la page.

Il est demandé aux auteurs de faire précéder le titre de leur question d'une balise adéquate. Ce balisage est extrêmement important car il permet d'avoir une base de connaissance optimum en cas de recherche. Avez-vous remarqué comment étaient les autres questions postées ?

Lisez ce fil pour savoir quelle balise utiliser : http://user.services.openoffice.org/fr/ ... html#27295

N'oubliez pas que le terme "Macro" ou "OpenOffice" ne doit pas être employé car il est implicite. Essayer de synthétiser au mieux ce que vous cherchez à faire.

Un titre accrocheur vous permettra d'une part d'être aidé plus rapidement et d'autre part, d'enrichir notre base de connaissances.

Nous l'avons fait pour vous cette fois-ci mais lors de votre prochaine question, nous vous remercions de le faire vous-même sous peine de voir votre sujet verrouillé.

Merci de votre collaboration.
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Calc] Activer un fichier ouvert dans une macro

Message par Piaf »

Bonsoir
Pas forcément tout compris entre le document Source et le document déclenchant la macro.
Tu peux tester

Code : Tout sélectionner

Sub Main
Dim oDoc as Object, oDoc1 As Object, Adresse As String
	oDoc = thisComponent
	Adresse = ConvertToURL("Adresse du document à ouvrir")
	oDoc1 = StarDesktop.loadComponentFromURL(Adresse, "_default", 0, Array())
	oDoc1.CurrentController.activeSheet.getCellRangeByName("B4").CellBackColor = RGB(0,128,0)
	fenetreoDoc = oDoc.CurrentController.Frame.ContainerWindow
	MsgBox("La fenêtre du document origine va reprendre le focus dans 3 secondes" & Chr(13) & "Cliquez sur OK pour déclencher le changement")
	Wait 3000
	fenetreoDoc.toFront
End Sub
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
gwered33
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 05 mars 2017 22:45

Re: [Calc] Activer un fichier ouvert

Message par gwered33 »

Merci Piaf,

Tout d'abord excusez moi pour l'absence de la balise [Calc]. J'ai lu avant de poster "inutile de mettre la balise [Basic]", alors je n'ai rien mis... Merci d'avoir posé à ma place la balise requise.

Mais si, Piaf, tu as tout compris. Le code que tu proposes réalise parfaitement ce que je demandais à ma macro "OuvreColoreCellule" : ça a marché du premier coup ! En plus il y a une boîte de dialogue qui va m'être utile pour me familiariser avec cet outil.
Ainsi il faut passer par ContainerWindow, j'ai lu ça deux fois sur le forum je ne l'aurais pas trouvé tout seul !

Cette histoire de peindre une cellule en vert était un prétexte pour avoir le code permettant d'appliquer les instructions suivantes au fichier que la macro vient d'ouvrir.
Dans la ligne

Code : Tout sélectionner

oDoc1.CurrentController.activeSheet.getCellRangeByName("B4").CellBackColor = RGB(0,128,0)
il me faudra remplacer CellBackColor = RGB(0,128,0) par une instruction qui se contente de sélectionner la cellule. Si tu veux bien me l'indiquer ça m'évitera tout risque d'erreur de syntaxe.
Je continuerai ensuite avec des lignes de code que j'ai déjà. (il y a un déplacement avec un GoDownEndOfData et un GoRight de 6 pas pour aboutir dans la colonne H à la cellule à copier qui contient une formule. J'utiliserai alors uno.Copy et le contenu de la cellule passera dans le presse-papier.
Enfin, revenu dans le fichier "destination" (le fichier dans lequel est créée la macro) grâce au code que tu m'as transmis je n'aurai plus qu'à coller les instructions correspondant au collage spécial "Nombre".
J'espère que ça se passera comme je viens de le décrire et que je ne serai pas obligé de vous appeler au secours.

Encore merci Piaf pour la rapidité et la qualité de la réponse.
Cordialement

G.M-L
Apache OpenOffice 4.1.3
Windows 10
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Calc] Activer un fichier ouvert

Message par Piaf »

Bonsoir
Comme d'habitude, pas forcément tout compris :lol:
Tu peux tester :

Code : Tout sélectionner

Sub Main
Dim oDoc as Object, oDoc1 As Object, Adresse As String
Dim maFeuille as Object, maZone as Object, maCellule as Object, fenetreoDoc as Object
Dim DerCell as Variant, y as Long, oFrame as object, oDispatch as object
Dim Args(0) as new com.sun.star.beans.PropertyValue
	oDoc = thisComponent
	Adresse = ConvertToURL("Adresse et nom du fichier")
	oDoc1 = StarDesktop.loadComponentFromURL(Adresse, "_default", 0, Array())
	maFeuille = oDoc1.CurrentController.activeSheet
	maZone = maFeuille.getCellRangeByName("B4:B1000")
	DerCell = maZone.queryEmptyCells.RangeAddresses
	y = DerCell(0).StartRow
	maCellule = maFeuille.getCellRangeByName("H" & y)
	oDoc1.CurrentController.select(maCellule)
	oFrame   = oDoc1.CurrentController.Frame
	oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")
	oDispatch.executeDispatch(oFrame, ".uno:Copy", "", 0, Array())		
	fenetreoDoc = oDoc.CurrentController.Frame.ContainerWindow
	fenetreoDoc.toFront
	Args(0).Name = "Flags"
	Args(0).Value = "V"
	maCellule = oDoc.Sheets(0).getCellRangeByName("C1")
	oDoc.CurrentController.Select(maCellule)
	oFrame   = oDoc.CurrentController.Frame	
	oDispatch.executeDispatch(oFrame, ".uno:InsertContents", "", 0, Args())	
End Sub
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
gwered33
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 05 mars 2017 22:45

Re: [Calc] Activer un fichier ouvert

Message par gwered33 »

Bonjour Piaf,

Tu parles en code et moi en langage vulgaire...
Super ce code ! Cela fonctionne. J'ai tout de suite vu apparaître (feuille 1 cellule C1 de oDoc) le solde du compte dont j'ai saisi l'adresse. Tu as fait tout le travail avec des commandes que, pour la plupart, je ne connaissais pas. A 81 ans j'apprends...
Reste un détail : au lieu de coller la valeur dans une cellule sélectionnée (C1 dans l'exemple), je voudrais faire le collage dans la cellule active. Peux tu m'indiquer la modification à apporter au code pour cela ?

Ensuite, c'est sans hésiter je poserai la balise [Résolu] devant le titre de mon sujet que tu as traité bien au delà de ma préoccupation initiale.

Encore merci
Cordialement

G.M-L
Apache OpenOffice 4.1.3
Windows 10
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Calc] Activer un fichier ouvert

Message par Piaf »

Re
Tu peux tester

Code : Tout sélectionner

Sub Main
Dim oDoc as Object, oDoc1 As Object, Adresse As String
Dim maFeuille as Object, maZone as Object, maCellule as Object, fenetreoDoc as Object
Dim DerCell as Variant, y as Long, oFrame as object, oDispatch as object, sel as Object
Dim Args(0) as new com.sun.star.beans.PropertyValue
	oDoc = thisComponent 'Adresse du fichier
	Adresse = ConvertToURL("Adresse et nom du fichier")
	oDoc1 = StarDesktop.loadComponentFromURL(Adresse, "_default", 0, Array())
	maFeuille = oDoc1.CurrentController.activeSheet
	maZone = maFeuille.getCellRangeByName("B4:B1000")
	DerCell = maZone.queryEmptyCells.RangeAddresses
	y = DerCell(0).StartRow
	maCellule = maFeuille.getCellRangeByName("H" & y)
	oDoc1.CurrentController.select(maCellule)
	oFrame   = oDoc1.CurrentController.Frame
	oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")
	oDispatch.executeDispatch(oFrame, ".uno:Copy", "", 0, Array())		
	fenetreoDoc = oDoc.CurrentController.Frame.ContainerWindow
	fenetreoDoc.toFront
	Args(0).Name = "Flags"
	Args(0).Value = "V"
	sel = oDoc.CurrentSelection
	If sel.supportsService("com.sun.star.table.Cell") Then
		maCellule = oDoc.Sheets(sel.CellAddress.Sheet).getCellByPosition(sel.CellAddress.Column,sel.CellAddress.Row)
		oDoc.CurrentController.Select(maCellule)
		oFrame = oDoc.CurrentController.Frame	
		oDispatch.executeDispatch(oFrame, ".uno:InsertContents", "", 0, Args())		
	End If	
End Sub
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
gwered33
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 05 mars 2017 22:45

Re: [Calc] Activer un fichier ouvert

Message par gwered33 »

Bonsoir Piaf,

Comme les deux précédents, le code que tu m'as envoyé pour coller la valeur dans la cellule active fonctionne parfaitement. J'ai terminé ma macro en réglant un dernier problème concernant la date. Avec la fonction AUJOURDHUI, j'obtenais une date volatile. J'ai mis la fonction dans la cellule voisine et j'ai fait un copier/collage spécial (Nombre, date). Peut-être qu'on peut faire la copie et le collage spécial dans la même cellule, peut-être qu'il y a une manip plus simple ? En tous cas ma version fonctionne !
Cette consultation du forum a dépassé largement ma question initiale. J'ai beaucoup appris.
Un grand merci et https://forum.openoffice.org/fr/forum/p ... =8&t=58618#
Cordialement
G.M-L

Surtout ne pas rater la balise de sortie ! J'envoie ça et je m'en occupe tout de suite...
Apache OpenOffice 4.1.3
Windows 10