Bonjour,
Je voudrais copier-coller le texte contenu dans une cellule avec son formatage. Par exemple, lettres en italique ou en gras
Ni .string, ni .formula ne permettent d'obtenir ce contenu. "abcd" devient "abcd".
Comment procéder ?
Merci.
Bonjour,
Je voudrais copier-coller le texte contenu dans une cellule avec son formatage. Par exemple, lettres en italique ou en gras
Ni .string, ni .formula ne permettent d'obtenir ce contenu. "abcd" devient "abcd".
Comment procéder ?
Merci.
hello,
j'ai retrouvé dans le forum un code où je montrais un exemple de copier coller spécial d'une plage :
Dans cet exemple j'ai eu la bonne idée de mettre un commentaire sur les arguments :
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 Sub CopierCollerSpecial ' J.P Janvier 2015 oDoc1 = thisComponent oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper") oFrame1 = oDoc1.CurrentController.Frame ' On sélectionne la plage de cellule à copier oSheet = oDoc1.Sheets(0) rng = oSheet.getCellRangeByName("A1:A10") oDoc1.CurrentController.Select(rng) ' On utilise un Dispatch pour copier la plage oDispatcher.executeDispatch(oFrame1, ".uno:Copy", "", 0, Array()) ' On sélectionne la première cellule de l'endroit où coller rng = oDoc1.Sheets(0).getCellRangeByName("B1") oDoc1.CurrentController.Select(rng) ' on renseigne les arguments pour le coller spécial dim args1(5) as new com.sun.star.beans.PropertyValue ' Flags : A=Tout VSD=Valeurs T=Formats F=Formules VSDT=Valeurs&Formats args1(0).Name = "Flags" args1(0).Value = "A" 'FormulaCommand : 0=aucune 1=addition 2=soustraction 3=multiplication 4=Division args1(1).Name = "FormulaCommand" '1 : on additionne les valeurs de la plage de départ à celle d'arrivée args1(1).Value = 1 args1(2).Name = "SkipEmptyCells" args1(2).Value = false args1(3).Name = "Transpose" args1(3).Value = false args1(4).Name = "AsLink" args1(4).Value = false args1(5).Name = "MoveMode" args1(5).Value = 4 oDispatcher.executeDispatch(oFrame1, ".uno:InsertContents", "", 0, args1()) end sub
donc avec l'argument Flags à A tu devrais tout coller.Flags : A=Tout VSD=Valeurs T=Formats F=Formules VSDT=Valeurs&Formats
Ami calmant, J.P
Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko
Waouh !!!
Haut niveau pour moi !
Il se trouve que je fais des copiages cellule par cellule (repérées par leur position). Pourrais-tu convertir (simplifier ?) ton code pour l'adapter à cette situation ?
Merci d'avance.
JD
hello,
il faudrait que tu nous montres ton code pour voir comment l'adapter.
Ami calmant, J.P
Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko
Bonjour,
Il s'agit d'une macro toute simple destinée à "recaler" des cellules sur la gauche, en supprimant les cellules vides.
La partie critique est ici :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 iSheet=ThisComponent.Sheets.getByName("Feuille1") oSheet=ThisComponent.Sheets.getByName("Feuille2") for l%=0 to 30 co%=0 for c%=0 to 15 dat=trim(iSheet.getCellByPosition(c%,l%).string) if dat<>"" then oSheet.getCellByPosition(co%,l%).string=dat co%=co%+1 end if next next end sub
Merci d'avance.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 dat=trim(iSheet.getCellByPosition(c%,l%).string) if dat<>"" then oSheet.getCellByPosition(co%,l%).string=dat
JD
hello,
tu peux faire comme cela par exemple (pour les propriétés gras,italique,souligné) :
tu pourrais aussi passer par des styles de cellules nommés.
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 Sub test_copieformat() iSheet=ThisComponent.Sheets.getByName("Feuille1") oSheet=ThisComponent.Sheets.getByName("Feuille2") for l%=0 to 30 co%=0 for c%=0 to 15 dat=trim(iSheet.getCellByPosition(c%,l%).string) if dat<>"" then oSheet.getCellByPosition(co%,l%).string=dat oSheet.getCellByPosition(co%,l%).CharWeight = iSheet.getCellByPosition(c%,l%).CharWeight oSheet.getCellByPosition(co%,l%).CharPosture = iSheet.getCellByPosition(c%,l%).CharPosture oSheet.getCellByPosition(co%,l%).CharUnderline = iSheet.getCellByPosition(c%,l%).CharUnderline co%=co%+1 end if next next end sub
Le code à l'air lent à s'exécuter, il faudrait utiliser des plages ( par exemple une seule copie par ligne ou colonne) .
Ami calmant, J.P
Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko
Merci, l'ami
Malheureusement, la propriété .CharPosture ne semble concerner que les mises en forme globales des cellules. Si, comme dans mon cas, la mise en forme ne concerne qu'une partie de la cellule, elle est ignorée.
Bonjour,
Pour info c'est la fonction Trim qui te fait perdre ton formatage. J'ai fais un essais avec Ltrim et Rtrim pensant que cela n'affecterait que la fin et le début du contenu de la cellule mais c'est pareil, alors que si on passe outre la famille des Trim, le collage est conforme à la copie.
Dans le code qui suit, la ligne 11 est commentée, si tu la dé-commente, tu perds la surcharge de formatage appliquée à certains caractères.
Là je n'ai pas le temps de peaufiner, mais il faudra trouver une autre solution pour supprimer les espaces inutiles.
Très certainement un rechercher & remplacer au début et à la fin de la chaîne.
A+
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 Sub main oDoc = Thiscomponent iSheet = oDoc.Sheets.getByName("Feuille1") oSheet = oDoc.Sheets.getByName("Feuille2") for l%=0 to 30 co%=0 for c%=0 to 15 oCell1 = iSheet.getCellByPosition(c%,l%) dat = Trim(oCell1.string) if dat<>"" then 'oCell1.String = dat oDoc.CurrentController.select(oCell1) aCopier = oDoc.CurrentController.getTransferable() oCell2 = oSheet.getCellByPosition(co%,l%) oDoc.CurrentController.select(oCell2) oDoc.CurrentController.insertTransferable(aCopier) co%=co%+1 end if next next End Sub
Super, Z_662 !
Pour les trimming, c'est pas fondamental.
Merci et bonne soirée.
Dans ce cas, il est inutile de boucler sur l'ensemble des cellules, pour les copier/coller une à une (grosse perte de temps). Autant sélectionner la zone toute entière comme te le suggérait jurassic pork :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Sub main oDoc = Thiscomponent iSheet = oDoc.Sheets.getByName("Feuille1") oSheet = oDoc.Sheets.getByName("Feuille2") oZone = iSheet.getCellRangeByPosition(0,0,15,30) oDoc.CurrentController.select(oZone) aCopier = oDoc.CurrentController.getTransferable() oCellDest = oSheet.getCellByPosition(0,0) oDoc.CurrentController.select(oCellDest) oDoc.CurrentController.insertTransferable(aCopier) End Sub
Merci, mais je précise que mon objectif est de supprimer les cellules vides, et pas de copier globalement la plage.
Petite explication : il s'agit d'un texte comportant initialement des tabulations (en nombre forcément variable) pour réaliser un alignement en 2 ou 3 colonnes. Je l'ai d'abord converti en tableau, mais il est apparu des cellules vides.
L'auteur du texte ne connaît malheureusement ni les tableurs, ni même les tableaux ...
A bientôt, et encore merci pour votre aide.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager