[Résolu][Calc] Effet inattendu sur copier / collage spécial

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Avatar de l’utilisateur
Flying_Roger
NOOuvel adepte
NOOuvel adepte
Messages : 21
Inscription : 24 juil. 2021 11:28

[Résolu][Calc] Effet inattendu sur copier / collage spécial

Message par Flying_Roger »

Bonjour,

Nouvel utilisateur de LibreOffice, j'évalue la possibilité de convertir des workbook MS-Excel (2016) comportant des macros en ODS pour les utiliser dans SCALC et pas mal de choses fonctionnent, parfois moyennant de petites corrections. Quand quelque chose ne fonctionne pas, je l'isole dans un petit programme test où je simplifie tout pour essayer de comprendre ce qui ne va pas.
J'ai ainsi pu progresser rapidement, mais je bute sur ceci: il s'agit de 5 lignes de la Feuille2 vers la Feuille1 en faisant un copier/coller des lignes entières:

Code : Tout sélectionner

Option VBASupport 1
Sub Copie_cellule
 Sheets("Feuille2").Select
 With Sheets("Feuille1")
  For r = 1 to 5
   Rows(r).Copy
   .Rows(r).PasteSpecial Paste:=xlPasteAll
  Next
 End With
End Sub
Ce code tourne, mais produit un effet inattendu: au lieu de copier les lignes entières, il copie la cellule (1,1) de la Feuille2 sur toutes les cases des lignes 1 à 5 de la Feuille1.

Il faut toujours un peu de temps pour s'habituer à un nouvel outil et je passe peut-être à côté de quelque chose d'important, d'où ma question sur ce forum. Merci d'avance à qui pourra m'aider à progresser.

Update: après quelques essais, j'ai vu que le problème peut être contourné en sélectionnant au préalable la ligne à copier et en effectuant la copie à travers cette sélection plutôt que par adressage direct. Le code ci-dessous illustre le problème.

Code : Tout sélectionner

Option VBASupport 1
Sub Copie_cellule
 Sheets("Feuille2").Select
 With Sheets("Feuille1")
  For r = 1 to 5
   Sheets("Feuille2").Rows(r).Select
   Selection.Copy
   .Rows(r).PasteSpecial Paste:=xlPasteAll
  Next
  For r = 5 to 10
   Sheets("Feuille2").Rows(r).Copy
   .Rows(r).PasteSpecial Paste:=xlPasteAll
  Next
 end with
End Sub
Ce code donne comme résultat suivant (la 2e feuille contenait des valeurs L1C1, L1C2,...) :

L1 C1 L1 C2 L1 C3 L1 C4 L1 C5
L2 C1 L2 C2 L2 C3 L2 C4 L2 C5
L3 C1 L3 C2 L3 C3 L3 C4 L3 C5
L4 C1 L4 C2 L4 C3 L4 C4 L4 C5
L5 C1 L5 C2 L5 C3 L5 C4 L5 C5
L5 C1 L5 C2 L5 C3 L5 C4 L5 C5
L5 C1 L5 C2 L5 C3 L5 C4 L5 C5
L5 C1 L5 C2 L5 C3 L5 C4 L5 C5
L5 C1 L5 C2 L5 C3 L5 C4 L5 C5
L5 C1 L5 C2 L5 C3 L5 C4 L5 C5
Dernière modification par Flying_Roger le 26 juil. 2021 18:08, modifié 1 fois.
Roger
LibreOffice7.0.6.2 (x64) - OpenOffice 4.1.10 - Windows 10
Avatar de l’utilisateur
Dolev
InconditiOOnnel
InconditiOOnnel
Messages : 948
Inscription : 19 août 2018 05:20

Re: [Calc] rows(r).copy et PasteSpecial - effet inattendu

Message par Dolev »

Bonjour,

La prochaine fois, fournis un document. Cela facilitera les réponses.
Flying_Roger a écrit : il s'agit de 5 lignes de la Feuille2 vers la Feuille1 en faisant un copier/coller des lignes entières
Avec l'enregistreur de macro :

Code : Tout sélectionner

sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Sel"
args1(0).Value = false

dim args2(1) as new com.sun.star.beans.PropertyValue
args2(0).Name = "By"
args2(0).Value = 1
args2(1).Name = "Sel"
args2(1).Value = true

dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "Nr"
args3(0).Value = 1

dispatcher.executeDispatch(document, ".uno:GoToStart", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args2())
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args2())
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args2())
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args2())
dispatcher.executeDispatch(document, ".uno:SelectRow", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

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

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

dim args4(5) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Flags"
args4(0).Value = "SVD"
args4(1).Name = "FormulaCommand"
args4(1).Value = 0
args4(2).Name = "SkipEmptyCells"
args4(2).Value = false
args4(3).Name = "Transpose"
args4(3).Value = false
args4(4).Name = "AsLink"
args4(4).Value = false
args4(5).Name = "MoveMode"
args4(5).Value = 4

dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args4())

end sub
Open Office 4.1.15 sous Windows 11
Avatar de l’utilisateur
Flying_Roger
NOOuvel adepte
NOOuvel adepte
Messages : 21
Inscription : 24 juil. 2021 11:28

Re: [Calc] rows(r).copy et PasteSpecial - effet inattendu

Message par Flying_Roger »

Merci pour ta réponse.

Le document était si élémentaire que je ne pensais pas utile de le fournir, le contenu pouvant être tout à fait quelconque pour ce test.
Je suis un peu effrayé par la solution proposée: si je dois remplacer un peu partout deux lignes par tout ce code, je ne suis pas sorti de l'auberge car j'ai des applications assez volumineuses.

Note que pour ce cas précis, j'avais fini par résoudre avec un contournement assez simple (le select); même dans MS-Excel, j'avais déjà dû utiliser ce genre contournement pour certains bugs.

Quand j'avais commencé à programmer en VBA, j'ai aussi utilisé l'enregistreur, mais je suis vite passé à une programmation plus directe car même quand il fonctionne bien, l'enregistreur ne peut jamais donner que des séquences sans aucune logique ou bouclage.
Après, quand on ne trouve pas une méthode ou une propriété, cela peut quand même aider. J'avais peu investigué cette possibilité parce que mes premiers essais avec l'enregistreur étaient décevants et que j'ai lu quelque part qu'il est très limité et que tout ne se traduit pas.
Roger
LibreOffice7.0.6.2 (x64) - OpenOffice 4.1.10 - Windows 10
Avatar de l’utilisateur
Dolev
InconditiOOnnel
InconditiOOnnel
Messages : 948
Inscription : 19 août 2018 05:20

Re: [Calc] rows(r).copy et PasteSpecial - effet inattendu

Message par Dolev »

Re,
Flying_Roger a écrit :Le document était si élémentaire que je ne pensais pas utile de le fournir
Il est sûrement élémentaire pour toi. Mais toi à la place de ceux qui aident.
Flying_Roger a écrit :si je dois remplacer un peu partout deux lignes par tout ce code
Tu fais une fonction comme ça, tu n'auras qu'une seule ligne. :)
Open Office 4.1.15 sous Windows 11
Avatar de l’utilisateur
Flying_Roger
NOOuvel adepte
NOOuvel adepte
Messages : 21
Inscription : 24 juil. 2021 11:28

Re: [Calc] rows(r).copy et PasteSpecial - effet inattendu

Message par Flying_Roger »

Oui, désolé; la prochaine fois, je mettrai le document dans une pièce jointe.
Je pense aussi me faire des subroutines pour les séquences d'actions que je pourrai obtenir par des enregistrements.
Pour le moment, j'ai surtout buté sur la gestion de ces deux mondes parallèles, les objets actifs de l'un ne semblant pas être nécessairement actifs dans l'autre modèle, en particulier les worksheets et les workbooks.
Je suis aussi à la recherche d'une documentation structurée des objets, avec leurs propriétés et leurs méthodes.
Dans VBA, je m'en tirais souvent avec une simple inspection d'objet (shift-F9), mais son équivalent F7 me renvoie surtout des "Out of scope". J'imagine qu'il ne peut traiter que des objets de base et pas ceux qui sont traduits à partir d'un objet VBA.
J'avance bien, mais j'ai certainement encore beaucoup de choses à apprendre ici.
Roger
LibreOffice7.0.6.2 (x64) - OpenOffice 4.1.10 - Windows 10
Avatar de l’utilisateur
Dolev
InconditiOOnnel
InconditiOOnnel
Messages : 948
Inscription : 19 août 2018 05:20

