Dimensies van named range ophalen in een macro

amlbl
Berichten: 8
Lid geworden op: wo jan 23, 2019 2:02 pm

Dimensies van named range ophalen in een macro

Bericht door amlbl »

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) 268 keer gedownload
Windows 10 Home, steeds recentste update.
OpenOffice, momenteel 4.1.5, maar wordt regelmatig updated
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: Dimensies van named range ophalen in een macro

Bericht door RPG »

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

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 7.4.3.2 op openSUSE Leap 15.4
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: Dimensies van named range ophalen in een macro

Bericht door RPG »

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

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 7.4.3.2 op openSUSE Leap 15.4
amlbl
Berichten: 8
Lid geworden op: wo jan 23, 2019 2:02 pm

Re: Dimensies van named range ophalen in een macro

Bericht door amlbl »

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
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: Dimensies van named range ophalen in een macro

Bericht door RPG »

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

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 7.4.3.2 op openSUSE Leap 15.4
amlbl
Berichten: 8
Lid geworden op: wo jan 23, 2019 2:02 pm

Re: Dimensies van named range ophalen in een macro

Bericht door amlbl »

Beste RPG,
Je hint om MRI te gebruiken heeft geholpen. Na wat zoekwerk heb ik alle nodige functionaliteit gevonden.
Ik heb wat ik nodig had afgesplitst in algemene functies met de typische OO functionaliteit, die mijn eigen macro's ondersteunen. Ik sluit die in, misschien kan je er iets mee.
Thks
mvg
Bijlagen
AlgFies.odt
(17.39 KiB) 261 keer gedownload
Windows 10 Home, steeds recentste update.
OpenOffice, momenteel 4.1.5, maar wordt regelmatig updated
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: Dimensies van named range ophalen in een macro

Bericht door RPG »

Ik heb alle door jouw gemaakte functies bekeken. Ik constateer dat van de zes functies er zo drie geschreven kunnen worden door ingebouwde functies. Ik ben niet zo goed om mooi commentaar te geven op anders mans ideeën. Ik constateer alleen dat ik ook min of meer op de zelfde manier ben begonnen maar later mij toch meer gericht heb op de werking van een programma zoals ApacheOffice. Later heb ik mij gericht op een kleine database programma zoals HSQLDB.

Ik blijf bij de gedachte dat het goed is om alle normale mogelijkheden van een Office programma goed te leren voor dat je begint met macro's.

Wanneer je door wilt gaan met macro's dan zou ik toch ook op het Engelse forum gaan zoeken. Daar zijn verschillende forums die zich op onderdelen richten. Alleen al het lezen van verschillende bijdragen uit het verleden kan best leerzaam zijn. Daarnaast kan de dagelijkse stroom berichten en de goede commentaren van enkele deelnemers ook heel leerzaam zijn. Het is mogelijk dat je iets leest over hoe iets mogelijk is zonder dat je zelf aan die mogelijk heid gedacht hebt. Ik ben niet zo goed in snelle uit wisseling van gedachten maar dat kun je daar soms wel lezen en dat is soms best mooi en nuttig.
LibreOffice 7.4.3.2 op openSUSE Leap 15.4
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: Dimensies van named range ophalen in een macro

Bericht door RPG »

Ik heb de bijbehorende macro's nog wat langer bestudeert. Voordat je het onderstaande probeert zorg wel dat je kopieën van je gegevens hebt want soms kan het zo wegraken. Ik doe deze waarschuwing er bijna altijd bij maar ben zelf nooit echt iets kwijt geraakt alleen bij het veelvuldig door elkaar gooien met subtotalen maar ik heb de neiging om alles terdege uit te testen op proefgegevens die overzichtelijk zijn.

GegevensBereik en Benoemd gebied
Er zijn twee manier om een tabel een naam te geven. De door jouw gebruikte manier en door er een gegevensbereik van te maken. Het is voorzover ik weet geen probleem om aan het zelfde gebied twee verschillende namen te geven namelijk de gewone naam en de naam voor het gegevens bereik.

GegevensBereik
Het gegevens bereik heeft extra mogelijkheden. Het kan gelijktijdig drie verschillende eigenschappen onthouden die later opnieuw worden toegepast met een Bereik vernieuwen. Mijn advies hierbij wel is dat de gegevens het best benaderd kunnen worden via de gegevensbronnen. Ik schrijf dat op vanwege de gemaakte functie sorteer.

Print bereik
Print bereik werkt het best samen met een benoemd gebied. Maar wanneer dat benoemd gebied samenvalt met een GegevensBereik kan dat ook mooi gebruik worden voor filteren van gegevens en printen van een gedeelte van de tabel.

Command URL
OpenOffice kent heel veel command urls. Zie deze lijst: Development/DispatchCommands - The Document Foundation Wiki. Let wel: voorzover ik weet zijn deze command url's hoofdletter gevoelig.

Voorbeelden zijn:

Code: Selecteer alles

.uno:SortAscending
.uno:SortDescending
.uno:DataSort is waarschijnlijk alleen via een opgenomen macro te naderen
.uno:DataAreaRefresh Voert waarschijnlijk een complete datarefresh uit op het gebied met inachtneming van allerlei voorschriften wat betreft laden, sorteren en optellen.

Hyperlink en Command URL
Deze command url's zijn als een knop in te voegen in je werkblad en sorteren het gebied waar de cursor zich bevind. Voorwaarde is wel dat de knop geen focus mag krijgen. Wanneer de knop gemaakt wordt met insert hyperlink dan krijgt voorzover ik weet de knop geen focus.
LibreOffice 7.4.3.2 op openSUSE Leap 15.4
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: Dimensies van named range ophalen in een macro

Bericht door RPG »

