Macro pour copier-coller un cadre texte.
Bonjour à tous & à toutes,
Je suis nouveau sur ce site & grand débutant en basic.
J’ai sous la main LibreOffice Writer version 6.0.7.3, aussi je viens d’écrire une petite macro qui devrait me permettre de sélectionner un cadre (TextFrame) par son index, d’en modifier des paramètres de le copier & le coller où se trouve le curseur (à mon avis, c’est ici que ce trouve le problème), pour enfin de rendre au cadre premier ses paramètres d’origines.
La voici :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| sub Cadre
dim document as object
dim dispatcher as object
dim oFrame as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
Rem Définir la fonction d'appel du cadre par son index.
oFrame = ThisComponent.textFrames.getbyIndex(0)
Rem Appeler le cadre par son index & le modifier.
With oFrame
Rem Le rendre imprimable.
.setPropertyValue("Print", True)
Rem Retirer la protection du contenu.
.Text.ContentProtected = False
Rem Changer le nom du cadre.
.Name = "Nouveau nom"
Rem Changer le texte contenu dans le cadre.
.setString( "Nouveau texte" )
Rem Protéger le contenu.
.Text.ContentProtected = True
Rem Terminer les modifications
End With
Rem Sélectionner le cadre.
ThisComponent.CurrentController.select(oFrame)
Rem Copier le cadre.
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
Rem Coller le cadre, ça ne fonctionne pas du tout !!!
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
Rem Sélectionner le cadre d'origine & lui rendre ses paramètres.
oFrame = ThisComponent.textFrames.getbyIndex(0)
With oFrame
.setPropertyValue("Print", False)
.Text.ContentProtected = False
.Name = ""
.setString( "Vide" )
.Text.ContentProtected = True
End With
End sub |
Ayant fini de m’arracher les cheveux, faute de combattants, sur un simple copier-coller, je viens à vous humble & glabre.
Et c’est en remerciant par avance tous ceux qui auront la bonté de se pencher sur ce problème, dont le ridicule assassine mon amour propre, que je vous salut.
Édit :
Je viens de progresser un peu, donc je vous en fais part, le copier-coller est résolu mais je n'arrive pas sélectionner le cadre copié...
Voici la nouvelle macro :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| sub Cadre
dim doc as object, oDisp as object, oDoc as object, oCont as object, oCurs as object, oSelect as object
dim oFrame as object
oDoc = ThisComponent
oCont = oDoc.CurrentController
doc = oCont.Frame
oDisp = createUnoService("com.sun.star.frame.DispatchHelper")
oCurs = oDoc.currentSelection()'Enregistrer la position du curseur.
oFrame = oDoc.textFrames.getbyIndex(0)'Choisir un cadre de texte par son index.
oCont.select(oFrame)'Sélectionner un cadre de texte par son index.
oDisp.executeDispatch(doc, ".uno:Copy", "", 0, Array())'Le Copier.
oDisp.executeDispatch(doc, ".uno:Escape", "", 0, Array())'Échapper à un grand malheur ou autre chose mais quoi ?
oCont.select(oCurs)'Revenir à la position initiale du curseur.
oDisp.executeDispatch(doc, ".uno:Paste", "", 0, Array())'Coller le cadre copier.
oSelect = oCont.getCurrentSelection()'Cela devrait permettre de garder la sélection courante,
'à savoir le cadre, mais non...
With oSelect
.setPropertyValue("Print", True)
.Text.ContentProtected = False
.Name = "Nouveau nom."
.setString("Nouveau texte.")
.Text.ContentProtected = True
End With
oCont.select(oCurs)'Désélectionne le cadre...
End sub |
Fred.
Macro pour copier-coller un cadre texte
Bonjour,
Pas sur d'avoir tout compris. Dans le code modifié ont peut en fin de macro, sélectionné le dernier cadre inséré.
Cordialement
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| sub Cadre
dim doc as object, oDisp as object, oDoc as object, oCont as object, oCurs as object, oSelect as object
dim oFrame as object
oDoc = ThisComponent
oCont = oDoc.CurrentController
doc = oCont.Frame
oDisp = createUnoService("com.sun.star.frame.DispatchHelper")
oCurs = oDoc.currentSelection()'Enregistrer la position du curseur.
oFrame = oDoc.textFrames.getbyIndex(0)'Choisir un cadre de texte par son index.
oCont.select(oFrame)'Sélectionner un cadre de texte par son index.
oDisp.executeDispatch(doc, ".uno:Copy", "", 0, Array())'Le Copier.
oDisp.executeDispatch(doc, ".uno:Escape", "", 0, Array())'Échapper à un grand malheur ou autre chose mais quoi ?
oCont.select(oCurs)'Revenir à la position initiale du curseur.
oDisp.executeDispatch(doc, ".uno:Paste", "", 0, Array())'Coller le cadre copier.
'-----------------------------------------------------------------------------------------------
'La ligne ci-dessous est "neutralisée""
'oSelect = oCont.getCurrentSelection()'Cela devrait permettre de garder la sélection courante,
'à savoir le cadre, mais non...
'------------------------------------------------------------------------------------------------
With oFrame
.setPropertyValue("Print", True)
.Text.ContentProtected = False
.Name = "Nouveau nom2."
.setString("Nouveau texte.")
.Text.ContentProtected = True
End With
'---------------------------------------------------------------------------------
oFrame = oDoc.textFrames.getbyIndex(1) ' Nouveau cadre qui a été copié
'Sélection du nouveau cadre
oCont.select(oFrame)
'oCont.select(oCurs)'Désélectionne le cadre...
End sub |
Macro pour copier-coller un cadre texte
Bonjour,
Désolé mais j'ai du mal à comprendre. Je reprend ton premier post.
Donc je décortique :
Citation:
une petite macro qui devrait me permettre de sélectionner un cadre (TextFrame) par son index
Ok pas de problème je comprends.
Citation:
d’en modifier des paramètres
OK là aussi
Citation:
de le copier & le coller où se trouve le curseur
Là aussi pas de problème.
Citation:
pour enfin de rendre au cadre premier ses paramètres d’origines.
Là je ne comprend pas.
Pourquoi ne pas copier et coller le cadre et ensuite prendre la main sur ce nouveau cadre pour lui donner de nouvelles propriétés. Et comme çà le cadre premier garde ses paramètres d'origine.
Cordialement