Dimensies van named range ophalen in een macro

Dimensies van named range ophalen in een macro

Berichtdoor amlbl » ma nov 25, 2019 5:42 pm

Gegeven:
Een werkblad met een 2 dimensionele tabel waaraan de naam 'Tabelnaam' werd gegeven
Een drukknop die een basic macro activeert

Gevraagd:
In de macro moeten de dimensies van de tabel (begin en eind rij en kolom) opgehaald worden

Na wat opzoekwerk blijkt dat onder het document object een referentie bestaat naar een array met referenties die verwijzen naar alle gedefiniëerde named ranges.

DocNamedRanges = Doc.NamedRanges

Je kan dan blijkbaar een referentie naar een specifieke named range ophalen via zijn naam …

TabelDimensies = DocNamedRanges.getByName("Tabelnaam")

Ik verwachtte dan ook dat deze referentie toegang zou geven tot de structuur CellRangeAddress waarin de gezochte begin en eind rij en kolom te vinden zijn.
Hier ben ik echter de draad kwijt.

Kan iemand mij aub wijzen op mijn denkfout, waarvoor dank bij voorbaat.
Als bijlage een test werkblad.
Bijlagen
test.ods
(10.92 KiB) 5 keer gedownload
Windows 10 Home, steeds recentste update.
OpenOffice, momenteel 4.1.5, maar wordt regelmatig updated
amlbl
 
Berichten: 6
Geregistreerd: wo jan 23, 2019 2:02 pm

Re: Dimensies van named range ophalen in een macro

Berichtdoor RPG » ma nov 25, 2019 6:49 pm

Ik geloof niet dat het een goed idee is voor beginners om met macro's te beginnen. Ik zou eerst eens alle belangrijke Calc opdrachten leren. Het is niet nodig om alle opdrachten, feitelijk functies, te kennen. Ik denk in dit geval is het nodig om wat heet alle werkblad functie en nog wat te kennen. Er zijn twee werkblad functie die het gewenste zo weer geven
Code: Selecteer alles   UitklappenInklappen
Rijen
Kolommen


Naast het leren van deze functies is het dan belangrijk om veel van deze functies mooi te combineren. Dit mooi combineren heet programmeren. Het programmeren in de spreadsheet is in principe even moeilijk als het programmeren in macro's. Alleen de stappen in macro's zijn meestal veel kleiner.

Beschrijf maar eens wat het feitelijk doel van je gedachten zijn zonder aan macro's te denken. Ik durf niet te beloven dat ik je tot grote steun kan zijn daar ik ook maar een hobby programmeur ben.

De link Het mailen van een PDF document vanuit Calc. heeft macro code waarin het door jouw gevraagde gebruikt wordt maar het blijft voor de meesten ook onduidelijk. En voor de duidelijk in de macro wereld wordt gewerkt met een reeks van geneste array. Dat is wat anders dan een twee dimensionale array.
LibreOffice 6.2.5.2 op openSUSE Leap 15.1
RPG
 
Berichten: 4025
Geregistreerd: wo apr 15, 2009 1:01 am
Woonplaats: Apeldoorn, Nederland

Re: Dimensies van named range ophalen in een macro

Berichtdoor RPG » ma nov 25, 2019 10:26 pm

Het begrijpen van macro's in OpenOffice in al zijn varianten is zo moeilijk om dat het uitgaat van Services en interfaces.
Een service kan tientallen andere services exporteren en ook nog andere interfaces. Het kost lange tijd om de weg te vinden in deze doolhof. Services en interfaces hebben ook nog methodes en properties. Bij het macro-programmeren heb ik dus ook altijd een object inspector open. In mijn geval is dat MRI.

MRI is een zeer krachtige tool waarvan ik maar een deel gebruik. Het kan ook macro's opnemen en dan de code genereren in een macro taal naar keuze. Ik maak daar weinig gebruik van maar Villeroy op het Engelse forum is erg bedreven in het opnemen van macro's met MRI. Maar het is ook zo dat Villeroy ook een buitengewoon gedegen kennis heeft van alles wat te maken heeft met OpenOffice.

