Page 2 sur 2

Recherche d'occurrence

Posté : 19 juil. 2016 15:40
par Bidouille
La bibliothèque Tools fournit avec OpenOffice offre la fonction PartStringInArray (incluse dans le module Strings).
Elle permet de vérifier si une occurrence est trouvée dans une variable tableau.

NB : n'oubliez pas de charger la bibliothèque au départ.

Code : Tout sélectionner

Sub Main
   GlobalScope.BasicLibraries.loadLibrary("Tools")
   
   oTab = Array("Ali", "Bob", "Jim", "Joe", _
             "Léa", "Max", "Tom", "Zoé")
   
   PartStringInArray(oTab, "Léa", 1) 'Renvoie 4
   PartStringInArray(oTab, "lea", 0) 'Renvoie -1
   PartStringInArray(oTab, "LEA", 0) 'Renvoie -1
   PartStringInArray(oTab, "J", 1) 'Renvoie 2
   PartStringInArray(oTab, "Jo", 0) 'Renvoie 3
   PartStringInArray(oTab, "jo", 0)  'Renvoie -1
   PartStringInArray(oTab, "o", 1)   'Renvoie 1   
End Sub

Elimination des lignes vides

Posté : 27 oct. 2021 13:53
par Bidouille
Il s'agit de copier une plage de données sans les lignes vides.
Dans cet exemple, on teste si la cellule de la colonne A contient un nom.
On colle le résultat sous la 12e ligne du tableau.
transfert_sans_ligne_vide.png
transfert_sans_ligne_vide.png (12.66 Kio) Vu 5794 fois

Code : Tout sélectionner

   nCol = 0 'Index de la colonne que l'on teste si vide
   nLigne = 12 'N° de ligne où se collera la plage
   
   oDoc = ThisComponent
   oFeuil = oDoc.Sheets(0) ' La 1ere feuille qui est indexée à 0
   oPlage = oFeuil.getCellRangeByName("A1:D11")
   oCopie = oPlage.DataArray
   maxCol = UBound(oCopie(0))
   k = 0
   for i = 0 to UBound(oCopie)
      if oCopie(i)(nCol) <> "" then
         Redim Preserve oColle(0 to k)
         Redim oLigne(0 to maxCol)
         for j = 0 to maxCol
            oLigne(j) = oCopie(i)(j)
         next
         oColle(k) = oLigne
         k = k + 1
      endif   
   next
   
   oPlage = oFeuil.getCellRangeByPosition(0,nLigne,maxCol,nLigne+k-1)
   oPlage.DataArray = oColle

Elimination de cellules vides à gauche

Posté : 17 janv. 2022 06:28
par Bidouille
Autre cas de figure, on veut conserver les cellules remplies en les ramenant à gauche :
capture.png
capture.png (58.76 Kio) Vu 4884 fois

Ce qui nous donne :

Code : Tout sélectionner

   oDoc = ThisComponent
   oFeuil = oDoc.Sheets(0) ' La 1ere feuille qui est indexée à 0
   oPlage = oFeuil.getCellRangeByName("A1:H5")
   oCopie = oPlage.DataArray
   maxLig = UBound(oCopie)
   maxCol = UBound(oCopie(0))
   oColle = oCopie
   for i = 0 to maxLig
      for j = 0 to maxLig
          for k = 0 to maxCol
             if oCopie(j)(k) = "" and k < maxCol then
                oColle(j)(k) = oCopie(j)(k+1)
               oCopie(j)(k+1) = ""
             endif
          next
      next
   next
   
   oPlage = oFeuil.getCellRangeByName("A8:H12")
   oPlage.DataArray = oColle

Récupération via une fonction

Posté : 01 sept. 2022 08:42
par Bidouille
Plutôt que de récupérer une plage de données via la propriété Data ou DataArray, il est également possible de la passer en paramètre d'une fonction.

Le tableau récupéré d'une plage de cellules est sous la forme aPlage(ligne, colonne)
Exemple pour le tableau ci-dessous en A1:C3
Capture1.PNG
Capture1.PNG (2.39 Kio) Vu 461 fois

On récupère les données de la façon suivante :

Code : Tout sélectionner

aPlage(1,1) = "Max"
aPlage(1,2) = 10
aPlage(1,3) = 50000
aPlage(2,1) = "Ali"
etc


Etudions maintenant la création d'une fonction qui ferait le total par nom
Capture2.PNG
Capture2.PNG (7.32 Kio) Vu 461 fois

Code : Tout sélectionner

Function TOTAL_PAR(aPlage, sNom)
   nTotal = 0
   'Récupération et parcours des données de la plage
   For i = LBound(aPlage, 1) To UBound(aPlage, 1)
      if aPlage(i, 1) = sNom then
         nTotal = nTotal + aPlage(i, 2)
      endif
   Next i
   TOTAL_PAR = nTotal
End Function