Calc – Macros en Basic

  1. Le langage pour macro de Libre Office a une syntaxe bien différente du VBA d'Excel.
    Voici un exemple pour parcourir des cellules

    Sub BouclePlageCellules
    
    'recherche et selection de la cellule vide
    Sheet = ThisComponent.CurrentController.ActiveSheet
    c = Sheet.getCellRangeByName("A:A").queryEmptyCells
    getFirstEmptyRowInColumn = Split(c.RowDescriptions(0)," ")
    oRow = getFirstEmptyRowInColumn(1)
    mycell = Sheet.getCellRangeByName("A" & oRow)
    myView = thisComponent.CurrentController
    myView.Select(mycell)
    'fin de recherche et selection de la cellule vide
    
    'Récupération de son adresse
    oActiveCell = ThisComponent.getCurrentSelection ()
    oConv = ThisComponent.createInstance ("com.sun.star.table.CellAddressConversion")
    oConv.Address = oActiveCell.getCellAddress
    DerCel = oConv.UserInterfaceRepresentation
    'fin de récupération de son adresse
    
    Dim Feuille As Object, PlageCellules As Object
    Dim Plages As Object, oEnum As Object, Cellule As Object
    
    'Retrouve une feuille nommée "Feuil1" dans le classeur
    Feuille = ThisComponent.Sheets.getByName("Feuil1")
    'Définit la plage de cellules sur laquelle on va boucler
    PlageCellules = Feuille.getCellRangeByName("A1:" & DerCel & "")
    Plages = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
    Plages.insertByName("", PlageCellules)
    oEnum = Plages.Cells.CreateEnumeration
    
    'Boucle sur la plage
    While oEnum.hasMoreElements
    'Ne renvoie rien si la cellule est vide
    Cellule = oEnum.NextElement
    if isnumeric(Cellule.Value) then
    Total= Total + Cellule.Value
    End if
    Wend
    'injection de la somme calculée dans la première cellule vide
    Cellule = Feuille.getCellRangeByName("" & DerCel & "")
    Cellule.Value = Total
    End Sub

    En complément d'explication, on utilise l'offset avec cette formule
    car les références des cellules sont en "dur" (ainsi la cellule A1 est identifiée par 0,0). On ne peut donc pas utiliser getCellByPosition(0,0) car cela correspond à A1, getCellByPosition(+1,0) correspond à B1. Il faut donc faire référence à la cellule qui nous intéresse (ici, la première cellule vide dans une colonne)

    Cellule = Feuille.getCellByPosition(Cellule.CellAddress.Column + 1,Cellule.CellAddress.Row - 1)

    .Column + 1 pour aller sur la colonne de gauche
    .Row - 1 pour rester sur la même ligne que la dernière donnée

    Pour le nombre de saisies, on peut mettre un simple compteur dans la boucle
    Compteur = Compteur +1
    et afficher le résultat dans une cellule déterminée par un offset

    Maintenant que l'on a décortiqué l'adresse de la cellule on peut "jouer" avec l'offset

    
    Sub get_range_address
    ' on n oublie pas que A1 c'est colonne 0 ligne 0
    oActiveCell = ThisComponent.getCurrentSelection ()
    
    oConv = ThisComponent.createInstance ("com.sun.star.table.CellRangeAddressConversion")
    oConv.Address = oActiveCell.getRangeAddress
    
    ColHaut = oActiveCell.getRangeAddress.StartColumn
    LigHaut = oActiveCell.getRangeAddress.StartRow
    ColBas = oActiveCell.getRangeAddress.EndColumn
    LigBas = oActiveCell.getRangeAddress.EndRow
    
    MsgBox oConv.UserInterfaceRepresentation
    MsgBox "Colonne Sup : " & ColHaut & " - Ligne Sup : " & LigHaut & " - Colonne Inf : " & ColBas & " - Ligne Inf : " & LigBas
    End Sub

    comment suis-je arrivé à ce résultat ?
    Référence 1 - Trouver la cellule vide
    Référence 2 - Pouvoir récupérer l'adresse de cette cellule
    Référence 3 - Boucler sur une plage de cellules
    Référence 4 - Récupération d'une plage sélectionnée 

    Télécharger le fichier d'exemple - FonctionSurCellules.zip 

Fin