Co se týká problému 1 (již v předešlém příspěvku jsem použil číslování z listu Nefunkční věci z posledního ukázkového souboru) tak tam jste měl chybu v tom jak získat ten rozsah buněk, není tam .getCellByPosition, to je pouze pro jednu buňku. Pro rozsah buněk je .getCellRangeByPosition. A vaše proměnná oblast musí být objekt, nikoliv vlastnost objektu .RangeAddress kterou jste použil. Také trochu bordel v tom že rozsah .getCellRangeByPosition bere pozice buněk od nuly, čili A1=0,0 atd. Nicméně snadno si lze označit vybraný rozsah pomocí ThisComponent.CurrentController.Select(oblast), takže pak vidíte s čím pracujete.
Makro pro třídění Standard/NovyZaznam/DialogNZ_Sdata stačí upravit třeba takto.
Pro třídění v listu Inventura si to jistě zvládnete upravit sám.
dim tridpodle(0) as new com.sun.star.util.SortField
dim serad(0) as new com.sun.star.beans.PropertyValue
oblast=list.getCellRangeByPosition(0,3,7,Target) 'bacha číslování pro Position je od nuly -> A1=0,0; A2=0,1; B1=1,0; B2=1,1 atd.
ThisComponent.CurrentController.Select(oblast) 'můžete si pro kontrolu označit oblast která je vybrána
msgbox "vybráno je toto"
tridpodle(0).Field=4
tridpodle(0).SortAscending=True
serad(0).Name="SortFields"
serad(0).Value=tridpodle()
oblast.sort(serad())
No a co se týká problému 4 tak tam vám hapruje především funkce UnionArrays. Dvě neznámé pole spolehlivě spojíte jen přes třetí pole.
Function UnionArrays(p1(), p2()) as array 'sloučení dvou polí pomocí třetího pomocného pole
dim p3(ubound(p1)-lbound(p1)+ubound(p2)-lbound(p2)+1) 'velikost 3. pole se získá z údajů o počátku a konci obou polí
dim i&, j&
for i=lbound(p1) to ubound(p1) 'naplnění první části třetího pole prvním polem
p3(i-lbound(p1))=p1(i)
next i
for j=lbound(p2) to ubound(p2) 'naplnění druhé části třetího pole druhým polem
p3(j+i-lbound(p2))=p2(j)
next j
UnionArrays=p3 'vrátit třetí pole
End Function
Když máte jistotu že pole je indexováno od nuly a není zadefinováno jako nějaký konkrétní typ, tak si vystačíte s ubound a klidně i ReDim Preserve. Ale pole mohou být definovány i od vyššího číslování než od nuly a pak se musí brát v potaz i lbound. A když je pole definováno jako nějaký konkrétní typ a nikoliv Variant, pak ho Redim Preserve vynuluje.
Sub testUnion
dim p1(2 to 5) as string, p2(1 to 2) as string
p1=array("a", "b", "c", "d")
p2=array("E", "F")
xray UnionArrays(p1, p2) 'sloučená pole
redim preserve p1(6) as string 'pole bylo ale definováno jak typ string, takže ho to vynuluje
xray p1 'pole bude vynulované
dim p4(2 to 5) 'pole jako typ Variant
p4=array("A", "B", "C", "D")
redim preserve p4(6) 'typ Variant to zachová
xray p4
End Sub
No a další problém máte s .getDataArray, které vždycky vrací matici (pole polí), tedy array( array(...) ). Správně jste upravil ve fci Vydej/ Start_DialogVE matici MyArray na pole ARd, ale to samé musíte udělat i s druhou maticí MyArray2, než to vženete do fce UnionArrays. A pak už by bylo lepší mít na to samostatnou funkci. Ale jelikož MyArray2 je jednoprvková matice, tak tam můžete dát MyArray2(0). Takže řádek 151 v modulu Vydej můžete zakomentovat a ř.156 může být i takto:
aControl.Model.StringItemList=UnionArrays (MyArray2(0), ARd)
Po těchto dvou úpravách (jinak fce UnionArrays + jinak její použití v ř.156) už se vám ten editační dialog spustí a bude i předvyplněn, takže další postupy jistě zvládnete sám.
Ono to nebude ideální neboť jestli chcete slučovat dvě pole, tak by bylo záhodno mít v tom výsledném poli jen unikáty čili vyházet z toho duplicity. Ale k tomu a asi i jiným věcem se jistě ještě dostanete :-).