[Résolu][Calc] Sélect/coller ligne en fonction d'1 cellule

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 !
Solaris
Membre hOOnoraire
Membre hOOnoraire
Messages : 146
Inscription : 02 août 2017 21:55

[Résolu][Calc] Sélect/coller ligne en fonction d'1 cellule

Message par Solaris »

Bonjour,

Je me permets de revenir vers vous car je souhaiterais pouvoir sélectionner une ligne, la copier et la coller dans ma ligne 2 de ma feuille "formulaire".

Concrètement, je me sers de Calc comme d'une base de données (je ne me sers pas de Base car j'ai beaucoup de calculs).
Je fais de la saisie de mes dossiers dans la feuille "Formulaire" et cela remplie ma feuille "champs". Ma feuille "champs" sert de source pour la rédaction de mes documents sous Writer.
Ma saisie de dossiers se fait en principe en 2 temps. Les premiers éléments à l'ouverture de mon dossier puis je complète à réception des éléments qui me manquaient.
Chacun de mes dossiers a un numéro unique (la colonne B2 de la feuille Champs).
Du coup, je voudrais pouvoir en rentrant ce numéro dans le champs "Numéro RG" de Formulaire qui est lié à la cellule B2 de champs coller la ligne correspondant à ce dossier et la coller sur la ligne 2.

Par exemple, sur mon fichier, je voudrais qu'en tapant "3" dans champs "Numéro RG", cela déclenche un copier-couper-coller de la ligne 4 en ligne 2 (j'ai déjà une macro qui fait un copier-coller de la dernière ligne).

Code : Tout sélectionner

    Sub DeplacerDerLigneBaux()
    Dim monDocument As Object, maFeuille As Object, maZone As Object
    Dim destination As Object, zoneAcopier As Object, lesLignes As Object
    Dim zonesVides As Variant
    Dim derLigne As Long
    monDocument = Thiscomponent
    maFeuille = monDocument.sheets.getByName("Champs")
    maZone = maFeuille.Columns.GetByName("A")
    zonesVides = maZone.queryEmptyCells.RangeAddresses
    derLigne = zonesVides(UBound(zonesVides)).StartRow - 1
    zoneAcopier = maFeuille.GetCellRangeByPosition(0,derLigne,902,derLigne)
    destination = maFeuille.GetCellByPosition(0,1)
    maFeuille.copyRange(destination.CellAddress, zoneAcopier.RangeAddress)
    lesLignes = maFeuille.Rows
    lesLignes.RemoveByIndex(derLigne,1)
    monDocument.CalculateAll
    End Sub
Cela peut écraser la ligne 2 car j'ai déjà une macro pour copier- coller la ligne 2 en ligne 3.

Code : Tout sélectionner

Sub CopieGomme
Dim Champs As Object, Calculs As Object
Dim MaZone As Object, MaCopie As Object, Gomme As Long

   Champs = ThisComponent.sheets.getByName("Champs") 'Désignation de la feuille Champs
   Champs.Rows.insertByIndex(2,1)'1) 'Insertion ligne
   MaZone = Champs.getCellRangeByName("A2:AHR2") 'la zone à copier
   MaCopie = Champs.getCellRangeByName("A3") 'la destination de la copie
   Champs.copyRange(MaCopie.CellAddress, MaZone.RangeAddress ' la copie
   MaCopie.cellbackcolor = -1 'la couleur d'arrière plan 
     
End Sub
Mon principal problème est donc de savoir comment sélectionner la bonne ligne à copier.

Je vous remercie pour votre aide.

Bonne journée à tous

Solaris
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Solaris le 28 mai 2020 20:21, modifié 1 fois.
Libre office 7.3.2.2
Windows 11
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25175
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Sélectionner/coller une ligne en fonction d'1 cel

Message par Dude »

Salut,
Solaris a écrit :Mon principal problème est donc de savoir comment sélectionner la bonne ligne à copier.
C'est à dire ?
Solaris a écrit :Par exemple, sur mon fichier, je voudrais qu'en tapant "3" dans champs "Numéro RG", cela déclenche un copier-couper-coller de la ligne 4 en ligne 2
C'est une règle logique ?
Sûrement très clair pour toi mais complètement incompréhensible pour nous.
Solaris
Membre hOOnoraire
Membre hOOnoraire
Messages : 146
Inscription : 02 août 2017 21:55

Re: [Calc] Sélectionner/coller une ligne en fonction d'1 cel

Message par Solaris »

Bonsoir,

Chaque dossier a un numéro unique qui se trouve dans la colonne B.
Je voudrais pouvoir saisir le numéro d'un dossier dans une cellule (B2 ou autre). De cette saisie, je veux rechercher quelle est la ligne (à partir de la troisième) qui a dans sa case Bx le résultat identique à B2 (ou autre) afin de copier cette ligne.
Ensuite je collerai cette ligne sur ma ligne 2.

En résumé, cela me permet de rechercher un dossier rapidement et de le mettre dans la ligne 2. La ligne 2 remplit les champs de la feuille formulaire et je complète juste ce qui me manque.
Cela me permettrait d'avoir les mêmes effets qu'un lien entre 2 champs sur base.

Actuellement, alors que je saisis mes données dans la feuille formulaire, je dois aller sur la feuille champs, puis je clique sur la jumelle pour rechercher mon numéro de dossier, je copie/coupe la ligne qui correspond et je la colle en ligne 2 et je reviens sur ma feuille Formulaire pour compléter ma saisie de données. C'est long et fastidieux car répétitif pour chaque dossier. Je voudrais pouvoir me contenter de le faire avec un macro (je rentre le numéro de dossier voulu dans une cellule (ou un champs) et je clique sur un bouton => cela recherche la cellule de la colonne B qui correspond à ma recherche, puis cela sélectionne la ligne de la cellule identifiée (des colonnes A à AHQ), puis copier/couper et enfin coller en ligne 2.

Je suis désolée si je ne suis pas claire mais est ce plus compréhensible ?

Bien cordialement
Libre office 7.3.2.2
Windows 11
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 13:31

Re: [Calc] Sélectionner/coller une ligne en fonction d'1 cel

Message par OOotremer971 »

Bonjour,

Il faut revoir le principe car en agissant ainsi, tu vas tout simplement supprimer tout tes dossiers les uns après les autres. A moins que ce soit le but recherché ?

Nous somme d'accord que si l'on coupe le contenu d'une ligne pour le coller en ligne 2 , le prochain coup, le contenu de la ligne 2 sera écrasé par un nouveau couper/coller ?

A+
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
Solaris
Membre hOOnoraire
Membre hOOnoraire
Messages : 146
Inscription : 02 août 2017 21:55

Re: [Calc] Sélectionner/coller une ligne en fonction d'1 cel

Message par Solaris »

Bonjour,

Ce n'est pas un souci de couper car j'ai déjà un bouton avec une macro qui me permet de copier la ligne 2 puis d'inserer une ligne en ligne 3 et enfin coller la ligne 2 en ligne 3 une fois que j'ai fini mes modifs. Ainsi, le dossier modifié est "sauvegardé". C' est le second code que j'ai mis dans mon premier message.

Bien cordialement
Libre office 7.3.2.2
Windows 11
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 13:31

Re: [Calc] Sélectionner/coller une ligne en fonction d'1 cel

Message par OOotremer971 »

Bonjour,

Je résume :

1) on recherche dans la colonne B de la feuille Champs à partir de la ligne 3 la valeur affichée dans la cellule B2 de cette même feuille.
2) lorsque la valeur est trouvée, on coupe tout le contenu de la ligne jusqu'à la colonne AHR, et on colle en ligne 2

