torsdag den 13. oktober 2016

Makroer i regneark: Håndtering af områder

I regneark kan celler grupperes i sammenhængende rektangulære områder med SheetCellRange. En enkelt celle understøttes af servicen SheetCell, men en enkelt celle kan også udgøre et SheetCellRange. Gruppering af celler kan vi udføre handlinger på flere celler samlet. Servicen SheetCellRange understøtter mange af de samme egenskaber som SheetCell.

Hver celle i et regneark har en unik adresse, som identificerer cellens placering i regnearket. Tilsvarende har et SheetCellRange også en placering i arket.

For at identificere et SheetCellRange, skal vi kende følgende egenskaber:
  • Sheet: Kort heltal som fortæller hvelket ark området er i
  • StartColumn: Langt heltal som angiver hvor venstre grænse er
  • StartRow: Langt heltal som angiver hvor øvre grænse er
  • EndColumn: Langt heltal som angiver hvor højre grænse er
  • EndRom: Langt heltal som angiver hvor nedre grænse er
SheetCellRange understøtter følgende metoder:
  • getCells(): Returnerer en samling af celler som en XEnumerationAccess
  • getRangeAddressesAsString():Returnerer en streng med adresserne for en samling af celler. Formatet er som “Ark1.B2:D6;Sheet3.C4:D5”.
  • getRangeAddresses(): Returnerer et array af services af typen CellRangeAddress
Der er en række service som vi kan anvende for at tilgå et område:
  • getCellByPosition(left, top): Finder en enkelt celle i området på baggrund af indeks
  • getCellRangeByPosition(left, top, right, bottom): Findet et celleområde i et andet celleområde på baggrund af indeks
  • getCellRangeByName(name): Findet et celleområde i et andet celleområde på baggrund af adressen.
Her er et eksempel på hvordan SheetCellRange kan bruges til at undersøge flere celler på en gang:

Sub GetSomeinfoRange
  oDoc =thisComponent
  oSheets = oDoc.Sheets

  oRange = oDoc.Sheets(2).getCellRangeByName("A2:B14")

  print oRange.AbsoluteName
  print oRange.CharFontName
  print oRange.CellBackColor
  print oRange.CharColor
End sub


Hvis du oplever at en af parametrene returnerer -1 i stedet for noget fornuftigt, så skyldes det at SheetCellRange forudsætter at alle cellerne i området har samme egenskaber. Hvis området indeholder celler med forskellige baggrundsfarver, vil .CellBackColor returnere -1.

I det næste eksempel kan vi sætte visse egenskaber for et helt område:

Sub SetBackgroundRange
  oDoc =thisComponent
  oSheets = oDoc.Sheets

  oRange = oDoc.Sheets(2).getCellRangeByName("A2:B14")

  oRange.CellBackColor=rgb(100,100,100)
  oRange.CharColor=rgb(255,255,255)
End sub


Til sidst et mere komplekst eksempel, hvor vi sætter valideringsregler på et helt område:

Sub SetValidationRange
  oDoc = thisComponent
  oRange = oDoc.Sheets(2).getCellRangeByName(""A2:B14")
      
  oValidation = oRange.Validation
 
  oValidation.Type = com.sun.star.sheet.ValidationType.DECIMAL
  oValidation.ErrorMessage = "Please enter a number between one and ten"
  oValidation.ShowErrorMessage = True
  oValidation.ErrorAlertStyle = com.sun.star.sheet.ValidationAlertStyle.STOP
  oValidation.setOperator(com.sun.star.sheet.ConditionOperator.BETWEEN)
 
  oValidation.setFormula1(1.0)
  oValidation.setFormula2(10.0)

  oRange.Validation = oValidation
End Sub