Calc macro - Trouver plage associée à une cellule fusionnée

Bonjour,

Je n'arrive pas à trouver dans les propriétés d'une cellule fusionnée la plage associée qui me donnerait la première et la dernière cellule concernée par cette fusion .
J'ai juste trouvé la propriété "merged" ou pas !!!

Merci de toute aide

Claude

Bonjour,

De : claude [mailto:pref-open-office@haute-garonne.gouv.fr]
Envoyé : lundi 12 août 2013 17:24

Je n'arrive pas à trouver dans les propriétés d'une cellule fusionnée la
plage associée qui me donnerait la première et la dernière cellule
concernée par cette fusion .
J'ai juste trouvé la propriété "merged" ou pas !!!

Essai rapide:

Sub essaiToto
Dim cellule As Object, objetAdresse As Object, plage as String
cellule =
Thiscomponent.Sheets.getByName("Feuille1").getCellRangeByName("toto")
objetAdresse = cellule.RangeAddress
plage = cellule.AbsoluteName
End Sub

toto est une plage nommée fusionnée (5x7) dans ma Feuille1
objetAdresse est l'objet qui décrit la plage
et plage donne directement la chaîne (par ex: $Feuille1.$D$17:$J$21)

Est-ce que ça répond ?

Bonne soirée,
Michel

Bonjour,

claude wrote

Bonjour,

Je n'arrive pas à trouver dans les propriétés d'une cellule fusionnée la
plage associée qui me donnerait la première et la dernière cellule
concernée par cette fusion .
J'ai juste trouvé la propriété "merged" ou pas !!!

Merci de toute aide

Claude

Il semblerait qu'il n'y ait pas de méthode. Seule la première cellule de la
plage a la propiétée "merged", pas les autres.
Voir ce fil du forum :
http://forum.openoffice.org/fr/forum/viewtopic.php?f=8&t=4629
L'auteur a créé une fonction avec l'enregistreur pour obtenir la dernière
cellule de la plage.
Je ne sais pas si cela peut être utile pour ce que tu souhaite faire...

Gérard

-------- Message original --------
Sujet : [INTERNET] RE: [fr-users] Calc macro - Trouver plage associée à une cellule fusionnée
Pour : 'claude' <pref-open-office@haute-garonne.gouv.fr>, 'libreoffice' <users@fr.libreoffice.org>

Bonjour,

De : claude [mailto:pref-open-office@haute-garonne.gouv.fr]
Envoyé : lundi 12 août 2013 17:24

Je n'arrive pas à trouver dans les propriétés d'une cellule fusionnée la
plage associée qui me donnerait la première et la dernière cellule
concernée par cette fusion .
J'ai juste trouvé la propriété "merged" ou pas !!!
    
Essai rapide:

Sub essaiToto
Dim cellule As Object, objetAdresse As Object, plage as String
cellule =
Thiscomponent.Sheets.getByName("Feuille1").getCellRangeByName("toto")
objetAdresse = cellule.RangeAddress
plage = cellule.AbsoluteName
End Sub

toto est une plage nommée fusionnée (5x7) dans ma Feuille1
objetAdresse est l'objet qui décrit la plage
et plage donne directement la chaîne (par ex: $Feuille1.$D$17:$J$21)

Est-ce que ça répond ?

Bonne soirée,
Michel

Désolée mais moi çà me donne que l'adresse de la première cellule
Peut être un roblème de version ? Je suis en LibreOffice 3.5.7.2 MIMO

Merci quand même

Claude

-------- Message original --------
Sujet : [INTERNET] [fr-users] Re: Calc macro - Trouver plage associée à une cellule fusionnée
Pour : users@fr.libreoffice.org

Bonjour,

claude wrote
  

Bonjour,

Je n'arrive pas à trouver dans les propriétés d'une cellule fusionnée la plage associée qui me donnerait la première et la dernière cellule concernée par cette fusion .
J'ai juste trouvé la propriété "merged" ou pas !!!

Merci de toute aide

Claude
    
Il semblerait qu'il n'y ait pas de méthode. Seule la première cellule de la
plage a la propiétée "merged", pas les autres.
Voir ce fil du forum :
http://forum.openoffice.org/fr/forum/viewtopic.php?f=8&t=4629
L'auteur a créé une fonction avec l'enregistreur pour obtenir la dernière
cellule de la plage.
Je ne sais pas si cela peut être utile pour ce que tu souhaite faire...

Gérard

--
View this message in context: http://nabble.documentfoundation.org/Calc-macro-Trouver-plage-associee-a-une-cellule-fusionnee-tp4069741p4069761.html
Sent from the Users mailing list archive at Nabble.com.

Bonjour,

J'avais bien vu ce fil mais comme il datait de 2007, j'avais fondé l'espoir qu'il y avait eu du nouveau.
Je vais voir si cela convient

Merci beaucoup quand même

Claude

Bonjour,

Ce n’est pas un problème de version et ma réponse était idiote :frowning:

En effet, elle contenait la réponse, car j’avais défini toto nommée comme
E17:K21 (cellules effectivement fusionnées)

La même chose en définissant le nom toto uniquement sur la première E17 ne
permet pas de connaître l’étendue de la plage fusionnée et en effet, je ne
trouve pas de méthode.

J’ai une idée qui me trotte derrière la tête, je vais essayer dans la
journée, on ne sait jamais …

Bonne journée,

Michel

… suite

Voici ce que j’ai trouvé avec l’aide de l’enregistreur de macro à partir de
l’idée du forum OOo, pas très élégant mais ça marche, à adapter bien sûr au
contexte (je ne sais pas pourquoi il est dit dans le forum que ça ne marche
pas)

Le principe : j’ai une plage fusionnée : E17:K21. J’utilise le dispatcher
pour me positionner sur la première cellule E17, puis en me déplaçant
toujours grâce au dispatcher un coup en bas et un coup à droite, je trouve
les deux adresses des cellules adjacentes à la plage :

adresseDessous = $Feuille1.$E$22

adresseAdroite = $Feuille1.$L$17

A partir de là, on peut aisément déduire que la dernière cellule de la plage
est K21

Sub cherchePlage

Dim document as Object, dispatcher as Object, adresseDessous As String,
adresseAdroite As String

dim args1(0) as new com.sun.star.beans.PropertyValue

document = ThisComponent.CurrentController.Frame

dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

'rechercher cellule dessous

args1(0).Name = "ToPoint"

args1(0).Value = "$E$17"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

dispatcher.executeDispatch(document, ".uno:JumpToNextCell", "", 0, Array())

adresseDessous = thiscomponent.currentSelection.AbsoluteName

'rechercher cellule à droite

args1(0).Name = "ToPoint"

args1(0).Value = "$E$17"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

dim args3(1) as new com.sun.star.beans.PropertyValue

args3(0).Name = "By"

args3(0).Value = 1

args3(1).Name = "Sel"

args3(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args3())

adresseAdroite = thiscomponent.currentSelection.AbsoluteName

End Sub

Bonne journée,

Michel

Bonjour,

La solution de Michel me semble plus élégante car :

- soit on récupère une chaîne contenant le nom de la feuille et le nom des cellules délimitant le merge : deux split permettent d'isoler les infos,
- soit on repart de l'objet objetAdresse (objetAdresse = cellule.RangeAddress) et puisque c'est un type RangeAddress :
            objetAdresse.Sheet donne l'index de la feuille,
            objetAdresse.StartColumn et objetAdresse.StartRow, les index de la cellule haut gauche,
            objetAdresse.EndColumn et objetAdresse.EndRow, les index de la cellule bas droite.

Testé sous AOO et LO.

En me relisant, je me dis que je ne suis pas très explicite. Donc un bout de code (compact) pour illustrer le propos :

