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é... ;)

Bonne journée.


> From: [email protected]
> To: [email protected]
> Subject:  RE: [fr-users] Calc macro - Trouver plage associée à une cellule 
> fusionnée
> Date: Wed, 21 Aug 2013 10:23:58 +0200
> 
> 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
> 
> > -----Message d'origine-----
> > De : VEDEL Patrice [mailto:[email protected]]
> > Envoyé : mercredi 21 août 2013 03:44
> > À : claude; 'libreoffice'
> > Objet : [fr-users] RE: [fr-users] Re: RE: [fr-users] Calc macro - Trouver
> > plage associée à une cellule fusionnée
> > 
> > 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.
> > 
> > 
> > > Date: Tue, 20 Aug 2013 17:15:35 +0200
> > > From: [email protected]
> > > To: [email protected]
> > > Subject: Re:     RE: [fr-users] Re:     RE: [fr-users] Calc macro -
> > Trouver plage associée à une cellule fusionnée
> > >
> > > 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
> > > De : VEDEL Patrice <[email protected]>
> > > Pour : claude <[email protected]>, 'libreoffice'
> > > <[email protected]>
> > > Date : 20/08/2013 16:39
> > > > Bonjour,
> > > >
> > > > Effectivement j'ai trouvé une version AOO avec laquelle cela ne
> > > > fonctionne pas. :(
> > > > 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 ;)
> > > >         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
> > > >
> > > > > Date: Tue, 20 Aug 2013 09:02:39 +0200
> > > > > From: [email protected]
> > > > > To: [email protected]
> > > > > Subject: [fr-users] Re: RE: [fr-users] Calc macro - Trouver plage
> > > > associée à une cellule fusionnée
> > > > >
> > > > > 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
> > > > > De : VEDEL Patrice <[email protected]>
> > > > > Pour : Michel Rudelle <[email protected]>, 'claude'
> > > > > <[email protected]>, 'libreoffice'
> > > > > <[email protected]>
> > > > > Date : 13/08/2013 16:47
> > > > > > 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").Abso
> > luteName
> > > > > > 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...
> > > > > >
> > > > > > ^^
> > > > > >
> > > > > >
> > > > > >
> > > > > > > From: [email protected]
> > > > > > > To: [email protected];
> > [email protected]
> > > > > > > Subject: RE: [fr-users] Calc macro - Trouver plage associée à
> > une
> > > > > > cellule fusionnée
> > > > > > > Date: Tue, 13 Aug 2013 12:17:41 +0200
> > > > > > >
> > > > > > > … 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
> > > > > > >
> > > > > > > _____
> > > > > > >
> > > > > > > De : Michel Rudelle [mailto:[email protected]]
> > > > > > > Envoyé : mardi 13 août 2013 11:11
> > > > > > > À : 'claude'; 'libreoffice'
> > > > > > > Objet : RE: [fr-users] Calc macro - Trouver plage associée à une
> > > > cellule
> > > > > > > fusionnée
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Bonjour,
> > > > > > >
> > > > > > > Ce n’est pas un problème de version et ma réponse était idiote
> > :(
> > > > > > >
> > > > > > > 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
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > _____
> > > > > > >
> > > > > > > De : claude [mailto:[email protected]]
> > > > > > > Envoyé : mardi 13 août 2013 08:07
> > > > > > > À : Michel Rudelle
> > > > > > > Cc : 'claude'; 'libreoffice'
> > > > > > > Objet : Re: RE: [fr-users] Calc macro - Trouver plage associée à
> > > > une
> > > > > > cellule
> > > > > > > fusionnée
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > -------- Message original --------
> > > > > > > Sujet : [INTERNET] RE: [fr-users] Calc macro - Trouver plage
> > > > associée à
> > > > > > > une cellule fusionnée
> > > > > > > De : Michel Rudelle <mailto:[email protected]>
> > > > > > > <[email protected]>
> > > > > > > Pour : 'claude' <mailto:[email protected]>
> > > > > > > <[email protected]>, 'libreoffice'
> > > > > > > <mailto:[email protected]> <[email protected]>
> > > > > > > Date : 12/08/2013 17:57
> > > > > > >
> > > > > > > Bonjour,
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > De : claude [mailto:[email protected]]
> > > > > > > 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
> > > > > > >
> > > > > > >
> > > > > > > --
> > > > > > > Envoyez un mail à [email protected] pour
> > savoir
> > > > > > comment vous désinscrire
> > > > > > > Les archives de la liste sont disponibles à
> > > > > > http://listarchives.libreoffice.org/fr/users/
> > > > > > > Tous les messages envoyés sur cette liste seront archivés
> > > > > > publiquement et ne pourront pas être supprimés
> > > > > > >
> > > > >
> > > > >
> > > > >
> > > > > --
> > > > > Envoyez un mail à [email protected] pour savoir
> > > > comment vous désinscrire
> > > > > Les archives de la liste sont disponibles à
> > > > http://listarchives.libreoffice.org/fr/users/
> > > > > Tous les messages envoyés sur cette liste seront archivés
> > > > publiquement et ne pourront pas être supprimés
> > > > >
> > >
> > >
> > >
> > > --
> > > Envoyez un mail à [email protected] pour savoir
> > comment vous désinscrire
> > > Les archives de la liste sont disponibles à
> > http://listarchives.libreoffice.org/fr/users/
> > > Tous les messages envoyés sur cette liste seront archivés publiquement
> > et ne pourront pas être supprimés
> > >
> > 
> > --
> > Envoyez un mail à [email protected] pour savoir comment
> > vous désinscrire
> > Les archives de la liste sont disponibles à
> > http://listarchives.libreoffice.org/fr/users/
> > Tous les messages envoyés sur cette liste seront archivés publiquement et
> > ne pourront pas être supprimés
> 
> 
> -- 
> Envoyez un mail à [email protected] pour savoir comment 
> vous désinscrire
> Les archives de la liste sont disponibles à 
> http://listarchives.libreoffice.org/fr/users/
> Tous les messages envoyés sur cette liste seront archivés publiquement et ne 
> pourront pas être supprimés
> 
                                          
-- 
Envoyez un mail à [email protected] pour savoir comment vous 
désinscrire
Les archives de la liste sont disponibles à 
http://listarchives.libreoffice.org/fr/users/
Tous les messages envoyés sur cette liste seront archivés publiquement et ne 
pourront pas être supprimés

Répondre à