[Résolu][Calc] Copier Coller avec Insertion de Ligne

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
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 15:31

[Résolu][Calc] Copier Coller avec Insertion de Ligne

Message par OOotremer971 »

Bonjour à tous,

N'étant pas encore capable d'écrire une macro simple, j'ai utilisé l'enregistreur de macro pour automatiser une succession de tâches simples.

1) Copie du contenu des cellules A1:N1 de la Feuille1
2) Aller en Feuille2
3) Insérer une ligne en A1 de la feuille2
4) Coller le contenu du presse papier dans la nouvelle ligne fraîchement crée
5) retour en Feuille1
6) Effacement du contenu de la zone A1:N1 de la feuille1
Fin de la macro.

La zone A1:N1 récupère des informations saisies dans des contrôles de formulaire par la fonctionnalité "Cellule liée" du contrôle. Lorsque j'efface le contenu de la ligne A1:N1 le formulaire se vide aussi, prêt à recevoir de nouvelles données.
Jusque là tout va bien c'est le comportement attendu.

Lorsque mon formulaire est rempli, je lance la macro, qui s'exécute correctement pendant approximativement trois cycles consécutifs, puis subitement, sans raison apparente, ne colle plus les dernières données saisies, mais uniquement les précédentes et ce à chaque lancement de la macro quelque soit ce qui a été saisi.

Je pense donc que si je parviens à vider le presse papier, soit la macro me collera rien (et ce n'est pas le comportement attendu) ou peut-être par chance, le contenu de la ligne fraîchement copiée.

Je m’abstiens de fournir la macro pour éviter aux puristes d'attraper des boutons, sauf si besoin.

Merci.
Dernière modification par OOotremer971 le 23 juin 2012 18:35, modifié 1 fois.
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 01:17
Localisation : gâtine deux-sèvrienne

Re: [Calc] Vider le presse papier

Message par luky-luke »

Bonjour OOotremer971

Les seules réponses que je trouve à propos du presse papier, c'est que c'est du ressort du systéme d'exploitation sous windows, ou du bureau sous Gnu Linux (Gnome, Kde...).
Donc à défaut de répondre directement à ta question, un code simple qui éxecute la routine telle que tu la décris.

Code : Tout sélectionner

option Explicit
Sub Main
Dim Feuille1 As Object, Feuille2 As Object
Dim MaZone As Object, MaCopie As Object

Feuille1 = ThisComponent.sheets.getByName("Feuille1")
Feuille2 = ThisComponent.sheets.getByName("Feuille2")
MaZone = Feuille1.GetCellRangeByPosition(0,0,13,0)'"A1:N1"Feuille1
Feuille2.Rows.insertByIndex(0,1)' o pour la position, 1 pour le nombre de ligne
MaCopie = Feuille2.GetCellByPosition(0,0)'A1 en feuille2
Feuille2.copyRange(MaCopie.CellAddress,MaZone.RangeAddress)'la copie
'ThisComponent.CurrentController().ActiveSheet = Feuille1 'Retour en feuille1 facultatif
MaZone.clearContents(1)' changer le chiffre entre parenthèse suivant ce que l'on veut éffacer

End Sub
Cordialement
Luke
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
Avatar de l’utilisateur
alhazred
ManitOOu
ManitOOu
Messages : 3028
Inscription : 01 mai 2011 01:08
Localisation : Casablanca (Maroc)

Re: [Calc] Vider le presse papier

Message par alhazred »

Bonjour à tous,

Macro impeccable, luky-luke 8)
[b][color=#FFBF00]OOotremer971[/color][/b] a écrit :Je m’abstiens de fournir la macro pour éviter aux puristes d'attraper des boutons, sauf si besoin.
Étant vacciné, je ne crains rien :lol: Comme tu utilises l'enregistreur de macros, je comprends tout de même ton souci.
Le comportement que tu signales me suggère seulement cette question: au début de la macro, y a-t-il toujours sélection de la zone A1:N1 de la 1ère feuille ?
À bientôt

LibO 4.1.5.3 et AOO 4.0.1 sous Windows 7, MRI et SDK pour les macros.

Et la sauvegarde incrémentée, c'est sympa !
Avatar de l’utilisateur
Grenouille
ManitOOu
ManitOOu
Messages : 3223
Inscription : 13 janv. 2006 17:21
Localisation : Chasseneuil-du-Poitou / Futuroscope

Re: [Calc] Vider le presse papier

Message par Grenouille »

Bonjour,

Je dirai que la question est déjà passée : http://user.services.openoffice.org/fr/ ... sse+papier

A+
OpenOffice 4.1.5 et LibreOffice 5.3.4 (par obligation) sous Windows 7
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 15:31

Re: [Calc] Vider le presse papier

Message par OOotremer971 »

Re,

Alors tout simplement génial...je n’espérais pas moins à vrai dire. Et tout simplement merci beaucoup.
Ça fait longtemps que je me demande pourquoi Calc n'est pas doter d'une fonction "COPIER.LA.CELLULE.VERS()"

Code : Tout sélectionner

=COPIER.LA.CELLULE.VERS.AVEC.INSERTION.DE.LIGNE(Cellule_Source;Cellule_Cible;Type)
où Type déterminerait, à l'instar du collage spéciale, ce qui doit-être collé ou non. Espérons pour une future version.

Je modifie mon titre de sujet.

Merci
alhazred a écrit :au début de la macro, y a-t-il toujours sélection de la zone A1:N1 de la 1ère feuille ?
Oui justement d'où mon étonnement.

Code : Tout sélectionner

sub EnregistreFormulaire

dim document   as object
dim dispatcher as object

document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$A$1:$M$1"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Cut", "", 0, Array())

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

dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args2())
dispatcher.executeDispatch(document, ".uno:InsertRows", "", 0, Array())

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

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())

dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Nr"
args4(0).Value = 1
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args4())

dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "ToPoint"
args5(0).Value = "$A$1:$M$1"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args5())
dispatcher.executeDispatch(document, ".uno:ClearContents", "", 0, Array())

End Sub
Je n'ai pas enregistré une seule macro mais une succession de taĉhes que j'ai regroupé ensuite car j'ai eu l'impression que certaines instructions passaient à la trappe.
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
Avatar de l’utilisateur
alhazred
ManitOOu
ManitOOu
Messages : 3028
Inscription : 01 mai 2011 01:08
Localisation : Casablanca (Maroc)

Re: [Résolu][Calc]Copier Coller avec Insertion de Ligne

Message par alhazred »

Bonsoir,

Bizarre, chez moi, ta macro fonctionne correctement (6 exécutions consécutives...)
À bientôt

LibO 4.1.5.3 et AOO 4.0.1 sous Windows 7, MRI et SDK pour les macros.

Et la sauvegarde incrémentée, c'est sympa !
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 15:31

Re: [Résolu][Calc]Copier Coller avec Insertion de Ligne

Message par OOotremer971 »

Bonjour/nuit ?
alhazred a écrit :Bizarre, chez moi, ta macro fonctionne correctement (6 exécutions consécutives...)

Comportement peut-être lié à l'OS ??? chez moi elle fonctionne aussi mais manifestement à un moment que je ne parviens pas à déterminer, il semblerait que le contenu du presse papier n'est pas écrasé.

La proposition faite par Luky-Luke fonctionne très bien chez moi. Cependant j'ai dû la modifier :oops: car parmi les valeurs copiées, se trouvaient des fonctions telles que AUJOURDHUI() et MAINTENANT(). Leur objectif est d'horodater les saisies effectuées dans un formulaire afin d'éviter les tricheries, or après collage, se sont les formules qui sont collées et non les valeurs obtenues par ces formules, et de fait l’horodatage devenait inefficace.

En glanant un peu ici et là dans différentes bibles j'ai trouvé une (j'ignore le vocabulaire à utiliser) "instruction" qui commence par un point dont la fonctionnalité est de copier des valeurs générées par une formule sans copier la formule dont elles sont issues.

Code : Tout sélectionner

.DataArray
tel que

Code : Tout sélectionner

