[Résolu][Calc] récupérer contenu presse papier dans variable

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 !
papa_georges
Membre OOrganisé
Membre OOrganisé
Messages : 54
Inscription : 28 juin 2009 04:24

[Résolu][Calc] récupérer contenu presse papier dans variable

Message par papa_georges »

bonjour
j'ai pas mal cherché, mais pas trouvé, dans ce forum comment faire pour récupérer le contenu du presse papier dans une variable (on trouve surtout l'inverse)
mon but est le suivant :
1) sélectionner un ensemble de cellule
2) les copier dans le presse papier
3) mettre le contenu du presse papier dans une variable (la variable texte de mon script) pour l'intégere dans le texte d'un message qu'il me restera à envoyer manuellement
voici la macro qui fonctionne mais qui m'oblige à coller manuellement le presse papier dans le message quand la fenêtre du message est ouvert
cordialement

Code : Tout sélectionner

' courriel avec les infos d'inscription d'un musicien
Sub Mail_Infos_Un_Musicien 
	Dim oShell As Object, CelluleActive As Object, Titre as object, Cellule as object
	dim i as integer
	dim Texte as string, Texte1 as string, Texte2 as string, Colonne as string, dest as string, Sujet as string, Signature as string
	CelluleActive = ThisComponent.getCurrentSelection
	Feuille = ThisComponent.getCurrentController().getActiveSheet()
	Cette_Ligne = CelluleActive.CellAddress.Row + 1
	Ligne = Cette_Ligne ' je récupère la ligne du tableur sur laquelle je suis
	' ligne 3 : les titres des colonnes	
	oShell = createUnoService("com.sun.star.system.SystemShellExecute") 
	Cellule = Feuille.getCellRangeByName("F" & Ligne)
	Dest = Cellule.getString
	Sujet =  "Les informations de votre inscription à l'Empb29"
	' appel macro pour copier les lignes (ligne de titre 3 + celle du musicien sélectionnée) dans le presse papier
	call CopierCollerInfosMusicien Ligne
	Texte = "Bonjour" & "%0D%0A" & "%0D%0A" & "Veuillez trouver ci-joint les informations vous concernant." & "%0D%0A" & "%0D%0A" &  "Merci de nous signaler par réponse à ce courriel une erreur ou un oubli." & "%0D%0A"
'	Signature = Inputbox ("Votre signature de message" ,"Courriel aux musiciens")
	Signature = "Le secrétariat de l'école de musique"
	'%0D%0A permet d'insérer un saut de ligne dans le corps du message. exemple "Bonjour,%0D%0AJe vous confirme"
	oShell.Execute("mailto:" & Dest & "?subject=" & Sujet & "&Body=" & Texte & "%0D%0A" & Signature & "%0D%0A" , "", 0)
End Sub


