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