Re: [Calc] rows(r).copy et PasteSpecial - effet inattendu

Message par Dolev »

Je ne code pas avec VBA. Les deux Basic sont incompatibles et donc tenter d'adapter l'un à l'autre est pour moi une voie sans issue.

Exemple en Open Basic pur avec une copie des valeurs de la feuille 2 vers la feuille même plage :

Code : Tout sélectionner

sub Main
	Plage = "A1:AMJ5"
	
	Feuilles = ThisComponent.Sheets
	Feuille1 = Feuilles.getByName("Feuille1")
	Feuille2 = Feuilles.getByName("Feuille2")
	Copie = Feuille2.getCellRangeByName(Plage)
	Colle = Feuille1.getCellRangeByName(Plage)
	Colle.DataArray = Copie.DataArray
end sub
Open Office 4.1.15 sous Windows 11
Avatar de l’utilisateur
Flying_Roger
NOOuvel adepte
NOOuvel adepte
Messages : 21
Inscription : 24 juil. 2021 11:28

Re: [Calc] rows(r).copy et PasteSpecial - effet inattendu

Message par Flying_Roger »

Je comprends.
Où trouver la référence avec le modèle d'objets, propriétés et méthodes du Basic de Calc?
Roger
LibreOffice7.0.6.2 (x64) - OpenOffice 4.1.10 - Windows 10
Avatar de l’utilisateur
Flying_Roger
NOOuvel adepte
NOOuvel adepte
Messages : 21
Inscription : 24 juil. 2021 11:28

Re: [Calc] rows(r).copy et PasteSpecial - effet inattendu

Message par Flying_Roger »

Je réponds moi-même à ma question.
J'ai trouvé mon bonheur dans un document assez ancien (2012), mais qui est une bonne introduction au modèle OO basic.

https://berma.pagesperso-orange.fr/File ... _intro.pdf

Une question qui reste ouverte, c'est que ce que j'ai observé avec le copy et pastespecial ressemble fort à un bug.
Apparemment, ce forum n'est pas le bon endroit pour signaler des bugs; où faut-il le faire?
Roger
LibreOffice7.0.6.2 (x64) - OpenOffice 4.1.10 - Windows 10
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 9252
Inscription : 28 août 2010 08:45

Re: [Calc] rows(r).copy et PasteSpecial - effet inattendu

Message par micmac »

Touche Ctrl de Windows = touche cmd⌘ sur Mac
Outils > Options sur Windows = OpenOffice > Préférences sur Mac
Avatar de l’utilisateur
Flying_Roger
NOOuvel adepte
NOOuvel adepte
Messages : 21
Inscription : 24 juil. 2021 11:28

Re: [Calc] rows(r).copy et PasteSpecial - effet inattendu

Message par Flying_Roger »

Merci.
Roger
LibreOffice7.0.6.2 (x64) - OpenOffice 4.1.10 - Windows 10
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 9252
Inscription : 28 août 2010 08:45

Re: [Résolu][Calc] rows(r).copy et PasteSpecial - effet inat

Message par micmac »

1- Si vous ouvrez une issue, il faudra revenir baliser le sujet en Issue plutôt qu'en Résolu.

Pour ce faire il faut éditer le titre de votre premier message en ajoutant manuellement au début du titre du premier message la balise [Issue]et cocher l'icône Image (Comment faire). Si nécessaire, adapter la longueur du titre à 60 caractères maximum, balises comprises.

2- Ensuite donner le lien vers le rapport dans un dernier message.
Touche Ctrl de Windows = touche cmd⌘ sur Mac
Outils > Options sur Windows = OpenOffice > Préférences sur Mac
Avatar de l’utilisateur
Dolev
InconditiOOnnel
InconditiOOnnel
Messages : 948
Inscription : 19 août 2018 05:20

Re: [Résolu][Calc] Effet inattendu sur copier / collage spéc

Message par Dolev »

Re,
Flying_Roger a écrit :Une question qui reste ouverte, c'est que ce que j'ai observé avec le copy et pastespecial ressemble fort à un bogue.
Le code que je t'ai fourni est fonctionnel sous OpenOffice.
En quoi y vois-tu un bogue ? :shock:
Merci de joindre un document reproduisant cela.
Open Office 4.1.15 sous Windows 11
Avatar de l’utilisateur
Flying_Roger
NOOuvel adepte
NOOuvel adepte
Messages : 21
Inscription : 24 juil. 2021 11:28