Onderstaand heb ik de functie SchrijfTabelCel iets veranderd. Hier voor zijn verschillende reden. De eerste is dat ik weinig vertrouwen heb in deze functie aangezien het voor normale gebruikers waartoe ik mij zelf ook reken het niet verstandig is om maar zo cellen van een andere waarde te voorzien. Het kan zijn dat de werking van het werkblad ernstig verstoord worden zonder dat het opgemerkt wordt. Het lijkt mij dan ook niet aan te bevelen om onderstaande functie in een belangrijk werkblad te gebruiken.

Een belangrijke wijziging is wel het gebruik van de eigenschap Type die een cel heeft. Het cel-type bepaalt niet welke waarde er in mag komen maar het cel-type krijgt achteraf een waarde afhankelijk waar en wat geplaatst wordt. Een tekst wat een formule kan zijn wordt met setformula op de goede plaats gezet en een getal wordt met setvalue op de goede plaats gezet. Gelijktijdig krijgt getType de goede waarde. Het is niet zo dat ik alles zo aangepast heb dat ook een datum goed afgehandeld wordt.

Mijn persoonlijke gedachte is altijd geweest om zo kort mogelijk bij de gewenste werking van het programma te blijven. Ik doel hierbij niet alleen op OpenOffice maar op alle computer programma's.

Het wordt beschreven in [url=file:///opt/openoffice4/sdk/docs/common/ref/com/sun/star/table/XCell.html]Interface XCell[/url]

Code: Selecteer alles

Function SchrijfTabelCelRPG(Tabelnaam As String, Waarde,  Optional Kolom As long, Optional Rij As Long)
'Gezien de andere opvatting over het type van de cel lijkt mij de parameter niet meer nodig.
  Dim LocalKolom As Long
  Dim LocalRij As Long
  Dim Veld As Object
' Default voor ontbrekende rij of kolom = 0  


  If Not Ismissing (Kolom) Then
    LocalKolom = Kolom
  Else
    LocalKolom = 0
  End If
  
  If Not Ismissing (Rij) Then
    LocalRij = Rij
  Else
    LocalRij = 0
  End If
dim TabelDim
TabelDim = Thiscomponent.NamedRanges.getByName(Tabelnaam).ReferredCells
Veld = TabelDim.GetCellByPosition(LocalKolom,LocalRij)
' Dit lijkt mij overzichtelijker en volgt de manier in de andere functies

select case typename(Waarde)
	case "Double"
		Veld.setValue(Waarde)
	case "String" ' Voor tekst mag gewone tekst zijn maar ook een formule
		Veld.setFormula(Waarde)
	case else print typename(Waarde) ' Ik weet niet of er nog meer typenamen kunnen komen
End Select
  print  Veld.Type ' Het print statement is om te testen
' Het type bepaalt niet welke waarde in de cel mag komen maar geeft weer welke waarde er in de cel staat.
'SchrijfTabelCelRPG = TRUE ' Dit was er ook alleen om te testen
End Function
LibreOffice 7.4.3.2 op openSUSE Leap 15.4
amlbl
Berichten: 8
Lid geworden op: wo jan 23, 2019 2:02 pm

Re: Dimensies van named range ophalen in een macro

Bericht door amlbl »

Geprobeerd en werkt. Waarvoor dank
Het uitsparen van de type parameter is een plus.
Bovendien is de manier waarop met de functie Typename(x) het type van een variant wordt bepaald voor mij een nieuw inzicht.
Waar wordt die functie beschreven? Ik zoek altijd in https://wiki.openoffice.org/wiki/NL/Doc ... ASIC_Guide
mvg
Windows 10 Home, steeds recentste update.
OpenOffice, momenteel 4.1.5, maar wordt regelmatig updated
RPG
Berichten: 4667
Lid geworden op: wo apr 15, 2009 1:01 am
Locatie: Apeldoorn, Nederland

Re: Dimensies van named range ophalen in een macro

Bericht door RPG »

De link die je geeft beschrijft hoofdzakelijk hoe een BASIC programmeur moet aankijken tegen de API. Het beschrijft ook wel wat opdrachten maar niet allemaal. In de helpfile van ApacheOffice worden bijna alle opdrachten beschreven van wat heet starBASIC. StarBASIC is dat wat hoort bij ApacheOffice en LibreOffice. Zowel ApacheOffice als ook LibreOffice zijn ook voor een belangrijk deel compatibel met VBA ,VisualBASIC for Aplications van microsoft, maar dat wordt alleen in de helpfile van LibreOffice beschreven.
Het zou best kunnen dat iemand die gemakkelijk programmeert in VBA dat die dat ook gemakkelijk op zijn manier kan voortzetten in OpenOffice maar hij moet wel gehoorzamen naar de API verschillen. Op veel hulp hoeft zo'n iemand niet te rekenen daar iemand met starBASIC kennis hem niet begrijpt.

De link www.pitonyak.org/oo.php geeft toegang tot de site van Andrew Pitonyak die een uitgebreid boek heeft geschreven over hoe te programmeren in OpenOffice-macro's

Maar ik heb al eerder geschreven het programmeren van macro's heeft alleen zin wanneer ook OpenOffice zelf begrepen wordt.

Kijken op het Engelse forum
Ik heb al vaker geschreven dat het kijken op het Engelse forum voor velen ook aan te bevelen is. Daar wordt ook regelmatig gewerkt met de script-taal Python. Bij Python hoort een een uitgebreide API die goed samenwerkt met OpenOffice. ApacheOffice heeft nog moeite om om te schakelen naar versie 3 maar er wordt aangewerkt. LibreOffice werkt met versie 3.
LibreOffice 7.4.3.2 op openSUSE Leap 15.4
Plaats reactie