' copier coller la ligne 3 puis celle du musicien sélectionné (Ligne) et coller dans onglet Divers à la ligne 17 puis sélectionner le tout pour l'avoir dans le presse papier
sub CopierCollerInfosMusicien (Ligne)
	rem ------------
	rem define variables
	dim document   as object
	dim dispatcher as object
	rem ------------
	rem get access to the document
	document   = ThisComponent.CurrentController.Frame
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

	rem --------------------------- copier coller la ligne 3 des titres de colonne
	dim args1(0) as new com.sun.star.beans.PropertyValue
	args1(0).Name = "ToPoint"
	args1(0).Value = "$A$3:$AM$3"
	dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
	rem ------------
	dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
	rem ------------
	dim args3(0) as new com.sun.star.beans.PropertyValue
	args3(0).Name = "Nr"
	args3(0).Value = 7
	dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args3())
	rem ------------
	dim args4(0) as new com.sun.star.beans.PropertyValue
	args4(0).Name = "ToPoint"
	args4(0).Value = "$A$17"
	dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args4())
	rem ------------
	dim args5(5) as new com.sun.star.beans.PropertyValue
	args5(0).Name = "Flags"
	args5(0).Value = "SVDFN"
	args5(1).Name = "FormulaCommand"
	args5(1).Value = 0
	args5(2).Name = "SkipEmptyCells"
	args5(2).Value = false
	args5(3).Name = "Transpose"
	args5(3).Value = true
	args5(4).Name = "AsLink"
	args5(4).Value = false
	args5(5).Name = "MoveMode"
	args5(5).Value = 4
	dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args5())
	
	rem  --------------------------- copier coller la ligne sélectionnée
	dim args6(0) as new com.sun.star.beans.PropertyValue
	args6(0).Name = "Nr"
	args6(0).Value = 2
	dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args6())
	rem ------------
	dim args7(0) as new com.sun.star.beans.PropertyValue
	args7(0).Name = "ToPoint"
	args7(0).Value = "$A$" & Ligne
	dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args7())
	rem -------------
	dim args8(0) as new com.sun.star.beans.PropertyValue
	args8(0).Name = "ToPoint"
	args8(0).Value = "$A$" & Ligne & ":$AM$" & Ligne
	dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args8())
	rem ------------
	dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
	rem -----------
	dim args10(0) as new com.sun.star.beans.PropertyValue
	args10(0).Name = "Nr"
	args10(0).Value = 7
	dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args10())
	rem ------------
	dim args11(0) as new com.sun.star.beans.PropertyValue
	args11(0).Name = "ToPoint"
	args11(0).Value = "$B$17"
	dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args11())
	rem -----------
	dim args12(5) as new com.sun.star.beans.PropertyValue
	args12(0).Name = "Flags"
	args12(0).Value = "A"
	args12(1).Name = "FormulaCommand"
	args12(1).Value = 0
	args12(2).Name = "SkipEmptyCells"
	args12(2).Value = false
	args12(3).Name = "Transpose"
	args12(3).Value = true
	args12(4).Name = "AsLink"
	args12(4).Value = false
	args12(5).Name = "MoveMode"
	args12(5).Value = 4
	dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args12())
	
	rem -------------------------------- copier le tout dans presse papiers
	dim args13(0) as new com.sun.star.beans.PropertyValue
	args13(0).Name = "ToPoint"
	args13(0).Value = "$A$17:$B$55"
	dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args13())
	rem ------------
	dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
	
	rem ------------------------ retour feuille musiciens
	args3(0).Name = "Nr"
	args3(0).Value = 2
	dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args3())

end sub
OpenOffice 3.4.1 sous Windows 7
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25143
Inscription : 03 mars 2006 08:45
Localisation : 127.0.0.1
Contact :

Re: [Calc] récupérer contenu presse papier dans variable

Message par Dude »

Salut,

Je ne vois pas l'intérêt de passer par le presse-purée pour ce genre d'opération.

Il suffit de récupérer le contenu de la cellule et de la mettre dans ta variable.

L'exemple donnée est un parmi tant d'autres.
papa_georges
Membre OOrganisé
Membre OOrganisé
Messages : 54
Inscription : 28 juin 2009 04:24

Re: [Calc] récupérer contenu presse papier dans variable

Message par papa_georges »

bonjour Dude
merci pour ce conseil mais comme la sélection que je passe au presse-purée, comme tu dis, est composée de plusieurs cellules, je pensais que cela n'était pas possible ; mais maintenant je me dis qu'une cellule ou une rangée de cellules , cela doit être pareil !
par contre, une variable string ne va peut-être pas convenir pour récupérer le contenu de la sélection : ok pour 1 cellule, mais peut-être pas pour une plage de cellules
bon, faut que je cogite la-dessus
cordialement
OpenOffice 3.4.1 sous Windows 7
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 19:07
Localisation : Guyane

Re: [Calc] récupérer contenu presse papier dans variable

Message par Piaf »

Bonjour
Une approche différente pour recopier une zone de cellules d'une feuille à une autre et récupérer le texte affiché dans les cellules de la zone.
A+
Pièces jointes
CopieZone.ods
(29.28 Kio) Téléchargé 151 fois
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
papa_georges
Membre OOrganisé
Membre OOrganisé
Messages : 54
Inscription : 28 juin 2009 04:24

