[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 : 485
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 : 485
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 14102 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 : 485
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 21114 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 : 485
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 20204 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 : 485
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.

Attention contrairement à la propriété Data(Array), 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 15781 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 15781 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 3 invités