Sub essaiToto
Dim sPlage as String, oPlage As Object, oRange As Object
    sPlage = Thiscomponent.Sheets.getByName("Feuille1").getCellRangeByName("Toto").AbsoluteName
    oPlage = Thiscomponent.Sheets.getByName("Feuille1").getCellRangeByName(sPlage)
    oRange = oPlage.RangeAddress
    
    MsgBox "Feuille : " & oRange.Sheet & chr(10) & _
            "Haut Gauche : " & oRange.StartColumn & "," & oRange.StartRow & chr(10) & _
            "Bas Droite : " & oRange.EndColumn & "," & oRange.EndRow, 64, "Index de la plage fusionnée"
End Sub

Pour l'utilisation directe de .AbsoluteName, c'est 2 splits avec variables intermédiaires ou 3 splits en mode compact (sans variables intermédiaires)... Version 2 splits :

Sub essaiToto2
Dim oSheet As Object, sPlage As String
    oSheet = Thiscomponent.Sheets.getByName("Feuille1")
    sPlage = oSheet.getCellRangeByName("Toto").AbsoluteName
    
Dim aInfosF() As String, aInfosCell() As String, sFeuille As String
Dim sHautGauche As String, sBasDroite As String
    aInfosF = split(sPlage, ".") : sFeuille = aInfosF(0)
    
    aInfosCell = split(aInfosF(1), ":")
    sHautGauche = aInfosCell(0) : sBasDroite = aInfosCell(1)
    
    MsgBox sFeuille & chr(10) & sHautGauche & chr(10) & sBasDroite
End Sub

Je vous laisse la version 3 splits comme devoir de vacances...

^^

En me relisant, je me dis que je ne suis pas très explicite. Donc un bout de code (compact) pour illustrer le propos :

Sub essaiToto

Dim sPlage as String, oPlage As Object, oRange As Object

    sPlage = Thiscomponent.Sheets.getByName("Feuille1").getCellRangeByName("Toto").AbsoluteName

    oPlage = Thiscomponent.Sheets.getByName("Feuille1").getCellRangeByName(sPlage)

    oRange = oPlage.RangeAddress

    MsgBox "Feuille : " & oRange.Sheet & chr(10) & _

            "Haut Gauche : " & oRange.StartColumn & "," & oRange.StartRow & chr(10) & _

            "Bas Droite : " & oRange.EndColumn & "," & oRange.EndRow, 64, "Index de la plage fusionnée"

End Sub

Pour l'utilisation directe de .AbsoluteName, c'est 2 splits avec
variables intermédiaires ou 3 splits en mode compact (sans variables
intermédiaires)... Version 2 splits :

Sub essaiToto2

Dim oSheet As Object, sPlage As String

    oSheet = Thiscomponent.Sheets.getByName("Feuille1")

    sPlage = oSheet.getCellRangeByName("Toto").AbsoluteName

Dim aInfosF() As String, aInfosCell() As String, sFeuille As String

Dim sHautGauche As String, sBasDroite As String

    aInfosF = split(sPlage, ".") : sFeuille = aInfosF(0)

    aInfosCell = split(aInfosF(1), ":")

    sHautGauche = aInfosCell(0) : sBasDroite = aInfosCell(1)

    MsgBox sFeuille & chr(10) & sHautGauche & chr(10) & sBasDroite

End Sub

Je vous laisse la version 3 splits sans variables comme devoir de vacances...

^^

En me relisant, je me dis que je ne suis pas très explicite. Donc un bout de code (compact) pour illustrer le propos :

Sub essaiToto

Dim sPlage as String, oPlage As Object, oRange As Object

    sPlage = Thiscomponent.Sheets.getByName("Feuille1").getCellRangeByName("Toto").AbsoluteName

    oPlage = Thiscomponent.Sheets.getByName("Feuille1").getCellRangeByName(sPlage)

    oRange = oPlage.RangeAddress

    MsgBox "Feuille : " & oRange.Sheet & chr(10) & _

            "Haut Gauche : " & oRange.StartColumn & "," & oRange.StartRow & chr(10) & _

            "Bas Droite : " & oRange.EndColumn & "," & oRange.EndRow, 64, "Index de la plage fusionnée"

End Sub

