[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 !

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

Messagepar NoeDes123 » 08 Juil 2019 21:15


La modération 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   AgrandirRéduire
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é 14 fois
Dernière édition par micmac le 08 Août 2019 09:21, édité 1 fois.
Raison: Balisage + verrouillage
LibreOffice 6.0.4.2 sous Windows 10
NoeDes123
Fraîchement OOthentifié
 
Message(s) : 3
Inscrit le : 08 Juil 2019 21:00

Re: [Calc] Déplacement ligne sous condition

Messagepar micmac » 08 Juil 2019 22:58

Bonjour et bienvenue sur le forum,
Dans votre signature il y a écrit: OpenOffice 2.4sous Windows 10
NoeDes123 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.
Dans votre signature vous devez préciser la ou les versions exactes d'OpenOffice ou de LibreOffice et du ou des systèmes utilisés.
Exemple : AOO 4.1.6 (version imposée selon le cas) sous Win7 SP1, Win 8.1, Win 10, macOS 10.14.5, Ubuntu 18.10...
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
 
Message(s) : 5970
Inscrit le : 28 Août 2010 09:45

Re: [Calc] Déplacement ligne sous condition

Messagepar Noonours » 09 Juil 2019 01:37

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   AgrandirRéduire
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

N’HÉSITEZ SURTOUT PAS À JOINDRE UN FICHIER

LibO 6.2.4.2 sous Windows 10
LibO 5.0.6.3 (obligation de version) sous Win 7
Avatar de l’utilisateur
Noonours
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 298
Inscrit le : 11 Mai 2013 01:11
Localisation : Aix en Provence

Re: [Calc] Déplacement ligne sous condition

Messagepar NoeDes123 » 11 Juil 2019 20:10

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   AgrandirRéduire
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   AgrandirRéduire
For i = 200 to 1 Step -1


Encore merci pour votre aide.
LibreOffice 6.0.4.2 sous Windows 10
NoeDes123
Fraîchement OOthentifié
 
Message(s) : 3
Inscrit le : 08 Juil 2019 21:00

Re: [Calc] Déplacement ligne sous condition

Messagepar Noonours » 12 Juil 2019 16:19

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   AgrandirRéduire
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

N’HÉSITEZ SURTOUT PAS À JOINDRE UN FICHIER

LibO 6.2.4.2 sous Windows 10
LibO 5.0.6.3 (obligation de version) sous Win 7
Avatar de l’utilisateur
Noonours
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 298
Inscrit le : 11 Mai 2013 01:11
Localisation : Aix en Provence

Re: [Calc] Déplacement ligne sous condition

Messagepar OOotremer971 » 13 Juil 2019 02:45

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   AgrandirRéduire
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   AgrandirRéduire
zonesVides(Ubound(zonesVides)).StartRow - 1


A+
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Ubuntu
OpenSuse Leap
Avatar de l’utilisateur
OOotremer971
HédOOniste
HédOOniste
 
Message(s) : 2011
Inscrit le : 16 Avr 2010 14:31

Re: [Calc] Déplacement ligne sous condition

Messagepar NoeDes123 » 17 Juil 2019 20:30

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é 7 fois
LibreOffice 6.0.4.2 sous Windows 10
NoeDes123
Fraîchement OOthentifié
 
Message(s) : 3
Inscrit le : 08 Juil 2019 21:00

Re: [Calc] Déplacement ligne sous condition

Messagepar Noonours » 18 Juil 2019 00:10

Bonjour;

Le code corrigé:
Code : Tout sélectionner   AgrandirRéduire
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

N’HÉSITEZ SURTOUT PAS À JOINDRE UN FICHIER

LibO 6.2.4.2 sous Windows 10
LibO 5.0.6.3 (obligation de version) sous Win 7
Avatar de l’utilisateur
Noonours
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 298
Inscrit le : 11 Mai 2013 01:11
Localisation : Aix en Provence

Re: [Calc] Déplacement ligne sous condition

Messagepar micmac » 08 Août 2019 09:20

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,
Dans votre signature vous devez préciser la ou les versions exactes d'OpenOffice ou de LibreOffice et du ou des systèmes utilisés.
Exemple : AOO 4.1.6 (version imposée selon le cas) sous Win7 SP1, Win 8.1, Win 10, macOS 10.14.5, Ubuntu 18.10...
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
 
Message(s) : 5970
Inscrit le : 28 Août 2010 09:45


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Google [Bot] et 2 invité(s)