Libreoffice Calc VBA / dátum megjelenített értékének kiolvasása

Sziasztok, hogyan tudom kiolvasni egy cellában lévő dátum megjelenített szöveges értékét a numerikus reprezentációja helyett? Előbbi értéke egy szöveg: "2012-01-01", utóbbi értéke egy egész szám: "40909".

Saját függvényhez kell. Példa:

public function tt( myrange as variant )
    a = myrange(0,0)
    msgbox(a)
end function

Ha egy cellába ezt a függvényt adom "=TT(A1)" és A1 értéke "2012-01-01", akkor az "a" változó értéke nem "2012-01-01" lesz hanem "40909". Nekem az előbbi kellene.

Az vajon a gond hogy a myrange már csak egy tömb aminek nincsenek lekérhető tulajdonságai metódusokkal, ugyanis ez nem működik: myrange(0,0).value vagy myrange(0,0).formula.

Hogyan tudnám elérni a függvényemből a megjelenített string értékét? Nekem a dátum formátum kell. Ugyanis nem eldönthető a sima integer-ről hogy az egy számból jött vagy egy dátumból.

Ötlet? Köszi.

Hozzászólások

Csak gondolkodom, amúgy sohasem csináltam ilyet. A cella típusa lekérdezhető? Ha igen, és dátum a típus, akkor csak konvertálni kell azt a számot, ami tudtommal egy bázis nap óta eltelt napok száma. Gondolom, erre van kész függvény, de ha nincs, meg lehet írni. Ha viszont nem dátum típusú a cella, ki kell írni, ami benne van.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Valóban a kapott szám egy adott nap óta eltelt napok számát mutatja. Viszont a probléma az (ha jól gondolom), hogy a függvényemhez kapott paraméter egy sima tömb, benne numerikus értékekkel. Tehát nyoma nincs metódusoknak, sem típusoknak. Így nem találok infót.

Olyan kerülőutakban meg nem akarnék gondolkodni ha nem muszáj, hogy visszakerestetem a munkalapon a számok alapján a pozíciót, és az ott kapott objektumot használom a típus megállapítására. Nagyon gány megoldás lenne. Azt gondolnám hogy kell legyen más lehetőség megtudni több infót a forrás cellákról.

Szerkesztve: 2020. 04. 23., cs - 20:29

Közben találtam infót:

https://wiki.openoffice.org/wiki/Documentation/OOo3_User_Guides/Calc_Gu…

Arguments passed to a macro from Calc are always values. It is not possible to know what cells, if any, are used. For example, =PositiveSum(A3) passes the value of cell A3, and PositiveSum has no way of knowing that cell A3 was used. If you must know which cells are referenced rather than the values in the cells, pass the range as a string, parse the string, and obtain the values in the referenced cells.

Akkor string-ként passzolon a RANGE-et és onnét hivatkozok vissza a cellákra, ahol már lesz infóm a típusra és másra.

Maradok annál hogy átkonvertálom az adott oszlop számait dátummá és ha több feltételnek megfelelnek, akkor dátumként kezelem:

- a következő érték nagyobb az előzőnél

- mindegyik nagyobb 2000-01-01-nél (nem valószínű hogy lesz értétem régebbre)

- nem túl nagy a variancia a középértékükhöz (CV, coefficient of variation)

és még gondolkodok rajt.

Ezzel röviden tudom tartani a kódsort és azt is megnyerem, hogy a megjelenített dátum rengeteg fajta formátumban lehet megjelenítve. Viszont ez egyszerűsít.

Ha van jobb ötlet jöhet.

Működik a kódom Excel alatt is, az alábbi különbségeket kellett kezelnem. A saját függvényem paramétere így néz ki:

function myfunc( data as variant ... )

Excel alatt Range típust kapunk Tömb helyett, ehhez kell egy konverzió úgy, hogy megvizsgálom hogy Excel alatt vagyok-e (létezik-e az Application objektumj és ha igen akkor átkonvertálom a range-et tömbbé, majd visszateszem ugyanabba a változóba, így nem kell az utána lévő kódokat módosítanom:

if isobject(application) then
    dim data2 as variant
    data2 = data.value
    data = data2
end if

Másik dolog a beépített Shell parancs különbségében van. Excel alatt nincs paramétere arra hogy várakozzon a Shell parancs befejezésére és csak utána fusson tovább, hanem egyből tovább megy. Ehhez a kiegészítő kód:

cmd = "..."

if isobject(application) then
    e = vba.createobject("wscript.shell").run( cmd, 0, true )
else
    shell( cmd, 0, "", true )
end if

Egyetlen gondom még vele, hogy mivel Excel alatt csak 1 paramétere van a Shell parancsnak, így szintaxis hibát jelez futtatáskor ha nincs kikommentezve a "shell(" kezdetű sor. Erre még nincs megoldásom és így jelenleg ha Excel-be másolom akkor ki kell kommenteznem ezt a sort.

Vajon hogyan tudnám ezt az Excel-el elfogadtatni?

Szerkesztve: 2020. 04. 27., h - 14:31

Végül megoldottam úgy hogy libre és ms office közös keresztmetszetét használom csak a VB parancsokból és objektumokból és így a sima Shell hívással indítom a parancsomat. Ez nem fog várakozni, ezért pollingolom a kimenetét a temp fájlban.

Mivel a kimenetben szereplnie kell egy "no errors"-nak, így egyértelmű a kilépési pont. Jobb is a polling mert így doevents-et is tudok hívni, és mivel sokáig tarhat a számítás, ezért a doevents miatt nem fagy be az UI.