[API] Tout sur la variable tableau / table mémoire (array)

Quoi ? Vous ne connaissez pas cette suite bureautique libre et gratuite. Elle vous permet de faire ce que vous faîtes avec MS-Office sans avoir à pirater.
Bidouille
Webmestre
Messages : 478
Enregistré le : 21 mai 2007 16:08

Recherche d'occurrence

Messagepar Bidouille » 19 juil. 2016 15:40

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

Bidouille
Webmestre
Messages : 478
Enregistré le : 21 mai 2007 16:08

Scission de chaîne

Messagepar Bidouille » 26 mars 2020 07:16

Scinder une chaîne (type CSV) dont chaque champ est séparé par des points-vigules (ou un autre séparateur si besoin).

capture.jpg
capture.jpg (14.31 Kio) Vu 221 fois


Code : Tout sélectionner

   sSep = ";"
   
   oDoc = ThisComponent
   oFeuil = oDoc.Sheets.getByName("Test")
   oPlage = oFeuil.getCellRangeByName("A1:A2")
   oTab = oPlage.DataArray
   maxLig = UBound(oTab)
   
   for i=0 to maxLig
      sLigne = oTab(i)(0)
      aChamp = Split(sLigne, sSep)
      oTab(i) = aChamp      
   next
   maxCol = UBound(oTab(0))

   oDest = oFeuil.getCellRangeByName("C1") 'départ de la scission
   'calculons la plage qu'il faut
   nCol = oDest.CellAddress.Column
   nLig = oDest.CellAddress.Row
   oPlage = oFeuil.getCellRangeByPosition(nCol,nlig,nCol+maxCol,nLig+maxLig)
   oPlage.DataArray = oTab

Bidouille
Webmestre
Messages : 478
Enregistré le : 21 mai 2007 16:08

Elimination des lignes vides

Messagepar Bidouille » 27 oct. 2021 13:53

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 7233 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

Bidouille
Webmestre
Messages : 478
Enregistré le : 21 mai 2007 16:08

Elimination de cellules vides à gauche

Messagepar Bidouille » 17 janv. 2022 06:28

Autre cas de figure, on veut conserver les cellules remplies en les ramenant à gauche :
capture.png
capture.png (58.76 Kio) Vu 6323 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

Bidouille
Webmestre
Messages : 478
Enregistré le : 21 mai 2007 16:08

Récupération via une fonction

Messagepar Bidouille » 01 sept. 2022 08:42

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 1900 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 1900 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


Retourner vers « OpenOffice »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité