Innhold

# Leser- og skriver verdier til Områder

Makroer i LibreOffice Calc trenger ofte å lese og skrive verdier fra/til ark. Denne hjelpesiden beskriver de ulike tilnærmingene til å få tilgang til ark og områder for å lese eller skrive verdiene deres.

Alle eksemplene som presenteres på denne siden kan implementeres både i Basic og Python.

## Tilgang til en enkelt celle

Eksemplet nedenfor legger inn den numeriske verdien 123 i celle "A1" i gjeldende ark.

        Dim oSheet as Object
        Dim oCell as Object
        oSheet = ThisComponent.CurrentController.getActiveSheet()
        oCell = oSheet.getCellRangeByName("A1")
        oCell.setValue(123)

Det samme kan oppnås med Python:

        doc = XSCRIPTCONTEXT.getDocument()
        sheet = doc.getCurrentController().getActiveSheet()
        cell = sheet.getCellRangeByName("A1")
        cell.setValue(123)

Merk at i de foregående eksemplene åpnes cellen ved å bruke områdenavnet "A1". Det er også mulig å få tilgang til celler ved å bruke indekser som om arket var en matrise der kolonner og rader indekseres fra null.

Dette kan gjøres ved å bruke getCellByPosition(colIndex, rowIndex) metoden, som tar inn en kolonne og en radindeks. Eksemplet nedenfor i Basic endrer tekstverdien i celle "C1" (kolonne 2, rad 0).

        oSheet = ThisComponent.CurrentController.getActiveSheet()
        oCell = oSheet.getCellByPosition(2, 0)
        oCell.setString("Hello")

Dette eksemplet kan også implementeres i Python på denne måten:

        doc = XSCRIPTCONTEXT.getDocument()
        sheet = doc.getCurrentController().getActiveSheet()
        cell = sheet.getCellByPosition(2, 0)
        cell.setString("Hello")

Hovedforskjellen mellom Python- og Basic-skript ligger i hvordan du får tilgang til arkobjektet ved å bruke kontekstvariabelen XSCRIPTCONTEXT. Etter det er alle metoder og egenskaper identiske i Basic og Python.

## Verdier, strenger og formler

Calc-celler kan ha tre typer verdier: numeriske, strenger og formler. Hver type har sitt eget skriv og les metoder:

Type | Get Method | Set Method
--- | --- | ---
Numerisk | getValue() | setValue(newValue)
Tekst | getString() | setString(newString)
Formel | getFormula() | setFormula(newFormula)

Datoer og valutaverdier betraktes som numeriske verdier i Calc.

Følgende eksempel legger inn numeriske verdier i cellene "A1" og "A2" og setter inn en formel i celle "A3" som returnerer multiplikasjonen av disse verdiene.

        oSheet = ThisComponent.CurrentController.getActiveSheet()
        oCell = oSheet.getCellRangeByName("A1")
        oCell.setValue(10)
        oCell = oSheet.getCellRangeByName("A2")
        oCell.setValue(20)
        oCell = oSheet.getCellRangeByName("A3")
        oCell.setFormula("=A1*A2")

## Tilgang til områder i forskjellige ark

De forrige eksemplene brukte bare det aktive arket til å utføre operasjoner. Det er mulig å få tilgang til celleområder i forskjellige ark etter indekser eller navn.

Eksemplet nedenfor legger inn en numerisk verdi i celle "A1" på arket kalt "Sheet2".

        oSheet = ThisComponent.Sheets.getByName("Sheet2")
        oCell = oSheet.getCellRangeByName("A1")
        oCell.setValue(123)

Dette eksemplet kan også implementeres i Python slik:

        doc = XSCRIPTCONTEXT.getDocument()
        sheet = doc.Sheets["Sheet2"]
        cell = sheet.getCellRangeByName("A1")
        cell.setValue(123)

Ark kan også nås ved å bruke nullbaserte indekser som indikerer hvilket ark med tanke på rekkefølgen de vises i Calc-filen.

I Basic, i stedet for å bruke getByName-metoden, bruk Ark(arkIndex) som vist neste:

        oSheet = ThisComponent.Sheets(0)

Dette kan gjøres på lignende måte i Python:

        sheet = doc.Sheets[0]

## Bruke ScriptForge-biblioteket

Calc-tjenesten til ScriptForge-biblioteket kan brukes til å hente og angi celleverdier som følger:

        ' Laster ScriptForge-biblioteket
        GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
        ' Får tilgang til gjeldende Calc-dokument
        oDoc = CreateScriptService("Calc")
        ' Angir verdien for cellene A1 og A2
        oDoc.setValue("A1", "Hello")
        oDoc.setValue("A2", 123)

Metoden setValue kan brukes til å angi både numeriske og tekstverdier. For å angi en celleformel, bruk setFormula-metoden.

Med Calc-tjenesten kan henting og angivelse av celleverdier gjøres med en enkelt kodelinje. Eksemplet nedenfor henter verdien fra celle "A1" og viser den i en meldingsboks.

        Dim val as Variant, oDoc as Object
        oDoc = CreateScriptService("Calc")
        val = oDoc.getValue("A1")
        MsgBox val

ScriptForge-biblioteket gjør det også enklere å få tilgang til områder i forskjellige ark, som vist i eksemplet nedenfor:

        Dim val1, val2
        ' Henter celle "A1" fra arket kalt "Sheet1"
        val1 = oDoc.getValue("Sheet1.A1")
        ' Henter celle "B3" fra arket kalt "Sheet2"
        val2 = oDoc.getValue("Sheet2.B3")
        ' Plasserer resultatet i celle "A1" i arket "Rapport"
        Dim result : result = val1 * val2
        oDoc.setValue("Report.A1", result)

Eksemplene ovenfor kan også implementeres i Python som følger:

        from scriptforge import CreateScriptService
        doc = CreateScriptService("Calc")
        doc.setValue("A1", "Hello")

        doc = CreateScriptService("Calc")
        bas = CreateScriptService("Basic")
        val = doc.getValue("A1")
        bas.MsgBox(val)

        first_val = doc.getValue("Sheet1.A1")
        second_val = doc.getValue("Sheet2.B3")
        result = first_val * second_val
        doc.setValue("Report.A1", result)

Lignende emner

ScriptForge-biblioteket

SFDocuments.Calc tjeneste

Programmering med Python-skript

Supporter oss!