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

Scission de chaîne

Posté : 26 mars 2020 07:16
par Bidouille
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 20744 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

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 27756 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 26846 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 dans Calc

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.

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

Passage de variable : méthode Sub vs Function

Posté : 22 mai 2023 10:45
par Bidouille
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 74 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 74 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 74 fois