- Le langage pour macro de Libre Office a une syntaxe bien différente du VBA d'Excel.
Voici un exemple pour parcourir des cellulesSub 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éePour 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 offsetMaintenant 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
Fin