[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 : 517
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 : 517
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 36047 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 : 517
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 43059 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 : 517
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 42149 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 : 517
Enregistré le : 21 mai 2007 16:08

Récupération via une fonction dans Calc

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

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

Passage de variable : méthode Sub vs Function

Messagepar Bidouille » 22 mai 2023 10:45

Par fonction
En principe lorsqu'on modifie une variable, il est logique de passer par une fonction.
Mais Basic permet de le faire également par une sous-routine.

Créons d'abord une table mémoire contenant 2 chaînes :

Code : Tout sélectionner

Sub Test()
   aTable = array("Toto", "Tata")
   For Each elem In aTable
      sRet = sRet & elem & " " 'on concatène
   next
   msgbox sRet
End Sub

Le contenu affiché sera bien sûr :
capture1.jpg
capture1.jpg (6.79 Kio) Vu 15377 fois


Si nous voulons ajouter un élément dans notre table, nous pouvons passer par une fonction telle que :

Code : Tout sélectionner

Function fAjouteTable(aEntree, sEntree)
   nTaille = UBound(aEntree)+1
   aSortie = aEntree
   ReDim Preserve aSortie(0 To nTaille)
   aSortie(nTaille) = sEntree
   fAjouteTable = aSortie
End Function

A l'usage dans notre routine de test, nous allons ajouter une nouvelle chaîne (Titi) :

Code : Tout sélectionner

Sub Test()
   aTable = array("Toto", "Tata")
   aTable = fAjouteTable(aTable, "Titi")
   For Each elem In aTable
      sRet = sRet & elem & " "
   next
   msgbox sRet
End Sub

Le contenu affiché sera alors :
capture2.jpg
capture2.jpg (7.13 Kio) Vu 15377 fois


Par routine
Maintenant, on peut également passer par une sous-routine telle que :

Code : Tout sélectionner

Sub sAjouteTable(aEntree, sEntree)
   nTaille = UBound(aEntree)+1
   ReDim Preserve aEntree(0 To nTaille)
   aEntree(nTaille) = sEntree   
End Sub

Faisons un nouvel appel avec cette fois, l'ajout d'une autre chaîne (Tutu) :

Code : Tout sélectionner

Sub Test()   
   aTable = array("Toto", "Tata")
   aTable = fAjouteTable(aTable, "Titi")
   sAjouteTable(aTable, "Tutu")
   For Each elem In aTable
      sRet = sRet & elem & " "
   next
   msgbox sRet
End Sub

Le contenu affiché sera :
capture3.jpg
capture3.jpg (7.74 Kio) Vu 15377 fois


Retourner vers « OpenOffice »

Qui est en ligne

Utilisateurs parcourant ce forum : Majestic-12 [Bot] et 2 invités