Excel VBA anomália + ezaz [MEGOLDVA]

Fórumok

Kezdeném a + ezaz-al. Feltettem ezt a kérdést normálisan stackowerflow-n is. Kaptam egy mínuszt és le lettem oltva, hogy különben is a képernyőképen van nem inglis felirat is. Nem tehetek róla, hogy Magyarországon (vagy azon kívül is) emberek milliói használnak magyar nyelvű office-t, ami néha ír ki dolgokat magyarul is. Ettől függetlenül a 10 szavas hibaüzenet le lett fordítva angolra. A többi mind angolul volt. Ezen kívül egyéb válasz nem érkezett. Hallottam, hogy gané egy hely, de hogy ennyire... válaszomtam a csókának, hogy egyébként ott van a leírásban angolul, csak a vizuális típus kedvéért illusztráltam is a dolgot. Ezek után eltűnt a kommentje. De a mínusz megmaradt.

Szóval a lényeg:

Van egy excel táblám, ami csinál ezt-azt, de leginkább bizonyos típusú switchek alapfunkcióit lehet vele bizergálni, így azok a kollégák is meg tudnak csinálni alap dolgokat, akiktől egyébként ez a konzolos dolog messze áll. Ezáltal aztán nem kell engem fél percenként hívogatni ha valami gáz van a hálózaton, mert épp csak a portsec letiltott a költözködés miatt, etc.

Most éppen így nézünk ki:

Kepernyokep

 

Az egész mögött snmp műveletek futnak VBA-ban. Lekérdezzük a switchet, megadunk neki bizonyos OID-k esetén paramétereket (pl. amikor letiltunk egy portot) stb.

Addig, amíg csak 1, 0, 2 értékeket kell megadni, (pl. egy port legyen tiltva, akkor az adott oid legyen 1, ha engedélyezett, akkor 2.) addig nem is volt gond. A hivatalos leírás alapján hasonlóképp kellene, hogy működjön a set is, mint a get. Igazából csak annyi különbségnek kellene lennie, hogy míg a get-nek nincs paramétere, mert csak lekérdez, a set-nek van egy paramétere, amit elküldük az eszközünknek. A hivatalos módszer valahogy így kellene, hogy működjön:

objSNMP.Set ("43.18.1.1.2", OIDValue)

 

Ha ezen a módon próbálom rábírni a programot a működésre, akkor "Compile error: Syntax error" hibaüzenetet kapok.

Találtam egy megoldást, ami feltételesen működik. Az előző képen a kikommentelt sor. A lényege annyi, hogy kell egy véletlenszerű/nevű változó, ami lényegében az objSNMP.Set parancsom kimenete lesz (?). Valahogy így:

randomVarName = objSNMP.Set("OID", Value)

Pontosan a kódban ez így néz ki:

temp = objSNMP.Set(".1.3.6.1.4.1.9.9.68.1.2.2.1.2." & PortNum, 21)

 Számomra megmagyarázhatatlan módon bár, de ez ebben a formában tökéletesen működik. Ez azért érdekes, mert semmilyen (hivalatos) infót nem találtam erről a módszerről sehol. Valamikor régebben az internet mély bugyraiban találtam, mint lehetséges megoldás. A probléma ezzel az, hogy amint kicserélem a paramétert egy konkrét értékről (esetünkben a 21 helyett) egy változó nevére, a program nem fut le. Ha pl. erre módosítom a sort:

temp = objSNMP.Set(".1.3.6.1.4.1.9.9.68.1.2.2.1.2." & PortNum, VLANNum)

 Ekkor jön a következő hibaüzenet:

Run-time error '-2147467259 (80004005)':
A kért SNMP-művelet módosítani próbált egy változót, de vagy szintaktikai vagy értékhiba történt.

 A fentiek alapján így most nem tudok értéket adni az adott paraméternek egy változón keresztül, csak közvetlenül. Így a lehetőségeim eléggé korlátozottak. Ha csinálok 4096 Parancsot kézzel és elküldöm ami éppen kell, az nagyon nem hatékony. Gondoltam még arra is, hogy meghívni a VBA kódba egy cmd.exe parancsot, ami konkrétan az snmpset alkalmazás által elküldi a megfelelő paramétereket a switchnek. Sőt, ezutóbbi úgy lenne a legjobb, ha magát a kis snmpset.exe fájlt be is tudnám csomagolni valahogy az excel fájlba, hogy amikor az másolva/terjesztve van, akkor meglegyen a függősége.

Most aztán megy a fejvakarás. De nyilván az official way lenne a preferált, vagy valami hasonló.
Valakinek tipp? :)

Hozzászólások

https://www.dell.com/community/Wyse-ThinOS/send-message-to-wyse-client-…

itt így működik neki az snmp set, úgyhogy 3 dolgot néznék meg:

- egy külön változóban raknám össze az oid-t ami neked kell és azt adnám oda a set-nek (mert a doksiija pointert ír első paraméternek, szóval az ilyen temp string nem biztos, hogy jó neki)

- meggyőződnék róla, hogy a VLANNum-od az int és nem string

- egy köztes változóba raknám a VLANNum értékét, mert lehet azt is pointerként(ami az excel táblád valamelyik értékére mutat) kezeli és írni akar bele (de nem értek a VBA-hoz).

Úgy néz ki megvan a megoldás.
Az a vicc, hogy egy japán oldalon találtam ráutaló infókat.

Úgy tűnik, hogy működik az ideiglenes változó nélkül is a következő formában, lényegében zárójel nélkül:

objSNMP.Set ".43.18.1.1.2", OIDValue

Ezt még mindig nem értem, hogy miért zárójel nélkül működik és a get miért zárójeles, de mindegy. Az MS oldalán rohadtul nincs erről szó és természetesen kommentelni sem lehet. Na de a lényeg...

objSNMP.Set ".1.3.6.1.2.1.2.2.1.7.9", CInt(a)

Igen, ez lett a megoldás. Próbálom értelmezni. Feltehetően az snmp segédprogram vagy modul vagy nevezzük bárminek, C-ben íródhatott. Vár egy paramétert, ami ezek szerint Integer típusú. VB(A)-ben hiába állítok bármilyen típust, nem fogadja el. Az Integert sem. Az viszont érdekes, ha tömböt vagy más egyéb típust adok meg, akkor a VBA tudja, hogy nem megfelelő a változó típusa tehát nagyon jól tudja, hogy oda INT-et kell átadni, csak nem képes rá ezekszerint. DE MIÉRT? A VB Int nem ugyanaz, mint a C-ben lévő Int? Nem ugyanazt jelenti az egész szám definíciója? Szerencsére Linux esetén még nem találkoztam ilyen balf.szságokkal mert ott a C-t mindenki érti -.-"

A lényeg, hogy működik, de semmi doksi, semmi magyarázat és a hivatalos oldaluk félrevezet és még kommentelni sem lehet. Egyébként a VBA modulokról sem találtam semmi leírást, wikit, dokumentációt vagy magyarázatot. Nagyon gáz ez így szerintem. Nem ehhez vagyok szokva.

- Indítsd újra a gépet! - Az egészet? - Nem, a felét...