Question 1 : que faut-il faire de la ligne vide qui contenait les valeurs coupées ?
Question 2 : la ligne 2 contient actuellement de nombreuses cellules formatées manuellement (pas de style personnalisé, pas de formatage conditionnel) avec une hauteur de ligne de 1.99 cm.
Que doit-il advenir de ce formatage lors du collage de la ligne coupée ?
Question 3 : les cellules à copier contiennent-elles des formules ?

Merci de préciser.
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
Solaris
Membre hOOnoraire
Membre hOOnoraire
Messages : 146
Inscription : 02 août 2017 21:55

Re: [Calc] Sélectionner/coller une ligne en fonction d'1 cel

Message par Solaris »

Bonsoir,

Excellent résumé car c'est exactement ça.

Question 1: idéalement la supprimer mais si c'est trop compliqué on peut la laisser vide. Je peux faire du nettoyage rapidement en faisant un tri.

Question 2: les lignes stockées sont le résultat de copier/coller de la ligne 2 puisque cette ligne est ma ligne de saisie des données. Normalement, elle doivent avoir le même formatage sur leur longueur. Mon postulat est erroné ? À défaut c'est le formatage de la ligne 2 qui doit être prépondérant.

Question 3 : certaines oui d'autres non.

Merci bcp
Libre office 7.3.2.2
Windows 11
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 13:31

Re: [Calc] Sélectionner/coller une ligne en fonction d'1 cel

Message par OOotremer971 »

Bonjour,
Solaris a écrit :Normalement, elle doivent avoir le même formatage
Ce n'est pas le cas dans le fichier joint. Du coup ma proposition ne déplace que les valeurs contenues dans les cellules.

A tester :

Code : Tout sélectionner

REM  *****  BASIC  *****
REM Source : https://forum.openoffice.org/fr/forum/viewtopic.php?f=8&t=62463

Option Explicit

Sub Main
Dim oDoc As Object
Dim oSheet As Object
Dim oCol_B As Object
Dim oEmptyCells As Object
Dim oCellCritere As Object
Dim oPlageDestination As Object
Dim oCellCible As Object
Dim oPlageCible As Object
Dim lastRow As Long
Dim x As Long

oDoc = Thiscomponent
oSheet = oDoc.sheets.getByName("Champs")
oCol_B = oSheet.Columns.GetByName("B")

'Recherche de la dernière ligne remplie colonne B
oEmptyCells = oCol_B.queryEmptyCells
lastRow = oEmptyCells.RangeAddresses(Ubound(oEmptyCells.RangeAddresses)).StartRow - 1
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

oCellCritere = oSheet.GetCellRangeByName("B2")
oPlageDestination = oSheet.GetCellRangeByPosition(1,1,902,1)
For x = 2 to lastRow
	oCellCible = oSheet.GetCellByPosition(1,x)
	if oCellCible.String = oCellCritere.String Then
		oPlageCible = oSheet.GetCellRangeByPosition(1,x,902,x)
		oPlageDestination.DataArray = oPlageCible.DataArray
		oSheet.Rows.RemoveByIndex(x,1)
		msgBox "Terminé"
		exit sub
	end if
next
msgBox "Critère non trouvé"
End Sub
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
Solaris
Membre hOOnoraire
Membre hOOnoraire
Messages : 146
Inscription : 02 août 2017 21:55

Re: [Calc] Sélectionner/coller une ligne en fonction d'1 cel

Message par Solaris »

C'est tout simplement parfait ! Je vous remercie beaucoup, quand je lis la macro je comprends ce qui est fait mais je connais pas les actions utilisées.
Encore un grand merci !

Bonne soirée
Libre office 7.3.2.2
Windows 11