Keresés

Új hozzászólás Aktív témák

  • Cpt. Flint

    tag

    válasz #90999040 #1482 üzenetére

    Engem igazán az izgatna, hogy változót hogy tudok átadni mondjuk excelből wordbe.
    Mert itt a legnagyobb problémánk az volt, hogy a körlevél rekordszám az excelben megfelelő programrésszel meghatározott/szűrt sorok száma kell legyen, de ezt a változót csak az excel tábla egyik cellájából bírtuk kibányászni Wordből indított DDE hívással, ami egy baromi körülményes és vacak megoldásnak tűnik nekem:
    lngChannel = DDEInitiate(App:="Excel", Topic:="akarmi.xls")
    ig2 = DDERequest(Channel:=lngChannel, Item:="r11c17")
    Application.DDETerminateAll
    Többek között ez csak a "Munka1" lapról szed, én nem tudtam elérni, hogy más munkalap legyen a forrás, aztán csak a R1C1 stílusú hivatkozás működött; illetve ha nem volt látható a hivatkozott cella (mondjuk el volt rejtve vagy össze volt csukva az adott sor v. oszlop), akkor valami nem jó értéket adott vissza (karakterként négyzet, chr$-ként talán 13?).
    Sajnos a DDERequestről eddig nem sikerült normális (a VBA helpnél bővebb) leírást találnom, úgyhogy nem is vagyok tisztában vele, hogy esetleg valami más, értelmesebb, kezelhetőbb formában használható-e. :((

  • Cpt. Flint

    tag

    válasz #90999040 #1482 üzenetére

    "Természetesen a word-ből is lehet az excel objektumait használni."
    És a másik alkalmazás VBA utasításkészletét is? Tehát levezényelhetném az excelből (DDEExecute nélkül) a körlevélkészítést a MailMerge-vel valami módon?

  • Cpt. Flint

    tag

    válasz ArchElf #1498 üzenetére

    szóval, itt több rendbeli félreértés van.
    1. maga a KeyCode úgy tűnik, nem vihető át, mert rendszerváltozó, hiába teszem public-ká, akkor is üres lesz, amint másik sub-ba ugrok. természetesen tudom, hogy egy felhasználói publikus változóba kiíratva átvihető, alkalmaztuk is, csak reménykedtünk, hátha mégis lehet az eredetit használni, merthogy úgyis azt kínálja fel a rendszer, mikor egy új keydown subot létrehozol. megspóroltunk volna egy saját változót, meg minden ilyen subban egy plusz sort.
    2. honnan jön a tb változó? mert mi pont azt szeretnénk megspórolni, hogy minden keydown subban konkrétan (az adott vezérlő nevével/indexével) értéket kelljen neki adni. mivel ez esetben ez a rész mindegyik subban eltérő lesz, azaz nem lehet simán másolni, oda kell figyelni.
    magyarul én a set tb=TextBox1 helyett a set tb=ActiveControl kifejezést szeretném használni, mert ez univerzális. csakhogy nem működik, mert az ActiveControl a VB szerint nem a TextBox1, amiben épp kavarok, hanem a MultiPage1. ez a problem.
    3. A "Locked"-nek az az értelme, hogy így egyszerűen nem íródik be a textboxba a hibás karakter, és passz, megy tovább.
    4. "Changed" az mi? Én nem találom. Ha a "Change"- re gondolsz, akkor azért a KeyDown-ból megy az egész, és nem a Change-ből, mert a KeyDown még a karakter megjelenése _előtt_ lefut, a Change meg csak utána (tehát ott már csak törölni tudnék).

    masked textbox hogy megy? a Format()-ra gondolsz?

  • Cpt. Flint

    tag

    válasz ArchElf #1500 üzenetére

    Általánosságban: jó, majd olvasgatok, ha lesz időm. (de azért, mert _itt_ újonc vagyok, még nem bizti, hogy totál hülye is.)
    VB 6.5, Office 2003 SP3

    1-2. Melyik függvény hozza létre újra, ha public?
    Én ezt csináltam (volna, ha menne):

    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 'Ügyirat főszámba csak számot enged írni

    Dim vezerlo As Object
    set vezerlo = ActiveControl
    csakszam

    End Sub

    Sub csakszam()

    If Shift <> 0 Then
    vezerlo.Locked = True
    Else
    If KeyCode = 8 Or KeyCode = 46 Or _
    (KeyCode >= 48 And KeyCode <= 57) _
    Or (KeyCode >= 96 And KeyCode <= 105) Then
    vezerlo.Locked = False
    Else
    vezerlo.Locked = True
    End If
    End If

    End Sub

    Úgy gondoltam, hogy amikor a KeyDown subból meghívom a csakszam subot, akkor a KeyCode és a Shift ott is ugyanazt az értéket fogja még tartalmazni. De nem, ezek kiürülnek. Akkor is, ha külön felveszem őket public változóként. Ezért a KeyDown subban mindkettő értékét kiíratom egy-egy saját változóba (kc=KeyCode, ks=Shift) és a csakszam subban már azokat használom. Ez nem probléma, csak két plusz sor és két plusz változó.
    Kipróbáltad, hogy át lehet-e adni (úgy, ahogy írtad) a KeyCode-ot? Mert nálam nem lehet, csakszam TextBox1, KeyCode-re ezt kapom: Compile error: ByRef type mismatch.
    És mint írtam, pont azt szeretném elkerülni, hogy a TextBox1-et bárhol is leírjam (értékadásba vagy érték átadásba), mert azt majd akkor minden egyes subban át kell írnom a megfelelőre (ráadásul még ComboBox is lesz). Ezért szeretném az ActiveControlt használni helyette, ami általános, és elvileg mindig azt adná, ami épp kell).
    "le kell ellenőrizni, hogy az aktuális ActiveControl TextBox-e"
    Leellenőriztem, nem az. De MIÉRT nem az, mikor azon van a fókusz, abban szerkesztek, abból fut le a KeyDown sub??? A VB helpje szerint az ActiveControl az, amelyik épp fókuszban van. De mégsem a TextBox1-et kapom, hanem a MultiPage1-et.
    Próbáltam így: set vezerlo=MultiPage1.Pages(0).ActiveControl. Ez eggyel beljebb vitt, mert így Frame1-et kaptam eredménynek, amiben a TextBox1 is van, de még mindig nem a textboxot... És ez már ebben a formában úgysem érne semmit, hiszen már akkor ha a konkrét lapot meg kell adnom, az sem jobb semmivel, mintha éppenséggel a konkrét vezérlőt adom meg.
    Én sem igen szeretem a globális változókat szaporítani, de miért kell elfelejteni? Van valami komoly hátrányuk?
    3. Miért lenne hack? Ez egy egyszerű, frappáns megoldás, egy darab létező tulajdonságot állítok át, és a felhasználó annyit lát, hogy ha nem megfelelő billentyűt nyom, egész egyszerűen nem történik semmi. Nyista vágólap, mert a Ctrl+akármit ez a rutin a KeyCode-ok közül nem engedélyezi (ugye vizsgálom a Shift-et, és ha nem 0, akkor eleve locked, de ha éppen nem a Ctrl-ra, akkor meg a v-re lenne az).
    4. sem a VB helpjében, sem az Object Browserben nem találok MaskedEditet, egyetlen Mask tulajdonságot leltem, ami csak a CommandBarButton-ra alkalmazható.
    Osztályom sincs olyan, hogy MaskEdBox, vagy akár MaskedTextBox. Sőt, az ominózus MSMASK32.OCX sem található meg a gépemen.

    Egyébként természetesen köszönöm a segítséget és az eszmecserét, sokat tanulok belőle. :R

  • Cpt. Flint

    tag

    válasz ArchElf #1502 üzenetére

    nem vagyok fejlesztő. ez probléma? itt csak azok lehetnek tagok? mert akkor szorri, lelépek. autodidakta excel vba projekt író vagyok (mondjuk), félig kényszerből, félig szórakozásból. :B Az angolom is hagy kívánnivalót maga után, úgyhogy ha nagy ritkán végképp nem találok valamire megoldást, akkor szoktam jólelkű fórumozókhoz fordulni. nyilván valszleg magában az objektumorientált programozás alapjaiban is vannak hiányosságaim, ezt vagy elnézitek nekem, vagy nem. ha nem, akkor nem válaszoltok, volt már ilyen.
    ha egy többszázas google találati oldalt linkelsz, az nemigen ösztönzi az embert olvasásra. ettől függetlenül szemezgettem belőle, de az általad írtakat sajna pont nem találtam meg.

    "- Ha egy függvény definíciójában van definiálva egy változó (vastaggal)
    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    azt hiába definiálod előre, az adott függvényben az itt definiált "változat" fog élni."
    most már érteni vélem (úgy látszik, mégis el tudod magyarázni ha van kedved, ugye nem is kellett hozzá olyan hatalmas energia). arra valóban nem gondoltam, hogy a KeyDown függvény paramétereiben voltaképp újradefiniálom a változót...
    de nekem úgy tűnik, a csakszam-hoz már elég ez is: Sub csakszam(KeyCode, Shift)

    már látom, hogy mi volt a ByRef hiba oka; többféle változónévvel futottunk itt a példákban, aztán nem egyezett az átadott az átvettel. úgyhogy valóban, köszi, működik.

    Az a GetActive nagyon frappáns ki hackelés :D, mélységes hálám a visszafejtésért (vannak benne önmagukban is új/hasznos dolgok számomra); de hogy miért (csak) így működik, azt nem tudod véletlenül? Szerintem az ActiveControl így elég használhatatlan/bacsapós önmagában... nincs olyan utasítás, ami ténylegesen, közvetlenül, azonnal azt az egy darab, fókuszban levő vezérlőt adná eredményül?

    masked editre akkor semmi ötlet?

    :R

  • Cpt. Flint

    tag

    válasz martonx #1503 üzenetére

    "Cpt. Flint pedig nem attól hülye, hogy itt mi a rangja, hanem a kérdése minőségétől. ... Biztos én vagyok a bunkó, de egyszerűen valami hihetetlen mélységekből jönnek elő ezek a mai fiatalok."

    Cpt. Flint nem hülye, csak ugyanolyan érzékeny, mint te. A "kérdés minőségétől" se lesz valaki hülye, legfeljebb tudatlan. Azért kérdez. Nem láttam a fórum szabályzatában, hogy csak okleveles, elsővonalbeli programozók lehetnek tagok és azok is csak – általad – értelmesnek minősített kérdéseket tehetnek fel. Nagyon szépen kérlek, ha hülyének tartasz, ne foglalkozz a hozzászólásaimmal. Bizonyára te is tudnál olyat kérdezni, amiért én körberöhögnélek (lehet, hogy már kérdeztél is máshol), és a lehülyézés bizonyára neked is rosszul esne (mert az ekkora arcoknak szokott leginkább).

    Ja, és sajnos baromira nem vagyok mai fiatal. Valszleg pont ez az egyik oka annak, hogy kérdeznem kell, én nem úgy kezdtem, hogy 10 évesen már javascriptet írtam mondjuk, vagy akármi. Kb. egy avíttas FORTRAN könyv volt az első kapcsolatom a számítástechnikával. Lehet, azóta se vittem többre véleményed szerint, de ez annyira azért nem izgat. És hát hiába, nem ez a szakmám, úgyhogy ne kívánd tőlem, hogy nekiálljak informatikusnak tanulni, mielőtt kérdezek. Elég nekem a saját szakmámat követni, dolgozni, családot eltartani. Elhiheted, hogy csak akkor fordulok a fórumokhoz, ha sehol nem találtam számomra érthető megoldást. Aztán van aki bunkózik, van aki válaszol.

  • Cpt. Flint

    tag

    válasz martonx #2360 üzenetére

    na de ez a teljes workbookra vonatkozik, neki meg bizonyos sheetekre kell csak, gondolom a workbookot meg kell tudni nyitni "korlátozottan" is.

    Én ezt tenném:

    Private Sub CommandButton1_Click()

    pwd = InputBox("Adja meg a jelszót:", "Munkalapok felfedése")
    If pwd = "akarmi" Then
    For i = 2 To 3
    Worksheets(i).Visible = True
    Next
    Else
    hiba = MsgBox("A megadott jelszó hibás!", vbCritical + vbOKOnly, "Jelszó hiba")
    End If

    End Sub

    A CommandButton1 beágyazva az 1-es munkalapra a "Felfedés" felirattal.
    A WorkbookOpen-ben persze megcsinálom ugyanilyen for-next ciklussal a worksheetek visible=false beállítását. És nyilván le kell jelszavazni a VB részhez való hozzáférést. ;]

  • Cpt. Flint

    tag

    válasz Cpt. Flint #2362 üzenetére

    bocs, annyi még, hogy a WorkbookOpen-ben alapok elrejtéséhez a Worksheet(i).Visible = xlVeryHidden sort kell használni ahhoz, hogy a felhasználó ne tudja popup menüből láthatóvá tenni az elrejtett munkalapokat, hanem ez csak a visible property programkódból való állításával legyen lehetséges.
    (vagy eleve erre kell beállítani az adott lapok "visible" tulajdonságát a VB projektben)

    [ Szerkesztve ]

  • Cpt. Flint

    tag

    válasz martonx #2364 üzenetére

    mármint mi helyett? mert tudtommal sem worksheet open, sem worksheet close nincs... :D

  • Cpt. Flint

    tag

    válasz martonx #2366 üzenetére

    Az ÉN kedvemért??? :F Szerintem összekeversz valakivel.

    Én leírtam egy megoldást. Elvből sem titkolva, mert nem mindenki akar ezzel foglalkozni, lehet, hogy siet, lehet, hogy most az egyszer van erre szüksége, lehet, hogy most kezdi; és ebből is tanul, ahogy én is tanulok mások példáiból.

    Nem akartalak felbosszantani, csak mellékesen megjegyeztem, hogy az általad adott megoldás nem felel meg a feltett kérdésnek (fealadatleírásnak).
    Erre kaptam egy egyszerű választ, ami már bosszantott kicsit, mert megint nem volt igazán értelmezhető.
    Legutóbbi beírásod után meg már teljesen egyértelmű számomra, hogy sem azt nem nézted meg, hogy ki kicsoda, sem azt, hogy pontosan mit is akar...

    Az activate/deactivate nem igazán alkalmas a worksheetek nyitott workbookon belüli jelszavazott elrejtésére egyes felhasználók elől. Én legalábbis nem tudom elképzelni.

    [ Szerkesztve ]

  • Cpt. Flint

    tag

    válasz martonx #2368 üzenetére

    Akkor kösz, bocs! :R
    Csak pont az nem jár erre végül, aki az egészet kérdezte. :DD

  • Cpt. Flint

    tag

    válasz Fire_Vire #2373 üzenetére

    egyelőre nem egészen érthető számomra a feladat.
    a txt fájl valami módon szabályosan tagolt? (rekordok és mezők vannak benne voltaképpen?)
    azon belül a feltétel 1-6 bizonyos "mezők" (a sor egyes szakaszai) értékére vonatkozna?
    mi kell eredményként? a sor száma? a feltételnek megfelelő szövegrész? a teljes sor? csak az a sor érdekes, ami minden feltételnek megfelel, vagy minden sor számít, ami legalább egy feltételnek megfelel?

    sokat segítene, ha kicsit konkrétabban leírnád a feladatot.

    [ Szerkesztve ]

  • Cpt. Flint

    tag

    válasz martonx #2374 üzenetére

    sőt, ha a siker(1,2 ..., n)=igaz helyett a siker(1,2 ..., n)=1 kifejezést használjuk, akkor a végén csak annyit kell vizsgálni, hogy siker(1)+siker(2)+...+siker(n)=n igaz-e. :)
    így megspóroljuk az "és"-eket, és akár ciklust is használhatunk az összegzéshez, ami a feltételek számának esetleges későbbi módosulásakor jól jöhet, mert nem kell átírni a kódot, csak egy változót kell módosítani (és még azt is könnyen le lehet programozni).

    [ Szerkesztve ]

  • Cpt. Flint

    tag

    válasz Fire_Vire #2381 üzenetére

    Hmmm... én még abban az időben kezdtem tanultni a BASIC-et, mikor ZX Spectrumok és Commodore 64-ek voltak, külső lemezes meg kazettás "programtárolással", és baromira nem volt mindegy, hogy milyen hosszú egy kód, mennyi változó és művelet van (különösen az if-then bírt lassítani). :D (nem is beszélve a TI-57 programozható számológépről :)) )
    Mondjuk pl. én a "siker" változóknak biztos lineáris tömböt használnék, sőt, lehet, hogy a feltételnév/feltételérték/siker egymáshoz kapcsolódó teljes rendszert egy tömbben tárolnám.

    de ezek már csak olyan apróságok: elsőre nem feltétlenül kézenfekvő, de talán elegánsabb. :)

    [ Szerkesztve ]

  • Cpt. Flint

    tag

    válasz martonx #2378 üzenetére

    nem azért csináltam, tényleg; csak jólesett rajta kicsit elmorfondírozni, meg csinosítgatni. :B

  • Cpt. Flint

    tag

    válasz cigam #2389 üzenetére

    na de akkor miért nem ad "type mismatch" hibát?

    (#2388) vilag:
    hmmm, nem maradtál véletlenül valahol "on error resume next"-ben?

    [ Szerkesztve ]

  • Cpt. Flint

    tag

    válasz martonx #2391 üzenetére

    napi hobbi. :D
    igazából mostanság már nem foglalkozom vele túl sokat, nekem is pár éve volt ebben a csúcs. de ha valami előjön, akkor nagyon bele tudom élni magam, szeretek vele tücskörészni. :) de olyan sok időm nincs rá, nekem is lett volna egy maszek, de sehogy se fért bele az életembe, végül visszaadtam. :(

Új hozzászólás Aktív témák