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.
- 189 megtekintés
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Ezt találtam közben:
http://www.debugpoint.com/2014/11/date-and-time-processing-in-libreoffi…
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Ügyes. :) Végül is adtál egy valószínűségi feltételt rá. Ha elég hosszú az adatsorod, akkor működni fog.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Működik jól és sikerült a komplexitást elég alacsony szinten tartanom, 84 sornyi kommentezett kód, a célhoz megfelel egyelőre.
- A hozzászóláshoz be kell jelentkezni
Ez szerintem nem jó. Nem tud mit kezdeni a sima tömb inputtal. Illetve nem szeretnék használni platformfüggő lib-eket, mert a jelenlegi kódom könnyen átültethető más platformra. Köszi.
- A hozzászóláshoz be kell jelentkezni
A kódom már az elvileg, de még tesztelnem kell. Az office 365 online-hoz már írtam kiegészítő macro-t javascript-ben, most direkt az offline office-okat célzom.
- A hozzászóláshoz be kell jelentkezni
Közben teszteltem, megy Windows alatt Libreoffice-al. Még MS Excel teszt van hátra.
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni