[Résolu][Calc] Copier Coller avec Insertion de Ligne
Modérateur : Vilains modOOs
Règles du forum
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 !
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 !
- OOotremer971
- ManitOOu
- Messages : 2744
- Inscription : 16 avr. 2010 15:31
[Résolu][Calc] Copier Coller avec Insertion de Ligne
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.
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
AOO
LibreOffice
Debian 10 et 11
- luky-luke
- InconditiOOnnel
- Messages : 936
- Inscription : 27 nov. 2010 01:17
- Localisation : gâtine deux-sèvrienne
Re: [Calc] Vider le presse papier
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.
Cordialement
Luke
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
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
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
Re: [Calc] Vider le presse papier
Bonjour à tous,
Macro impeccable, luky-luke
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 ?
Macro impeccable, luky-luke
Étant vacciné, je ne crains rien Comme tu utilises l'enregistreur de macros, je comprends tout de même ton souci.[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.
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 !
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 !
- Grenouille
- ManitOOu
- Messages : 3223
- Inscription : 13 janv. 2006 17:21
- Localisation : Chasseneuil-du-Poitou / Futuroscope
Re: [Calc] Vider le presse papier
Bonjour,
Je dirai que la question est déjà passée : http://user.services.openoffice.org/fr/ ... sse+papier
A+
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
- OOotremer971
- ManitOOu
- Messages : 2744
- Inscription : 16 avr. 2010 15:31
Re: [Calc] Vider le presse papier
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()"
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
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.
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)
Je modifie mon titre de sujet.
Merci
Oui justement d'où mon étonnement.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 ?
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
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
AOO
LibreOffice
Debian 10 et 11
Re: [Résolu][Calc]Copier Coller avec Insertion de Ligne
Bonsoir,
Bizarre, chez moi, ta macro fonctionne correctement (6 exécutions consécutives...)
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 !
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 !
- OOotremer971
- ManitOOu
- Messages : 2744
- Inscription : 16 avr. 2010 15:31
Re: [Résolu][Calc]Copier Coller avec Insertion de Ligne
Bonjour/nuit ?
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 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.
tel que
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 :
Je posterai le fichier lorsqu'il sera finalisé.
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 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
Code : Tout sélectionner
.Rows.insertByIndex() .getCellRangeByName() .ActiveSheet = .clearContents()
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
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
AOO
LibreOffice
Debian 10 et 11
Re: [Résolu][Calc]Copier Coller avec Insertion de Ligne
Bonjour,
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)
Dans un premier temps, consulte la référence; l'index te permettra de trouver les autres propriétés/méthodesOOotremer971 a écrit :j'aimerais bien savoir où trouver une liste de ces expressions
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 !
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 !
- OOotremer971
- ManitOOu
- Messages : 2744
- Inscription : 16 avr. 2010 15:31
Re: [Résolu][Calc]Copier Coller avec Insertion de Ligne
Bonjour,
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. Et comme promis plus haut le fichier dans lequel elle est exploitée
En effet, y a vraiment de quoi boire la tasse pour un débutant.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
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. Et comme promis plus haut le fichier dans lequel elle est exploitée
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
AOO
LibreOffice
Debian 10 et 11