Re: [Résolu][Calc] Effet inattendu sur copier / collage spéc

Message par Flying_Roger »

@Dolev: Je n'ai pas parlé de bogue dans ton code Basic: c'est dans la traduction du VBA qu'il y en a un: l'action .copy ne s'applique pas à l'objet auquel elle est attachée mais bien à la dernière sélection effectuée avant cette action.

Ci-joint le document ODS qui le démontre.
Le test montre aussi aux utilisateurs comment s'en sortir tout en conservant du code fonctionnel aussi bien en OO que dans MS-Excel VBA.

Mais si la philOOsophie est qu'il n'y a pas de bogue du moment qu'il existe une autre façon de coder qui ne l'active pas, alors on dira effectivement qu'il n'y a pas de bogue et que le problème est résolu. Au boulot, nous appelions plutôt cela un "workaround" (contournement du problème). Simple question de point de vue.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Roger
LibreOffice7.0.6.2 (x64) - OpenOffice 4.1.10 - Windows 10
Avatar de l’utilisateur
Dolev
InconditiOOnnel
InconditiOOnnel
Messages : 948
Inscription : 19 août 2018 05:20

Re: [Résolu][Calc] Effet inattendu sur copier / collage spéc

Message par Dolev »

J'ai testé ton document et ne comprends pas ce qu'il y a comme erreur.
La feuille 2 est identique à la feuille 1.
Que faut-il voir comme bogue et fournir (encore) un minimum d'explication ?
Open Office 4.1.15 sous Windows 11
Avatar de l’utilisateur
Flying_Roger
NOOuvel adepte
NOOuvel adepte
Messages : 21
Inscription : 24 juil. 2021 11:28

Re: [Résolu][Calc] Effet inattendu sur copier / collage spéc

Message par Flying_Roger »

Voici les détails:

1. Ouvrir le document
=> La Feuille1 contient le mot "Vide" dans toutes la plage A1:E10
=> La Feuille2 contient "L1 C1", "L1 C2", etc... avec le numéro de la ligne et de la colonne dans toutes la plage A1:E10

2. Dans la feuille1, cliquer sur le bouton "Exécuter la copie"
=> la première boucle (avec .Select avant .Copy) copie bien les lignes 1 à 5 de la Feuille2 dans la Feuille1
=> la deuxième boucle (sans .Select avant .Copy) copie la ligne 5 au lieu de copier les lignes 6 à 10.

Le problème, c'est que le code suivant ne copie rien du tout:

Code : Tout sélectionner

Sheets("Feuille2").Rows(r).Copy
Alors que le code suivant effectue bien la copie de la ligne r:

Code : Tout sélectionner

Sheets("Feuille2").Rows(r).Select
Selection.Copy
Je précise que j'utilise LibreOffice 7.0.6.2 (x64).
Est-ce que tu as testé avec la même version?

Ceci dit, j'ai expérimenté ton code Basic avec des instructions comme celles-ci et cela fonctionne nickel:

Code : Tout sélectionner

	rDoc = oDoc.Sheets.getByName("All NOTAMs").getCellRangeByName("A1:G999")
	rFaa = oFaa.Sheets.getByName("All NOTAMs").getCellRangeByName("A1:G999")
	rDoc.DataArray = rFaa.DataArray
Je vais donc utiliser du code Basic chaque fois que j'aurai un problème avec la traduction automatique du code VBA.
Ce sera plus efficace même si j'ai encore beaucoup à apprendre sur les fonctions du Basic.

Merci pour ton aide !
Roger
LibreOffice7.0.6.2 (x64) - OpenOffice 4.1.10 - Windows 10
Avatar de l’utilisateur
Dolev
InconditiOOnnel
InconditiOOnnel
Messages : 948
Inscription : 19 août 2018 05:20

Re: [Résolu][Calc] Effet inattendu sur copier / collage spéc

Message par Dolev »

Flying_Roger a écrit :Est-ce que tu as testé avec la même version?
Non, j'utilise OpenOffice que je trouve plus stable .
Preuve en est : je n'ai pas ce comportement. :D
Chez moi, les cellules collées sont identiques... sous OpenOffice.
Open Office 4.1.15 sous Windows 11