[Résolu][Calc] Déplacement ligne sous condition

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 !
NoeDes123
Fraîchement OOthentifié
Messages : 6
Inscription : 08 juil. 2019 22:00

[Résolu][Calc] Déplacement ligne sous condition

Message par NoeDes123 »


La modération vous a écrit: Pour la bonne tenue de ce forum, veillez à respecter la syntaxe des balises (première lettre en majuscule puis le reste en minuscules, le tout entre crochets). [Calc] et non [CALC]. Nous avons modifié pour vous.

Bonjour à tous,

Voilà, je suis nouvelle sur le forum et j'aurais besoin d'un petit coup de main pour un fichier utilisé dans le cadre de mon travail.
Excusez-moi d'avance, je suis novice dans le domaine de la programmation de macro.

Je vous explique ce que je cherche à faire sur LibreOffice 6.1 :

si la cellule de la colonne H ("initiales")est non-vide de la feuille "Suivi Frigo", il faudrait déplacer la ligne dans la feuille "aliquot utilises".
Ensuite, il faudrait effacer le contenu de la première feuille ("Suivi Frigo") des colonnesB,C,D,E,G,H car il y a une formule dans la colonne F.

Voici une ébauche (n'étant pas certain du language à utiliser sur LibreOffice : option vbasupport 1?) :


Code : Tout sélectionner

Sub ExporterLignes()

Dim i As Long, Nf As Long
      Nf = .Cells(Rows.Count, 1).End(xlUp).Row 'Dernière ligne

With Sheets("Suivi frigo") 'Feuille Suivi Frigo = base de données
    For i = Nf To 2 Step -1  'Pour chaque ligne en partant de la dernière
            If     .Cells(i, 8)<>"" Then 'Si l'info en colonne 8 n'est pas vide
                .Rows(i).Copy Sheets("Aliquot utilises").Rows(Nf + 1) 'Copier à la suite
                Nf = Nf + 1 'Incrémenter la position de la dernière ligne
                .Cells(i, 2).Delete 'Supprimer cellule colonne 2
                .Cells(i, 3).Delete 'Supprimer cellule colonne 3
                .Cells(i, 4).Delete 'Supprimer cellule colonne 4
                .Cells(i, 5).Delete 'Supprimer cellule colonne 4
                .Cells(i, 7).Delete 'Supprimer cellule colonne 4
                .Cells(i, 8).Delete 'Supprimer cellule colonne 4
            End If
    Next i
End With

End Sub
Je vous remercie d'avance pour votre aide!
Pièces jointes
Aliquots calibrateur.ods
(28.32 Kio) Téléchargé 102 fois
Dernière modification par micmac le 08 août 2019 10:21, modifié 1 fois.
Raison : Balisage + verrouillage
LibreOffice 6.0.4.2 sous Windows 10
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 9222
Inscription : 28 août 2010 10:45

Re: [Calc] Déplacement ligne sous condition

Message par micmac »

Bonjour et bienvenue sur le forum,
Dans votre signature il y a écrit : OpenOffice 2.4sous Windows 10
[b][color=#404080]NoeDes123[/color][/b] a écrit :Je vous explique ce que je cherche à faire sur LibreOffice 6.1 :
Vous n'avez pas pu rentrer LIbreOffice lors de votre inscription. C'est normal, notre forum a 15 ans d'âge et à ce moment LibreOffice n'existait pas.
Essayez de nouveau.
Accès direct à votre signature pour la corriger.

Cordialement.
Touche Ctrl de Windows = touche cmd⌘ sur Mac
Outils > Options sur Windows = OpenOffice > Préférences sur Mac
Avatar de l’utilisateur
Noonours
PassiOOnné
PassiOOnné
Messages : 501
Inscription : 11 mai 2013 02:11
Localisation : Aix en Provence

Re: [Calc] Déplacement ligne sous condition

Message par Noonours »

Bonjour

Comme tu l'as remarqué, les deux suites ne sont pas (ou très peu) compatibles.
Même avec la commande "option vbasupport 1" tu n'arriveras pas à tes fins, ceci ne traduit pas automatiquement un langage en un autre.
(Ca serait trop facile :mrgreen: )
Il faut écrire à nouveau un script, cette fois en Basic (langage OpenOffice et LibreOffice).
Ce nouveau script ne pourra pas être interprété par Excel, le passage du fichier d'une suite à l'autre est donc problématique.
Tu pourras lire d'ailleurs sur ce forum que le fait de "jongler" de l'un à l'autre peut causer des dysfonctionnements, voire la perte irrécupérable des données.

Ci-dessous un script commenté, il y a peut-être plus élégant ou plus efficace, je laisserai avec plaisir les as du Basic qui passent par ce forum me reprendre ^^

Code : Tout sélectionner

Sub ExporterLignes()

Dim oDoc As Object, oFeuilSource As Object, oFeuilDest As Object
Dim oZone As Object, oCellCible As Object, aCopier As Object
Dim i As Long, y As Long, DerLigne As Long, Gomme As Long

 oDoc = ThisComponent
 oFeuilSource = oDoc.sheets.getByName("Suivi Frigo") ' La feuille source
 oFeuilDest = oDoc.sheets.getByName("Aliquots utilises") ' La feuille destinataire des données

 oZone = oFeuilSource.Columns(7) 'colonne H, "initiales"
 DerLigne = oZone.queryEmptyCells.RangeAddresses(0).StartRow - 1 ' dernière ligne utilisée dans la colonne H

 Gomme = com.sun.star.sheet.CellFlags.VALUE + com.sun.star.sheet.CellFlags.STRING + com.sun.star.sheet.CellFlags.DATETIME 
 ' l'objet "Gomme" n'effacera que les valeurs, chaines de caractères et dates. Les formules resteront inchangées. 
 
	For i = DerLigne to 1 Step -1
		aCopier = oFeuilSource.getCellRangeByPosition(0,i,10,i).DataArray ' on copie les données de la feuille source
		y = oFeuilDest.Columns(7).queryEmptyCells.RangeAddresses(0).StartRow ' on détermine la 1ere ligne vide de la feuille destination pour y écrire 
		oCellCible = oFeuilDest.getCellRangeByPosition(0,y,10,y)
		oCellCible.setDataArray(aCopier) ' on y colle les données
		oFeuilSource.getCellRangeByPosition(1,i,10,i).ClearContents(Gomme) ' on efface la ligne 
	next i

End Sub
PS: n'oublie pas de tenir compte des remarques de la modération :wink:

COOordialement,
Noonours procrastinateur perfectionniste: "Je fais rien, mais demain je l'ferai mieux"

Pour obtenir la réponse la plus précise possible, VEUILLEZ JOINDRE UN FICHIER

LibO 7.6.5.2 Stable et OpenOffice 4.1.15 sous Windows 10
NoeDes123
Fraîchement OOthentifié
Messages : 6
Inscription : 08 juil. 2019 22:00

Re: [Calc] Déplacement ligne sous condition

Message par NoeDes123 »

Bonsoir à tous!

Voilà, j'ai modifié ma signature car elle n'était pas acceptée lors de mon inscription.
Merci pour vos réponses. Ça me fait plaisir que vous ayez répondu aussi rapidement.

Malheureusement, si seulement la ligne 10 est remplie (par exemple si j'ai uniquement un test anti-hbs), la boucle va aller chercher la première cellule vide qui sera donc la 2eme ligne et arrêtera la boucle.

Au lieu de chercher la première ligne vide, est-il possible de chercher la dernière ligne dont la colonne H est remplie ?
Ensuite, on remonte le document avec la boucle

Code : Tout sélectionner

For i = DerLigne to 1 Step -1
avec une condition : si la cellule de la colonne "H" est remplie, copier la ligne vers la feuille cible ("Aliquot utilises") sinon, ne rien faire.

Sinon, on pourrait utiliser :

Code : Tout sélectionner

For i = 200 to 1 Step -1
Encore merci pour votre aide.
LibreOffice 6.0.4.2 sous Windows 10
Avatar de l’utilisateur
Noonours
PassiOOnné
PassiOOnné
Messages : 501
Inscription : 11 mai 2013 02:11
Localisation : Aix en Provence

Re: [Calc] Déplacement ligne sous condition

Message par Noonours »

Bonjour

Si ton tableau ne dépassera jamais les 200 lignes, tu peux l'écrire en dur dans la boucle For/Next ainsi modifiée:

Code : Tout sélectionner

For i = 200 to 1 Step -1
		if oFeuilSource.getCellByPosition(7,i).String <> "" then 'on teste la présence d'initiales en colonne H
			aCopier = oFeuilSource.getCellRangeByPosition(0,i,10,i).DataArray ' on copie les données de la feuille source
			y = oFeuilDest.Columns(7).queryEmptyCells.RangeAddresses(0).StartRow ' on détermine la 1ere ligne vide de la feuille destination pour y écrire 
			oCellCible = oFeuilDest.getCellRangeByPosition(0,y,10,y)
			oCellCible.setDataArray(aCopier) ' on y colle les données
			oFeuilSource.getCellRangeByPosition(1,i,10,i).ClearContents(Gomme) ' on efface la ligne 
		endif
	next i
Maintenant, si ton fichier est amené à "grossir", il faudra déterminer la dernière ligne avec un objet Curseur et la méthode GotoEndOfUsedArea; je te laisserai consulter les exemples nombreux dans ce forum :wink:

COOordialement,
Noonours procrastinateur perfectionniste: "Je fais rien, mais demain je l'ferai mieux"

Pour obtenir la réponse la plus précise possible, VEUILLEZ JOINDRE UN FICHIER

LibO 7.6.5.2 Stable et OpenOffice 4.1.15 sous Windows 10
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 15:31

Re: [Calc] Déplacement ligne sous condition

Message par OOotremer971 »

Bonjour,
Noonours a écrit :Maintenant, si ton fichier est amené à "grossir", il faudra déterminer la dernière ligne avec un objet Curseur et la méthode GotoEndOfUsedArea
Non ! car si la colonne A contient 2000 valeurs alors que la colonne H n'en contient que 100, la zone à explorer sera alors bien plus grande que celle qui doit-être réellement traitée.

Une colonne peut contenir plusieurs plages de cellules vides. La propriété RangeAddresses (notez es à la fin d'Addresses) de la méthode queryEmptyCells d'une zone, retourne un tableau de toutes les adresses de toutes les plages vides sous forme de structure RangeAddress (notez l’absence de es à la fin d'Address).
Pour trouver la première cellule vide de la dernière plage de cellules vides il faut appeler la dernière structure RangeAddress du tableau et en extraire la propriété StartRow ainsi :

Code : Tout sélectionner

feuilleSuiFrigo = Thiscomponent.Sheets.GetByName("Suivi Frigo")
colonne_H = feuilleSuiFrigo.Columns.GetByName("H")
zonesVides = colonne_H.queryEmptyCells.RangeAddresses
premiereLigneVideDeLaDernierePlageVide = zonesVides(Ubound(zonesVides)).StartRow
Pour obtenir la dernièer ligen utilisée de la colonne qui contient plusieurs plages vides, il faut retirer 1 à zonesVides(Ubound(zonesVides)).StartRow soit

Code : Tout sélectionner

zonesVides(Ubound(zonesVides)).StartRow - 1
A+
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
NoeDes123
Fraîchement OOthentifié
Messages : 6
Inscription : 08 juil. 2019 22:00

Re: [Calc] Déplacement ligne sous condition

Message par NoeDes123 »

Merci à tous pour vos réponses!
On avance!
Dans l'exemple de mon fichier, certaines lignes avec la cellule de la colonne H "vide" ne sont pas copiées (ok jusque là) mais sont effacées de l'onglet suivi frigo...
Apparemment, ces lignes problématiques se situent entre deux lignes remplies.
Deuxième soucis : dans l'onglet de destination, une nouvelle cellule "Anti Hbc" apparaît alors qu'elle ne devrait pas (celulle A2 apparement).
Désolé, j'ai peut-être un peu mélangé les codes avec ceux reçus de OOotremer971

J'ai mis le fichier en attaché.
Pièces jointes
Aliquots calibrateur.ods
(29.58 Kio) Téléchargé 103 fois
LibreOffice 6.0.4.2 sous Windows 10
Avatar de l’utilisateur
Noonours
PassiOOnné
PassiOOnné
Messages : 501
Inscription : 11 mai 2013 02:11
Localisation : Aix en Provence

Re: [Calc] Déplacement ligne sous condition

Message par Noonours »

Bonjour;

Le code corrigé:

Code : Tout sélectionner

Sub ExporterLignes()

Dim oDoc As Object, oFeuilSource As Object, oFeuilDest As Object
Dim oZone As Object, oCellCible As Object, aCopier As Object, feuilleSuiFrigo As Object
Dim i As Long, y As Long, DerLigne As Long, Gomme As Long

oDoc = ThisComponent
feuilleSuiFrigo = oDoc.Sheets.GetByName("Suivi Frigo")
colonne_H = feuilleSuiFrigo.Columns.GetByName("H")
zonesVides = colonne_H.queryEmptyCells.RangeAddresses
oFeuilDest = oDoc.sheets.getByName("Aliquots utilises") ' La feuille destinataire des données
DerLigne =zonesVides(Ubound(zonesVides)).StartRow - 1 ' dernière ligne utilisée dans la colonne H

With com.sun.star.sheet.CellFlags
Gomme = .VALUE + .STRING + .DATETIME
End with
' l'objet "Gomme" n'effacera que les valeurs, chaines de caractères et dates. Les formules resteront inchangées. 

  For i = DerLigne to 1 Step -1
      if FeuilleSuiFrigo.getCellByPosition(7,i).String <> "" then 'on teste la présence d'initiales en colonne H
         aCopier = FeuilleSuiFrigo.getCellRangeByPosition(0,i,10,i).DataArray ' on copie les données de la feuille source
         y = oFeuilDest.Columns(0).queryEmptyCells.RangeAddresses(0).StartRow ' on détermine la 1ere ligne vide de la feuille destination pour y écrire 
         oCellCible = oFeuilDest.getCellRangeByPosition(0,y,10,y)
         oCellCible.setDataArray(aCopier) ' on y colle les données
         FeuilleSuiFrigo.getCellRangeByPosition(1,i,10,i).ClearContents(Gomme) ' on efface la ligne 
      endif
   next i

End Sub
il manquait l'instruction if... qui te permettait de ne pas traiter une ligne sans initiales.

PS: Merci à OOotremer971 d'avoir corrigé mes erreurs dans le post précédent :wink:
Noonours procrastinateur perfectionniste: "Je fais rien, mais demain je l'ferai mieux"

Pour obtenir la réponse la plus précise possible, VEUILLEZ JOINDRE UN FICHIER

LibO 7.6.5.2 Stable et OpenOffice 4.1.15 sous Windows 10
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 9222
Inscription : 28 août 2010 10:45

Re: [Calc] Déplacement ligne sous condition

Message par micmac »

Dernière connexion le : 18 Juil 2019 08:23
Vous avez lu semble t-il les réponses qui vous ont été faites sans y donner de suite.
N'ayant plus de nouvelles, on peut en déduire que le problème est résolu ou ne se reproduit pas.
  1. Merci de baliser par vous-même la prochaine fois.
  2. Un remerciement fait aussi plaisir aux bénévoles qui vous ont consacré de leur temps.
    La politesse fait également partie de la philosophie du logiciel libre.
  3. En cas d'erreur, contactez l'équipe de modération pour la réouverture du fil.
Sujet balisé [Résolu] et verrouillé.

Cordialement,
Touche Ctrl de Windows = touche cmd⌘ sur Mac
Outils > Options sur Windows = OpenOffice > Préférences sur Mac
Répondre