Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenOffice & LibreOffice Discussion :

Macro pour copier-coller un cadre texte.


Sujet :

OpenOffice & LibreOffice

  1. #1
    Candidat au Club
    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 :Sélectionner tout -Visualiser dans une fenêtre à part
    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<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />aste", "", 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 :Sélectionner tout -Visualiser dans une fenêtre à part
    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<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />aste", "", 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.

  2. #2
    Membre habitué
    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 :Sélectionner tout -Visualiser dans une fenêtre à part
    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<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />aste", "", 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
    Libre Office Version: 6.4.6.2 (x64)
    Windows 10

  3. #3
    Candidat au Club
    Merci Mobydick_62,
    d'abord pour avoir pris le temps de regarder ces dysfonctionnements, mais surtout pour avoir souligné la "neutralisation".
    Est-il possible de la contourner, et surtout comment ?
    Car le changement de nom que je prévoyais devait se faire automatiquement & nom manuellement ?
    Cordialement.
    Fred.

  4. #4
    Membre habitué
    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 :

    une petite macro qui devrait me permettre de sélectionner un cadre (TextFrame) par son index
    Ok pas de problème je comprends.

    d’en modifier des paramètres
    OK là aussi

    de le copier & le coller où se trouve le curseur
    Là aussi pas de problème.

    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
    Libre Office Version: 6.4.6.2 (x64)
    Windows 10

  5. #5
    Candidat au Club
    Bonjour à tous & à toutes,
    je suis désolé d’avoir tant tardé à répondre à Mobydick_62, d’autant que ses remarques sur l’énonce de mon premier poste sont des plus justes :
    « Pourquoi faire deux fois ce que l’on peut faire en une ? »
    Voici où j’en suis, j’ai préparé deux macro, l’une pour choisir un nom, l’autre pour copier, coller le cadre le renommer, etc.
    Afin de ne pas me soucier des index, j’ai choisi de rappeler le nouveau cadre par son nom (Cadre1, Cadre2 etc.).
    La double boucle conditionnelle de la première macro devant permettre de pouvoir supprimer des cadres sans avoir de problèmes de nommage lors d’un collage suivant.
    Cela semble fonctionner correctement.
    Il existe sans doutes des méthodes plus appropriées & je suis preneur.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    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
    Sub Nom(i, j, k) 'Les variables i, j & k sont de mode String & composeront le texte de la 2ond macro
    dim x, y, z as integer, oNom, oCadre, p as string, oTC, oTxF, oFrame as object
    oTC = ThisComponent
    oTxF = oTC.TextFrames()
    y = 1
    x = 1
    p = "Nouveau Nom" & y
    oCadre = "Cadre" & x
    For z = 0 To Ubound(oTxF.elementNames())
    oFrame = oTxF.getByIndex(z)
    	with oFrame
    	oNom = .Name
    		'Vérifier si il y a déjà dans le document de cadres nommés Cadre1, Cadre2...
    		If oNom = oCa And oNom <> "Cadre d'origine" Then
    		x = (x+1)
    		oCadre = "Cadre" & x 'Produire le nom du prochain cadre copié en conséquence.
    		Endif
    		'Vérifier si il y a déjà dans le document de cadres nommés "Nouveau cadre"
    		If oNom = p And oNom <> "Cadre d'origine" Then
    		y = (y+1)
    		p = "Nouveau Nom" & y 'Choisir le numéro de "Nouveau cadre" en conséquence.
    		Endif
    	End With
    Next l
    Copy(i, j, k, p, oCadre)
    End sub

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Sub Copy(i, j, k, p, oCadre)
    dim  oTC, oCC, oCS, oTxF, oFrame, oDoc, oDisp as object
    oTC = ThisComponent
    oCC = oTC.CurrentController
    oDisp = createUnoService("com.sun.star.frame.DispatchHelper")
    oCS = oTC.currentSelection()
    oTxF = oTC.TextFrames()
    oFrame = oTxF.getByIndex(0)
    oCC.select(oFrame)
    oDoc = oCC.Frame
    oDisp.executeDispatch(oDoc, ".uno:Copy", "", 0, Array())
    oDisp.executeDispatch(oDoc, ".uno:Escape", "", 0, Array())
    oCC.select(oCS)
    oDisp.executeDispatch(oDoc, ".uno<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />aste", "", 0, Array())
    oFrame = oTxF.getbyName(oCadre) 'En choisissant par son nom cela fonctionne...
    	With oFrame
    	.Name = p 'Plus aucun problème de nommage.
    	.setPropertyValue("Print", True)
    	.Text.ContentProtected = False
    	.String = i & j & k & CHR$(13) 'C'est ici que j'aimerais choisir des styles de caractères.
    	End With
    oCC.select(oCS)
    End Sub


    Néanmoins un tout autre problème se pose à moi :
    J’aimerais inscrire, dans le cadre coller, des variables « string » ayant des « styles de caractères » spécifiques (ou d’appliquer ceux-ci une fois le texte inscrit dans le cadre).
    Mais lorsque j’utilise l’enregistreur de macro, les méthodes produites font sauter la copie en début de page.
    Et ce même si les cadres, y compris celui d’origine, sont ancrer au caractère. Et là je sèche.
    Pour information, je viens de passer à la Version: 6.4.0.3.
    Cordialement, Fred.

  6. #6
    Membre habitué
    Ecriture dans cadre
    Bonjour,
    Pour écrire dans un cadre il faut tout d'abord créer un curseur d'écriture dans ce cadre.
    Ensuite appliquer au curseur les propriétés que l'on désire (police, taille police, gras, italique........)
    Et on écrit.

    Ci-dessous un bout de code à titre d'exemple.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Sub EcritureDansCadre()
    Dim oMonCadre As Object, oDoc As Object  
    Dim oTexte As Object, oCurseur As Object
    oDoc = ThisComponent
    'Je récupère le cadre dans lequel je vais écrire
    oMonCadre = oDoc.TextFrames.getByName("Cadre1")
     
    oTexte = oMonCadre.Text
    oCurseur = oTexte.createTextCursor
    'Ecriture en gras
    oCurseur.CharWeight = com.sun.star.awt.FontWeight.BOLD
    oTexte.insertString(oCurseur, "Blabla", false)
    'Insertion d'un paragraphe
    Dim para As Integer
    para = com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK   
    oTexte.insertControlCharacter (oCurseur, para, false)
    'Retour écriture normal
    oCurseur.CharWeight = com.sun.star.awt.FontWeight.NORMAL
    'Aligement texte à droite
    oCurseur.ParaAdjust = com.sun.star.style.ParagraphAdjust.RIGHT
    'Taille police à  14  
    oCurseur.CharHeight = 14
    oTexte.insertString(oCurseur, "Et aussi...", false)
    End Sub


    Par ailleurs , il est d'usage de bien nommer ses variables. Les variables objet commencent par un petit "o". Dans ton code tu as par exemple Dim oFrame as object et Dim oCadre as String ce qui, pour ceux t'aide prête à confusion.
    Également dans la déclaration des tes variables tu écris : dim oTC, oCC, oCS, oTxF, oFrame, oDoc, oDisp as object. Sache que seule l'une d'elles sera considérée comme variable Object. Les autres seront inévitablement des variables de type Variant. Même si çà fonctionne, tôt ou tard tu rencontreras des problèmes. Cette variable Variant de type Objet pourra être interpréter comme Variant de type String ou autre. Et là en cas de problème et déboguer il sera dur de trouver l'erreur
    Il est préférable donc d'écrire Dim OTC As Object, oCC As Object, oTxF As Object.......

    Ci dessous un petit tableau


    Cordialement
    Libre Office Version: 6.4.6.2 (x64)
    Windows 10

  7. #7
    Candidat au Club
    Bonjour et merci Mobidick,
    j’ai cette fois-ci énormément tardé à répondre eut égard, entre-autre, aux événements que chacun sait, mais ses indications m’ont été et me sont des plus précieuses.
    Aussi j’ai pu terminer ce petit projet et je me lance dans un nouveau mais avec Libre Office Dessin.
    Encore une fois merci.
    Cordialement Fred.

###raw>template_hook.ano_emploi###