Bonjour à tous,
est-ce que quelqu'un a déjà réussi à récupérer par macro la taille d'une cellule dans un tableau irrégulier (i.e. possédant des cellules fusionnées) ?
Cordialement,
O.J.
Bonjour à tous,
est-ce que quelqu'un a déjà réussi à récupérer par macro la taille d'une cellule dans un tableau irrégulier (i.e. possédant des cellules fusionnées) ?
Cordialement,
O.J.
Bonjour,
est-ce que quelqu'un a déjà réussi à récupérer par macro la taille d'une
cellule dans un tableau irrégulier (i.e. possédant des cellules
fusionnées) ?
De tête...
Lors d'une fusion de cellules, les cellules faisant partie de la fusion (la plage fusionnée) existent toujours et peuvent être référencées. Il est donc possible de tester si la cellule sélectionnée est une cellule unique ou résulte d'une fusion (donc une plage).
Plage (s'applique aux plages uniques) :
Function IsSingleRange(ByRef pRange As Object) As Boolean
'returns True if the range is a single range
IsSingleRange = pRange.supportsService(SERV_CELLRANGE)
End Function 'IsSingleRange
Cellule unique :
Function IsSingleCell(ByRef pRange As Object) As Boolean
'returns True if the range is a cell
IsSingleCell = pRange.supportsService(SERV_CELL)
End Function 'IsSingleCell
Avec :
Const SERV_CELLRANGE = "com.sun.star.table.CellRange"
Const SERV_CELL = "com.sun.star.table.Cell"
Attention à tester la cellule unique *avant* la plage car une cellule unique est aussi une plage (d'une seule cellule).
Bien cordialement,
Merci pour votre aide, tout d’abord.
L idée est bonne.
En revanche, il me semble que ceci ne fonctionne que sous calc. Je cherche à faire la même chose sous Writer.
Cordialement.
O.Jaccomard
Désolé pour la réponse tardive... le temps de rechercher et tester 
Merci pour votre aide, tout d’abord.
L idée est bonne.
En revanche, il me semble que ceci ne fonctionne que sous calc. Je cherche à faire la même chose sous Writer.
Oooouuups ! Pourtant c'est écrit là-haut : Writer... pfff... /o\
Tout d'abord, on remarque que le comportement d'un tableau Writer diffère sensiblement de celui d'une feuille Calc 
Mon joli speech précédent tombe donc à l'eau.
En particulier, lorsque des cellules sont fusionnées, elles sont renumérotées (voir la barre d'état) : en fusionnant A1 et B1, la fusion est identifiée A1 et la cellule autrefois identifiée B1 devient C1... Bigre.
Maintenant, pour ce qui est de mesurer la largeur des colonnes (ta question)... Ça se corse comme on dit à Ajaccio.
La manière de mémoriser les largeurs des colonnes d'un tableau Writer est un peu particulière : l'objet TableColumnSeparators définit ces largeurs (entre autres choses) mais relativement aux précédentes... D'où une gymnastique spécifique pour retrouver la largeur de chaque colonne.
Glaçage sur le gâteau, les largeurs ne sont pas exprimées dans une grandeur connue mais relativement les unes aux autres et à la largeur totale (qui peut d'ailleurs être soit absolue soit relative !). Il faut donc ensuite appliquer les règles de trois qui vont bien.
Cerise sur le glaçage, les tableaux irréguliers (ton cas) nécessitent de s'intéresser aux lignes prises individuellement et non plus au tableau dans sa globalité (TableColumnSeparators différents).
Bref, cette histoire n'est pas pour les chauves (qui ne peuvent pas/plus s'arracher de cheveux).
Ouf.
J'ai déposé une démo ici :
https://framadrop.org/r/uXWeHVzLIW#iNQgVE7MBFEfTjOGSc4FK2RhX6TVrJVQEZ+QQD6kEJ0=
En espérant que ça aidera,
Tout d'abord,
chapeau bas, l'artiste !
Je planche sur ce trucs depuis trois semaines, et je n'étais pas arrivé à ta cheville !
Vraiment, bravo. Et ça va m'aider.
Pour info et ceux que ça intéressent, j'explique ce que j'ai besoin de faire :
Dans le cadre d'un petit programme qui aléatoirise des documents (Doc Alea, cf ici :http://scolamath.free.fr/pedagogie/OutilLibreOffice/), je dois transformer un document writer et tout ce qu'il contient en code texte brut. C'est beaucoup plus facile, ensuite, de traiter des commandes spécifiques créées par soi-même (genre /t{a;b;c} pour tirer au hasard entre a, b ou c, par exemple).
Ensuite, si le texte qui traduit la structure du tableau est bien codé, il ne reste plus qu'à reconstruire le tableau à partir de ce codage, après avoir traité entre temps les instructions d'aléatoirisation ou de calcul.
J'y arrive pour les cadres, les tableaux réguliers, les formules de math, même les images (je sauvegarde l'image). Mais j'étais tombé sur un os avec les tableaux irréguliers : c'est vraiment tordu.
Par exemple, en se déplaçant dans le tableau ci-dessous de gauche à droite, ligne par ligne, on peut avoir A1,B1,C1,D1,E1, puis A2,B2,C2,D2,E2,F2,G2,H2, puis A3,F2!,G2!,D3!,E3!, puis A4,B4,C4,D4,G2!,F4,G4.
Le tout, sans savoir où c'est fusionné !
Je voudrais donc transformer ce codage en
A1,A1,C1,C1,C1,F1,F1,H1,I1
A2,B2,C2,D2,E2,F2,G2,H2,H2
A3,A3,A3,A3,A3,F2,G2,H3,I3
A4,B4,B4,B4,E4,F4,G2,H4,I4
Ce qui, me semble-t-il, est plus logique et permet de reconstruire le tableau d'origine avec les fusions adéquates.
Comme tu peux le voir, ton programme permet de s'y retrouver un peu sur cet exemple (même si il coince à cause du nombre de lignes qui varie, en raison de fusions verticales, mais c'est pas grave : ton code me donne le principe).
Donc, merci encore.
Cordialement,
O.J.
Bonjour,
oui, c'est un peu tordu à gérer... 
Entretemps, je me suis aperçu qu'il y a un bug dans la fonction GetColumnWidths(). Telle quelle, les tableaux d'une seule colonne provoquent une erreur.
En effet, dans la boucle For i = 0 To l_ColCount - 1, le test
If (i = 0) Then
est dans ce cas prématuré car l-Seps(0) est probablement non initialisé [pas vérifié mais je préfère assurer...].
Pour blinder le truc, je suggère d'inverser les deux tests If et ElseIf, ce qui donne les tests :
If (i = l_ColCount - 1) Then
'last column
'note: if there's only 1 column, this will get its width
l_ColWidth = l_Width - l_Total
ElseIf (i = 0) Then
'first column (case of multi-column tables)
l_ColWidth = l_Seps(i).Position / l_RelWidth * l_Width
Else
'other columns
l_ColWidth = (l_Seps(i).Position - l_Seps(i-1).Position) / l_RelWidth * l_Width
End If
Très heureux d'avoir pu éclairer ton chemin.
Bon dimanche,