Re: [Calc] récupérer contenu presse papier dans variable

Message par papa_georges »

Piaf a écrit :Bonjour
Une approche différente pour recopier une zone de cellules d'une feuille à une autre et récupérer le texte affiché dans les cellules de la zone.
A+
bonjour
certes intéressant et efficace mais le résultat est une suite contiguë des contenus de toutes les cellules (une chaine de caractères) alors que le copier-coller a l'avantage de garder le découpage en cellules
merci quand même
OpenOffice 3.4.1 sous Windows 7
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 19:07
Localisation : Guyane

Re: [Calc] récupérer contenu presse papier dans variable

Message par Piaf »

Bonjour
Tu peux régler la mise en forme de txtmsg par exemple :

Code : Tout sélectionner

Function LireContenuCellule(maFeuille as Object, maZone as Object)
Dim controleur As Object
Dim listeCell As Object, selectionCell As Object
Dim uneCellule As Object, enumCellules As Object
Dim txtmsg as String, intx as Integer
	controleur = ThisComponent.CurrentController
	selectionCell = maZone.queryContentCells(com.sun.star.sheet.CellFlags.STRING)
	enumCellules = selectionCell.Cells
	listeCell = enumCellules.createEnumeration
	intx = 1
	Do While listeCell.hasMoreElements
		uneCellule = listeCell.nextElement
		If intx mod 2 = 0 then
			txtmsg = txtmsg & uneCellule.String & chr(13)
		Else
			txtmsg = txtmsg & uneCellule.String  & " : "  
		End If
		intx = intx + 1
	Loop
	LireContenuCellule = txtmsg
End Function
txtmsg.png
txtmsg.png (11.25 Kio) Consulté 3138 fois
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
Messages : 2668
Inscription : 30 avr. 2009 06:54
Localisation : CATALUNYA
Contact :

Re: [Calc] récupérer contenu presse papier dans variable

Message par Churay »

Bonjour

Bien que le code de Piaf soit nickel, pour la copie d'un bloc de cellules, je vous fais part d'une autre approche Pys_Inside que j'ai retrouvée en relisant mes classiques ;)

Code : Tout sélectionner

Sub CopierZone2()
Dim o, oSheet As Object, oRange As Object, oDoc As Object
	' Pys_Inside 
	oDoc = thisComponent
	
	oRange = oDoc.Sheets(0).getCellRangeByName("A2:C6")
	oDoc.CurrentController.select(oRange)
	o = oDoc.CurrentController.getTransferable()
	
	oRange = oDoc.Sheets(1).getCellRangeByName("F1")
	oDoc.CurrentController.select(oRange)
	oDoc.CurrentController.insertTransferable(o)
End Sub
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25143
Inscription : 03 mars 2006 08:45
Localisation : 127.0.0.1
Contact :

Re: [Calc] récupérer contenu presse papier dans variable

Message par Dude »

papa_georges a écrit :alors que le copier-coller a l'avantage de garder le découpage en cellules
Là encore, y-a t-il un intérêt puisqu'au final c'est un courriel que tu envoies.
Tu ne sais pas avec quel logiciel il sera reçu et lu.
Un tableau est uniquement supporté avec le format HTML.
Or, le destinataire peut très bien refuser ce format pour s'éviter des virus.

On boucle donc sur le même problème de ta procédure d'envoi avec mailto.
papa_georges
Membre OOrganisé
Membre OOrganisé
Messages : 54
Inscription : 28 juin 2009 04:24

Re: [Calc] récupérer contenu presse papier dans variable

Message par papa_georges »

bonjour

merci à chacun pour ces pistes ou solutions ; je vais prendre le temps de réfléchir pour revoir totalement ce problème et sans doute m'orienter vers une solution radicalement différente (lecture des cellules les unes après les autres et construction du contenu du message au fur et à mesure, certainement sans mise en forme html)

cordialement
OpenOffice 3.4.1 sous Windows 7
Verrouillé