Keresés

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

  • #90999040

    törölt tag

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

    É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?

    Természetesen. A legegyszerűbb, ha az excel vba referenciáihoz hozzáadod a "Microsoft Word x.y Object Library"-t. Ez után már használhatod pl. így(vilag #1472-es hozzászólása alapján):

    Dim wrdApp As Word.Application
    Dim wrdDoc As Word.Document
    Set wrdApp = CreateObject("Word.Application")
    With wrdApp
    .Visible = True 'látszik a word alkalmazás
    Set wrdDoc = .Documents.Open(".doc fájl neve") 'megnyitja a word documentumot
    .ActiveDocument.MailMerge.MainDocumentType = Word.wdFormLetters
    .ActiveDocument.MailMerge.OpenDataSource Name:=".xls fájl neve", _
    LinkToSource:=True, _
    Format:=Word.WdOpenFormat.wdOpenFormatAuto, _
    Connection:="Munka1$", _
    SQLStatement:="SELECT * FROM `Munka1$`"
    With .ActiveDocument.MailMerge
    .Destination = Word.wdSendToPrinter
    .SuppressBlankLines = False
    With .DataSource
    .FirstRecord = 14
    .LastRecord = ig2 'saját változó
    End With
    .Execute Pause:=False 'Mailmerge futtatása
    End With
    End With
    'wrdDoc.Close 'documentum bezárása
    'wrdApp.Quit 'word bezárása
    'takarítás
    'Set wrdApp = Nothing
    'Set wrdDoc = Nothing

  • ArchElf

    addikt

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

    Amúgy VB6, vagy VB.NET?

    Általánosságban - kicsit olvasgassál még a változók hatóköréről...

    1. Hiába teszed publiccá, a függvény újra létrehozza változót és az felülcsapja (érvényességben) a globálisan létrehozott azonos nevű változót. A függvénynek át kell adni a változót. A globális változók használatát meg el kell felejteni.
    2. Ha megnézed a függvény paramétereit, ott van deklarálva a változó. A függvényt meg úgy hívod meg, hogy:
    csakszam TextBox1, KeyCode
    ActiveControl - le kell ellenőrizni, hogy az aktuális ActiveControl TextBox-e és csak akkor kell lefuttatni a függvényt.
    3. ez inkább csak hack... de azért nem rossz. De gondolom vágólap meillesztésre nem működik.
    4. MaskedTextBox: vb6, vb.net
    (bocs,. vb6 alatt MaskedEdit)

    AE

    [ Szerkesztve ]

    Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

  • ArchElf

    addikt

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

    Pedig jó volna ha megértenéd a változók hatókörét. Nem tudom milyen fejlesztési tapasztalatod lehet, de ez a VB-re nem nagyon terjed ki.

    Anélkül elég nehezen tudom elmagyarázni azt, amit látsz (és nem éresz meg). De röviden azért megpróbálom:
    - 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.
    - Ha definiálsz egy változót egy függvényben, attól még az onnan meghívott függvényekben a változó nem létezik. A változó hatóköre csak a definiálás helyére érvényes (kivétel a kód "gyökerében" globálisan definiált változók, de azok a függvényekben felüldefiniálhatók - pl. mint paraméter)
    - Használd az Option Explicit parancsot (kód legelején), hogy lásd, hogy minden változód helyesen van definiálva (és nem írtál el sehol semmit). Ez az utasítás kikényszeríti a változók definiálását.

    Az ActiveControl az aktuális konténerben aktív kontrolt kéri le. Arra meg kell nézned, hogy Container típusú-e és vannak-e tagjai, ha iden abban is meg kell nézni, hogy van-e aktív komponens -rekurzívan el lehet jutni az utolsó tagig, ami jelen esetben a TextBox1 komponens. De a KeyCode-ot és Shift-et nem lehet nem átadni. (Ha pedig odaírod, hogy ByVal - azaz érték és nem referencia szerinti átadás van -, akkor átkonvertálja neked az MSForms.ReturnInteger-t mezei Integer-ré)

    Option Explicit

    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    csakszam KeyCode, Shift
    End Sub

    Sub csakszam(ByVal KeyCode As Integer, ByVal Shift As Integer)
    Dim Vezerlo As Control
    Set Vezerlo = GetActive(ActiveControl)
    'MsgBox TypeName(GetActive(ActiveControl))
    If TypeName(Vezerlo) <> "TextBox" Then
    Exit Sub
    End If
    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

    Private Function GetActive(con As Control) As Control
    If TypeName(con) = "UserForm" Then
    Dim f As UserForm
    Set f = con
    Set GetActive = GetActive(f.ActiveControl)
    ElseIf TypeName(con) = "MultiPage" Then
    Dim mp As MultiPage
    Set mp = con
    Set GetActive = GetActive(mp.SelectedItem)
    ElseIf TypeName(con) = "Page" Then
    Dim pg As Page
    Set pg = con
    Set GetActive = GetActive(pg.ActiveControl)
    ElseIf TypeName(con) = "Frame" Then
    Dim fr As Frame
    Set fr = con
    Set GetActive = GetActive(fr.ActiveControl)
    Else
    Set GetActive = con
    End If
    End Function

    AE

    [ Szerkesztve ]

    Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

  • ArchElf

    addikt

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

    Azért olvasgass utána, jó? :) Google keresést csak akkor szoktam linkelni, ha az első oldalon nagyrészt csak releváns találatok vannak. Ebben az esetben nem szükségszerűen VBA témakörben - mivel ez az alapelv majd minden fejlesztői nyelvre azonos.

    Amúgy em nagyképű itt általában senki (legalább is itt a programozás fórumon talán nem azok a befordult kockák vannak csak, mint máshol...) Másrész nem kell offenzívnek venni azt, hogy egyből az a reakció, hogy "hülyeségeket kérdezel". Attól még, hogy megsértödsz, hülye a kérdés - legalább is azt mutatja, hogy az alpokkal nagyon nem vagy tisztában. Nem probléma magában ez sem - csak nem kell feltétlen arra várni, hogy valaki megoldjon helyetted mindent - és nem kell érzelmi irányba terelni a dolgot, hiszen gyakorlati kérdésben jöttél.
    Egy kis alázat nem árt, még ha nehezen is megy néha. Soha nem találkoztál az itt fórumozó emberekkel, és talán soha nem is fogsz - ha megvan a megoldás, vagy az oda vezető út, ne akadj fent azon, hogy valakinek rossz napja van. Itt mindenki önszántából magyarázná el (illetve - ha rossz napja van - éppen nem magyarázná el) 1001-szer az alapokat.

    Ha hobbi szinten csinálod, szánj rá - még - egy-két órát, és máris csak annyi hátrányban leszel, hogy nem tudod egyből hogy merre indulj el (nem pedig alapvető problémáid lesznek).

    GetActive - ha vannak benne új dolgok (a használt TypeName függvény kivételével) - pl. rekurzió, típusok, akkor tényleg mielőbb keríts egy (alapszintű, bármilyen nyelvet bemutató) programozási könyvet. Nem bántásból mondom: 20-30 oldal után kész megvilágosodásban lesz részed, ha van érzéked a témához.

    Sub csakszam(KeyCode, Shift) - ebben az esetben u.n. Varian típusra deklarálod a változókat (típus nélküli változó), ami az értékadáskor pontosítja a változó típusát. Használata mellőzendő, hacsak nem elkerülhetetlen - mivel növeli a kód bizonytalanságát. Ugyanez vonatkozik az Option Explicit-re is: célszerű használni, mert rákényszerít a pontosságra.

    MaskedEdit VB6 kontrol, nem VBA (VB 6.5 = Visual Basic for Applications = gyak. Office VB). Azért nem találtad, mert valami egységcsomagban lenne benne (asszem MS Common Controls, vagy valami hasonló) - neten rá kell keresni és lehetőleg MS oldalról letölteni.
    Azután ha megvan (feltelepítve), akkor először hozzá kell adni a References... hez, majd már használható lesz a kontroll-ok között.

    AE

    [ Szerkesztve ]

    Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

  • 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 ]

  • martonx

    veterán

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

    Bocs, igazad van, worksheet-et akartam írni.

    Én kérek elnézést!

  • martonx

    veterán

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

    Figyi, tökre örülök neki, hogy hónapok óta nem kellett excel makróznom (és ha minden igaz ez még sok évig így is marad :C ), de a kedvedért indítottam egy excelt. Pontos megoldást elvből nem vagyok hajlandó adni, az elv a lényeg. Aki értelmes annak ez úgyis elég, aki nem annak meg úgyis mindegy, hogy fél percet foglalkozok-e vele, vagy éveket.

    Szóval: Worksheet_Activate esemény van, sőt van Deactivate is, vedd úgy hogy ezeket akartam az open - close helyett írni.

    Én kérek elnézést!

  • martonx

    veterán

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

    Egyrészt igazad van, valóban nem volt jó az ötletem.
    Másrészt tényleg a te kedvedért nyitottam meg az excelt.

    Én kérek elnézést!

  • martonx

    veterán

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

    jaja, mondtam én, hogy a pszeudo kódomon még lehet mit tökéletesíteni :B

    Én kérek elnézést!

  • Fire_Vire

    tag

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

    A txt úgy működik mint egy csv fájl. A benne lévő adatok ";" vannak elválasztva.
    Minden loggolni kívánt eseménynél a txt-ben egy egész sornyi adat tárolódik le.
    Bocsánat mindenkinek a nem egyértelmű leírásért. Megpróbálom beszúrni a programkódomat.
    Jelen pillanatban a kiolvasásom így van megírva (AutoIt):

    ;### 2db feltétel esetén:
    If $keres_berendezes=1 And $keres_eszkoz=1 And $keres_DB=0 And $keres_hiba=0 And $keres_kezd_ido=0 And $keres_nyugta_ido=0 Then
    GUICtrlCreateListViewItem($count1&"|"&$count2&"|"&$count3&"|"&$count4&"|"&$count5&"|"&$count6, $listview)
    $talalatok=$talalatok+1
    EndIf

    If $keres_berendezes=1 And $keres_eszkoz=0 And $keres_DB=0 And $keres_hiba=1 And $keres_kezd_ido=0 And $keres_nyugta_ido=0 Then
    GUICtrlCreateListViewItem($count1&"|"&$count2&"|"&$count3&"|"&$count4&"|"&$count5&"|"&$count6, $listview)
    $talalatok=$talalatok+1
    EndIf
    .
    .
    ;### 3db feltétel esetén:

    If $keres_berendezes=1 And $keres_eszkoz=1 And $keres_DB=1 And $keres_hiba=0 And $keres_kezd_ido=0 And $keres_nyugta_ido=0 Then
    GUICtrlCreateListViewItem($count1&"|"&$count2&"|"&$count3&"|"&$count4&"|"&$count5&"|"&$count6, $listview)
    $talalatok=$talalatok+1
    EndIf
    .
    .
    .

    Ebből az IF ciklusból kellene számításaim szerint 720db de eddig csak 3 feltételig írtam meg ami kb. 21db.
    Ezt le lehetne egyszerűsíteni?

    [ Szerkesztve ]

    sajtosszenya.mybrute.com

  • martonx

    veterán

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

    Akkor már te se vagy mai gyerek :B
    VB-t napi szinten csinálod, vagy csak hobbi?
    Én hál' istennek már csak hobbiból (ahogy ez sajnos az itteni segítségeim színvonalán kezd is látszódni), bár lehet be fog futni egy maszek excel makrós meló, és megint visszakényszerülök excel makrózni. :(

    [ Szerkesztve ]

    Én kérek elnézést!

  • martonx

    veterán

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

    Én folyamatosan maszekolok, de a vbscriptet (excel makrót) már rég kinőttem. Ezért sincs időm (meg igaziból kedvem sem) ráugrani a topikban előjövő problémákra, mert napi szinten programozok mind fő, mind mellékállásban.

    Én kérek elnézést!

  • vilag

    tag

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

    Nem maradt On error resume next-ben

    Amikor csak lehet, ezt kerülöm pont azért, hogy ilyen hibák ne forduljanak elő.

    Egyelőre ez a probléma megoldódott.

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