.Rows.insertByIndex()    .getCellRangeByName()    .ActiveSheet =    .clearContents()
dont on comprends facilement le sens quand on sait qu'elles existes. Et j'aimerais bien savoir où trouver une liste de ces expressions car en lisant la macro de luky-luke j'ai tout de suite compris son fonctionnement alors qu'une demie heure avant j'étais incapable de faire un copier coller.

Bon assez palabré , voici la macro modifiée à la sauce OOotremer971 espérant qu'elle soit utile à d'autres :

Code : Tout sélectionner

REM  *****  BASIC  *****
'************************************************************************************************************************
'                                                                                                                       *
'                           ***Cette macro a pour objectif d'exécuter les tâches suivantes:***                          *
'                                                                                                                       * 
'1) inserer une ligne vide au début d'une feuille                                                                      **
'2) définir une zone source (sur une autre feuille) à partir de laquelle des valeurs seront copiées                    **
'3) définir une zone cible (impérativement de même grandeur) dans la nouvelle ligne précédemment insérée               **
'4) attribuer à la zone cible les valeur de la zone source sans insérer les formules dont ces valeurs sont le résultat **
'5) afficher la première feuille                                                                                       **                                                  *
'6) effacer le contenu de la zone source à l'exception des formules                                                    **
'                                                                                                                      **                                                                                                                      **
'L'objetif final étant d'insérer, dans une feuille de stockage, des valeurs recueillies par un formulaire de saisie     *
'dans l'attente de traitements                                                                                          *
'                                                                                                                       *
'************************************************************************************************************************

Sub InsertLigne_CopieColle_EffaceData_SaufFormules
Dim _Feuille_s As Object, _ZoneSource As Object, _ZoneCible As Object
_Feuille_s = ThisComponent.Sheets
_Feuille_s(3).Rows.insertByIndex(0,1)'1)
_ZoneSource = _Feuille_s(0).getCellRangeByName("A1:N1")'2)
_ZoneCible = _Feuille_s(3).getCellRangeByName("A1:N1")'3)
_ZoneCible.DataArray = _ZoneSource.DataArray'4)
ThisComponent.CurrentController().ActiveSheet = _Feuille_s(0)'5)
_ZoneSource.clearContents(1+4)'6) (1 efface les valeurs numériques, 4 les valeurs texte) les formules ne sont pas effacées
End Sub   
Je posterai le fichier lorsqu'il sera finalisé.
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
Avatar de l’utilisateur
alhazred
ManitOOu
ManitOOu
Messages : 3028
Inscription : 01 mai 2011 01:08
Localisation : Casablanca (Maroc)

Re: [Résolu][Calc]Copier Coller avec Insertion de Ligne

Message par alhazred »

Bonjour,
OOotremer971 a écrit :j'aimerais bien savoir où trouver une liste de ces expressions
Dans un premier temps, consulte la référence; l'index te permettra de trouver les autres propriétés/méthodes

Mais après, si tu comptes continuer dans les macros, il faudra installer le SDK (en fait une version sur le disque dur du précédent) ainsi qu'un explorateur d'objets, MRI ou XRay (voir ma signature)
À bientôt

LibO 4.1.5.3 et AOO 4.0.1 sous Windows 7, MRI et SDK pour les macros.

Et la sauvegarde incrémentée, c'est sympa !
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 15:31

Re: [Résolu][Calc]Copier Coller avec Insertion de Ligne

Message par OOotremer971 »

Bonjour,
alhazred a écrit :Dans un premier temps, consulte la référence; l'index te permettra de trouver les autres propriétés/méthodes
En effet, y a vraiment de quoi boire la tasse pour un débutant.

Merci pour cette piste je vais regarder ça de plus près.

Bonne fin de dimanche à tous.

Un aperçu du fichier pour lequel j'avais besoin de cette macro.
Formulaire.png
Compte_Rendu.png
Et comme promis plus haut le fichier dans lequel elle est exploitée
Formulaire_De_Saisie+Affichage_ Hebdo_et_Quotidien.ods
(30.12 Kio) Téléchargé 394 fois
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
Répondre