Pour l'utilisation directe de .AbsoluteName, c'est 2 splits avec
variables intermédiaires ou 3 splits en mode compact (sans variables
intermédiaires)... Version 2 splits :

Sub essaiToto2

Dim oSheet As Object, sPlage As String

    oSheet = Thiscomponent.Sheets.getByName("Feuille1")

    sPlage = oSheet.getCellRangeByName("Toto").AbsoluteName

Dim aInfosF() As String, aInfosCell() As String, sFeuille As String

Dim sHautGauche As String, sBasDroite As String

    aInfosF = split(sPlage, ".") : sFeuille = aInfosF(0)

    aInfosCell = split(aInfosF(1), ":")

    sHautGauche = aInfosCell(0) : sBasDroite = aInfosCell(1)

    MsgBox sFeuille & chr(10) & sHautGauche & chr(10) & sBasDroite

End Sub

Je vous laisse la version 3 splits sans variables en devoir de vacances...

^^

Bonjour,

Merci à tous mais pour moi il n'y a que la méthode avec le dispatcher qui fonctionne.

La macro de Patrice ne me renvoie que la première cellule de la plage fusionnée

Claude

-------- Message original --------
Sujet : [INTERNET] RE: [fr-users] Calc macro - Trouver plage associée à une cellule fusionnée
Pour : Michel Rudelle <rudelle.michel@gmail.com>, 'claude' <pref-open-office@haute-garonne.gouv.fr>, 'libreoffice' <users@fr.libreoffice.org>

Bonjour,

Effectivement j'ai trouvé une version AOO avec laquelle cela ne fonctionne pas. :frowning:
Donc on reprend le schmilblick avec une autre approche :

Sub essaiToto3
Dim oSheet as Object, oPlage As Object, oRange As Object
    oSheet = Thiscomponent.Sheets.getByName("Feuille1")
    oPlage = oSheet.getCellRangeByName("Toto")

    IF oPlage.isMerged Then
        ' On annule la fusion des cellules et...
        ' ô miracle la sélection porte sur la plage anciennement fusionnée :wink:
        oPlage.Merge(False)
        ' On récupère donc le RangeAddress
        oRange = ThisComponent.CurrentSelection.RangeAddress
        ' et on refait la fusion, autant remettre en l'état, isn't ?
        oPlage.Merge(True)
    End If

    MsgBox "Feuille : " & oRange.Sheet & chr(10) & _
            "Haut Gauche : " & oRange.StartColumn & "," & oRange.StartRow & chr(10) & _
            "Bas Droite : " & oRange.EndColumn & "," & oRange.EndRow, 64, "Index de la plage fusionnée"
End Sub

Cordialement

Encore une fois, merci d'essayer mais cela ne fonctionne qu'une fois et cela ne donne que la dernière ligne de fusion mais la colonne mais si on recommence les cellules sont dé-fusionnées.

Désolée

Bonne soirée

Claude

-------- Message original --------
Sujet : [INTERNET] RE: [fr-users] Re: RE: [fr-users] Calc macro - Trouver plage associée à une cellule fusionnée
Pour : claude <pref-open-office@haute-garonne.gouv.fr>, 'libreoffice' <users@fr.libreoffice.org>