Om terug te komen op geëxporteerde Interfaces. Er worden door de door jouw gevonden service ook iets geexporteerd onder de naam Columns en Rows. Deze hebben alle twee een property Count. Ik heb die zaken ook niet paraat en kom ze ook tegen in MRI.

Code: Selecteer alles   UitklappenInklappen
Sub Macro1
dim oTabelNaam
oTabelNaam = thiscomponent.NamedRanges.getbyname("Tabelnaam").ReferredCells
print oTabelNaam.columns.count
print oTabelNaam.rows.count
'
print ubound(oTabelNaam.getdataarray(0)) ' Begint te tellen bij nul
print ubound(oTabelNaam.getdataarray(0)(0)) ' Begint te tellen bij nul

End Sub


De macro's in OpenOffice beginnen pas te leven wanneer het een en ander ook verbonden kan worden met de services en interfaces. Bovenal is kennis nodig van de normale werking van OpenOffice want de API waarop de macro's gebaseerd horen te zijn weerspiegelt de normale werking van OpenOffice.
LibreOffice 6.2.5.2 op openSUSE Leap 15.1
RPG
 
Berichten: 4025
Geregistreerd: wo apr 15, 2009 1:01 am
Woonplaats: Apeldoorn, Nederland

Re: Dimensies van named range ophalen in een macro

Berichtdoor amlbl » di nov 26, 2019 12:59 pm

Beste RPG,

Dank voor uw laatste reactie.
Hiermee heb ik exact wat ik wou, zij het langs een lichtjes andere weg.
Ik heb ondertussen ook MRI geinstalleerd en zal hiermee experimenteren.

mvg
Windows 10 Home, steeds recentste update.
OpenOffice, momenteel 4.1.5, maar wordt regelmatig updated
amlbl
 
Berichten: 6
Geregistreerd: wo jan 23, 2019 2:02 pm

Re: Dimensies van named range ophalen in een macro

Berichtdoor RPG » do nov 28, 2019 9:42 pm

Soms leer ik zelf ook wat. Ik ben niet zo sterk met opgenomen macro's maar het blijkt ook wel wat te kunnen. Dit is opgenomen met MRI. De volgende voorwaarden moeten in acht genomen worden.
a) Het benoemde gebied moet eerst benoemd worden.
b) Soms moet er een stap terug gedaan worden en dat blijkt niet opgenomen te worden.
c) Ik geloof dat je MRI opnieuw moet opstarten en ook het venster zichtbaar maken door de onderste balk op te schuiven naar boven. Ik krijg deze code.
Code: Selecteer alles   UitklappenInklappen
Sub Snippet
  Dim oNamedRanges As Variant
  Dim oObj1 As Variant
  Dim oReferredCells As Variant
  Dim oColumns As Variant
  Dim nCount As Long
  Dim oRows As Variant
  Dim nCount2 As Long

  oNamedRanges = ThisComponent.NamedRanges
  oObj1 = oNamedRanges.getByName("Gebied") 'Gebied is een door mij benoemde Range
  oReferredCells = oObj1.getReferredCells()
 
  oColumns = oReferredCells.getColumns()
  nCount = oColumns.getCount()
  oRows = oReferredCells.getRows()
 
  nCount2 = oRows.getCount()
End Sub


Voor meer informatie lees de [Tutorial] Introduction into object inspection with MRI. Rudolfo plaatst nu weinig meer maar was iemand die ook wel wat wist van programmeren in OpenOffice.
LibreOffice 6.2.5.2 op openSUSE Leap 15.1
RPG
 
Berichten: 4025
Geregistreerd: wo apr 15, 2009 1:01 am
Woonplaats: Apeldoorn, Nederland


Keer terug naar Macro's

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers. en 1 gast

cron