Tu me surprends un peu : [mais cela ne fonctionne qu'une fois et cela ne donne que la dernière ligne de fusion mais la colonne mais si on recommence les cellules sont dé-fusionnées]
Cela fonctionne une fois normalement ? ou à plus ou moins une fois ?
Les cellules non fusionnées, c'est AMHA moins grave : où est comment tu refusionnes.? Selon le cas, il suffit de resélectionner à partir de oRange avant de lancer la fusion.

Donc, si ton fichier n'a rien de confidentiel, ce serait bien de le joindre et, s'il l'est, tu peux toujours effacer les contenus sensibles : le truc c'est de voir ton contexte, pas le contenu du fichier.

Bonjour,

Très intéressant cette façon de trouver la plage, mais il reste un
inconvénient:
Certaines propriétés ne sont pas conservées lors de la re-fusion, par
exemple les alignements. Ceci pourrait se régler en les lisant au préalable
et les réappliquant ensuite, mais cela complique un peu la macro et il
faudrait vérifier si d'autres propriétés ne sont concernées.
Et si la feuille est protégée, il faut déprotéger puis reprotéger.

Si le dispatcher marche pour le besoin de l'utilisateur, pourquoi se
compliquer la vie ?
... mais cette méthode est à garder en mémoire.

Bonne journée,
Michel

Bonjour

J'ai fait "à la hache", pour ne traiter que l'aspect coordonnées, mais effectivement il y a plusieurs choses à traiter pour une gestion sans effets collatéraux.

Quant à la question concernant le dispatcher : j'aime bien l'API (entre autres parce que cela me permet d'en découvrir toujours de nouveaux pans et dieu sait s'il m'en reste à découvrir...).
Je garde le dispatcher dans les cas où il se distingue (moins verbeux et/ou plus rapide). Dans ce cas, il semblerait qu'il soit plus efficace si, via l'API, il faut sauvergader un tas d'objets...

Et pourquoi faire simple quand on peut faire compliqué... :wink:

Bonne journée.

Bonjour,

J'ai juste testé sur un classeur vierge. j'ai fusionné quelques cellules. j'ai nommé cette plage "toto" et j'ai lancé la macro.

Quant à refusionner, moi je ne fais rien puisque dans la macro, il est noté "et on refait la fusion, autant remettre en l'état, isn't ?
oPlage.Merge(True)"

Et quand la macro a été exécutée une fois je me retrouve avec aucune cellule fusionnée et la plage "toto" fait référence à la première cellule de l'ancienne plage fusionnée.

Claude

-------- Message original --------
Sujet : [INTERNET] RE: [fr-users] Re: RE: [fr-users] Calc macro - Trouver plage associée à une cellule fusionnée
Pour : claude <pref-open-office@haute-garonne.gouv.fr>, 'libreoffice' <users@fr.libreoffice.org>

Yo

Effectivement, je n'ai pas testé les références liées à de la plage nommée.
Il m'aurait semblé que le définition de la plage, même erronée le temps du unmerge/merge, serait restée en l'état.
Il est possible que nos codeurs aient jugé bon d'actualiser en live... Ou qu'il s'agit d'une "fonctionnalité non documentée". ^^

La manip sur l'étendue du merge n'implique pas nécessairement d'automatiser une redéfinition de la zone nommée.
J'aurai même tendance à penser que ce n'est pas plus mal de la laisser en l'état, même si le premier automatisme peut se défendre.

Ce qui ramène à l'aspect pratique de l'utilisation du dispacher : on ne touche à rien = on n'a rien à sauvegarder pour une restauration ultérieure ==> on se contente de se déplacer.

Par contre, la perte de la référence complète du RangeAddress est à mon sens une régression.
Je ne sais pas trop où elle a commencé avec LO, si tant est de LO ait renvoyé une RangeAddress complet dans une version (ce qui ne fait pas partie des essais que je peux faire, croyant naïvement que c'est une chose bouclée qui peut difficilement évoluer en mal...)
De plus, rapidement les essais m'ont conduit à attendre patiemment la 4.1.1. Comprendre : je ne teste, sur LO, que ponctuellement ^^

Les compteurs ayant commencé à défiler en 4.0.x, les 4.1.x vont "viendre"... ^^

:wink:

Bonsoir,

De : VEDEL Patrice [mailto:patvedel@hotmail.com]
Envoyé : jeudi 22 août 2013 16:23

[...]

Par contre, la perte de la référence complète du RangeAddress est à mon
sens une régression.
Je ne sais pas trop où elle a commencé avec LO, si tant est de LO ait
renvoyé une RangeAddress complet dans une version ...

J'ai pu vérifier ayant une palanquée de versions installées en //
Le fonctionnement est identique avec la 3.3.4
Je pense que l'info est ailleurs, je manque de temps pour essayer, il
faudrait voir de ce coté:
http://www.openoffice.org/api/docs/common/ref/com/sun/star/table/XMergeableC
ell.html

Michel