Keresés

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

  • #90999040
    törölt tag

    Üdv!

    A következő problémára keresek választ:

    Adott egy userformon több frame, melyek szintén több vezérlőt tartalmaznak.
    Egy közbenső frame léptetési sorrendben utolsó vezérlőjének exit subjába írtam meg egy vizsgálatot, amely ebből következőleg a vezérlőből való kilépéskor elvégez bizonyos ellenőrzést.
    A probléma azonban az, hogy ha ez az adott frame utolsó (aktív) vezérlője, akkor az exit sub nem fut le sem akkor ha tabbal közlekedem, sem pedig akkor ha egérrel. Akkor fut le az említett exit sub ha újra visszatérek a frambe (mondjuk egérkattintással)

    Valakinek van ötlete, hogy mi okozza ezt, illetve, hogy hogyan lehet meggyógyítani vagy kitrükközni?

    Előre is köszönöm!

    Gondolom exit eseményt akartál írni, mert az exit sub egy kicsit más. ;)

    A lényeg az, hogy ez nem csak akkor következik be, ha az utolsó aktív vezérlőről van szó, hanem amikor egy frame-n belüli vezérlőről átváltasz egy frame-n kívülire. Ugyanis ilyenkor nem a frame-n belül levő vezérlő exit-je fut le, hanem a frame exit-je.

    Ezt pl. így ki lehet kerülni:

    A userformon belül létrehozol egy Control típusú változót, pl.: Private active As Control

    Ezután az adott frameben levő minden vezérlőjének Enter() eseményébe beírod ezt: Set active = Me.<Frame neve>.ActiveControl

    Az adott vezérlőd exit()-jébe pedig ezt:

    Private Sub <Vezérlőd>_Exit(.........
    If Not active Is Nothing Then
    'itt lehet meghívni az eseményt
    End If
    End Sub

    Ez mellett persze még a frame exit()-jét is le kell kezelni:

    Private Sub <Frame neve>_Exit(.......
    If Me.<Vezérlőd>.Name = Me.<Frame neve>.ActiveControl.Name Then
    Set active = Nothing
    'itt ugyanúgy meghívod a vezérlőd exit()-jénél végrehajtandó kódot
    End If
    End Sub

  • #90999040
    törölt tag

    Sziasztok.

    Van arra lehetőség, hogy Visual Basic 6.0-ban olyan programot csináljak, ami az egér kurzort egy megadott helyre mozgatja és ott kattint?

    Van egy elég monoton munkafolyamatom, ahol a monitor adott pontjaira kattingatok.
    Már fáj a csuklóm.
    Arra gondoltam, hogy csinálok egy olyan makrót, vagy akár VB6-os programot, ahol csak egy helyre kattingatok, és az előre megadott kordinátákra viszi az egeret, kattint, majd vissza az egér (hogy tudjak újra kattintani...).

    Nézegettem angol fórumokat, de nem nagyon értettem.

    Előre is köszi.

    Van rá lehetőség, winapi mouse_event(), vagy SendInput() függvényével.

    A mouse_event() használata egyszerűbb, de a MS már új fejlesztésekhez nem ajánlja. A SendInput() bonyolultabb, de ezzel pl. billentyűlenyomást is lehet generálni, és a MS ezt ajánlja inkább...

  • #90999040
    törölt tag

    megtaláltam:
    Sub rög4()
    'minta védelem feloldására
    Sheets("Munka2").Select
    'azért kell először feloldani a védelmet, mert a kijelölés munka1!a1 megszűnik
    pass = "123456789"
    ActiveSheet.Unprotect pass
    'most lehet másolni!
    Sheets("munka1").Select
    Range("a1").Select
    Selection.Copy
    Sheets("Munka2").Select
    Range("A1").Select
    ActiveSheet.Paste
    'majd rátenni a védelmet!
    ActiveSheet.Protect Password:=pass
    Sheets("munka1").Select
    End Sub :)

    Pontosan ezekről beszéltem. Ezt a kódot így is meg lehetne csinálni:

    Sheets("munka1").Select
    pass = "123456789"
    Sheets("munka2").Unprotect pass
    Sheets("munka1").Range("a1").Copy Destination:=Sheets("Munka2").Range("A1")
    Sheets("munka2").Protect Password:=pass

    Ez pontosan azt csinálja, amit a Tiéd, csak nem 11, hanem 5 sorban.
    Újra kihangsúlyozom: VBA-ban a Select és az Activate használatát csak elkerülhetetlen esetben célszerű használni, így a legtöbb esetben az Application.ScreenUpdating használata is feleslegessé válik(kivéve, ha az aktív munkalapra másolsz nagy mennyiségű adatot), valamint a kód is áttekinthetőbb.

  • #90999040
    törölt tag

    Sziasztok!

    Szeretném, ha a makróm futása közben nem mutatná az oldalakat ahonnan adatokat másol, csak a végeredményt!

    Biztosan van rá valami utasítás,csak még kezdő vagyok.

    Előre is köszi. :R

    Másolás közben kerüld a Select és az Activate használatát!!!

    Dim munkalap As String
    munkalap = "munka1"
    Worksheets(munkalap).Range("a1:c3").Copy _
    Destination:=Worksheets(munkalap).Range("e1")

    Ha a másolás után a célterületet szeretnéd aktívan látni, akkor arra add ki a Select-et.

  • #90999040
    törölt tag

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

    É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

  • #90999040
    törölt tag

    Bocs, de nekem ez nem eléggé világos (ez mondjuk az én hibám). Megtennéd, hogy részletezed kicsit?

    Elmondanád, hogy a fenti problémát hogyan oldanád meg ezzel a módszerrel?
    Mert ugyan most működik, de ha lehet akkor egyszerűsítek rajta, plusz a módszer ismerete biztosan nem fog káromra válni.

    Köszi!

    Ha az Excel VBA Tools >> References résznél hozzáadod a Microsoft Word x.y Object Library-t, akkor használhatod a Word objectumait.

    Dim wrdApp As Word.Application
    Dim wrdDoc As Word.Document
    Set wrdApp = CreateObject("Word.Application")
    wrdApp.Visible = True
    Set wrdDoc = wrdApp.Documents.Add
    'wrdDoc.Close
    'wrdApp.Quit

    Ez Excelből elindít egy word alkalmazást, hozzáad egy dokumentumot, és ha az utolsó 2 sor elejéről kiveszed az aposztrofokat, akkor be is zárja.
    Persze lehetne a referencia hozzáadása nélkül is, akkor viszont a Word.Application és a Word.Document helyett Object-eket kellene írni.

    Természetesen a word-ből is lehet az excel objektumait használni.

    Csak mint írtam, ekkor alapból nem "ismerik fel" a másik alkalmazás konstansait. ezért kell ezeket külön definiálni, mert különben teljesen mást csinál a kód, mint amit szeretnénk...

  • #90999040
    törölt tag

    Hali!

    Megoldódott a probléma! :))

    A kód (ezt kell a kívánt Word doksiba, vagyis a célfájlba írni):

    ActiveDocument.MailMerge.MainDocumentType = wdFormLetters
    ActiveDocument.MailMerge.OpenDataSource _
    Name:="xyz", _ 'forrásfájl helye
    LinkToSource:=True, _
    Format:=wdOpenFormatAuto, _
    Connection:="Munka1$", _
    SQLStatement:="SELECT * FROM `Munka1$`"

    With ActiveDocument.MailMerge
    .Destination = wdSendToPrinter
    .SuppressBlankLines = False
    With .DataSource
    .FirstRecord = 14
    .LastRecord = ig2 'saját változó
    End With
    .Execute Pause:=False
    End With

    Neház szülés volt, de meglett!!! :D

    ezt kell a kívánt Word doksiba, vagyis a célfájlba írni

    Ha a Word konstansait definiálod az Excelben, akkor Excelben is használható.
    Az Excel ugyanis alapból nem tudja a Word konstansait. Pl.:

    Const wdSendToPrinter = 1

    Ezeket az értékeket meg tudod nézni Wordben úgy, hogy kiiratod őket. Pl.:

    Debug.Print wdSendToPrinter

  • #90999040
    törölt tag

    S igen. Köszönöm!!! sikerült :C
    -de lenne még 1 kérdésem:
    Hogy tudom ezt futtatható állományként menteni? :F
    Köszönöm!

    A win1.exe-t megtalálod a c:\......\win1\win1\Bin\Debug mappában, amennyiben "win1" a projekt neve. De külön is le tudod fordítani a Build -> Build Solutionnal.

  • #90999040
    törölt tag

    Szeretném lecserélni, de Sajna a VB studio 2008hoz (meg máshoz se) nem értek :F

    Elindítom a prpgramot, és New Project- de ott kidob több dolgot is.
    Itt meiket kell kiválasztanom? próbáltam úgy hogy ezekközüll kiválasztottam egyet, és ott adtam hozzá modult, s abban szerettem volna írni, de különböző projecteknél különböző hiba.
    -bár mikor Formot inítottam, ott nem írt ki hibát a program (modulban), de hiába töröltem a formot, futtatásnál mégis előhozott egy üres ablakot.

    Elindítod a Vs 2008-at.
    File -> New -> Project...
    A megjelenő ablakban létrehozol egy Forms projektet.
    Project -> Add Module...
    A létrehozott modulba bemásolod a kódodat, majd megcsinálod vele, amiket előzőleg írtam.
    A modulba ezután beleteszed ezt:

    Sub Main()
    TEST()
    End Sub

    Ha ez megvan, akkor Solution Explorer ablakban*** dupla katt a "My project"-re.
    Itt az Application fülön az "Enable Application Framework" elől a pipát kiveszed.
    Ugyanezen a fülön "Startup Object"-nél a "Sub Main"-t választod ki.
    Ha mindent jól csináltál, akkor F5-re indulnia is kellene a programnak.

    ***: ha nem látszik ez az ablak, akkor View -> Solution Explorer

  • #90999040
    törölt tag

    Közvetlenül nem, kell írni hozzá egy COM Wrappert (legyen akár natív, akár .NET assembly). Pár dologra még oda kell figyelni a wrappelésnél, pl. struct nem használható. Ha valaminek a visszatérési vagy bemeneti értéke struct, akkor azt vagy szét kell szedni a com hívásban, vagy be kell csomagolni egy osztályba (és a wrapperben kibontani).

    Oly: Lehet, hogy segít...

    AE

    Igen így már lehet...

  • #90999040
    törölt tag

    Sziasztok!

    .bas to .exe Hogy?

    Microsoft Excel-ben /Makro/ Visual Basic Szerkesztő-ben írtam egy "modult" -vagy mit,
    mely LPT portot vezérel. (Sokat szenvedtem vele :C )
    Ezt a "programot" szeretném, excel nélküli, önnáló, futtatható állományként elmenteni.
    Excel (Visual basic szerkesztő) csak .bas kiterjesztést enged.
    iexpress-el próbáltam, de ott csak a háttérben fut le valami. (nem hiszem h az én progim, mert az adatbekéréssel kezdődik...)
    Már letöltöttem a Visual Basic 2008+Visual C Sharp progrot, de oda hiába másolom be amit írtam, futtatásná hibát ír ki. (már ha tudom futtatni ...)

    Hogy tudom, a .bas kiterjesztést .exe ként menteni? -vagy hogy tudom a fájlt Visual Basic 2008 vagy Visual C Sharp-ban működésre bírni?
    (esetleg extra lenne, ha a io.dll-fájlt nem kéne külön (ez kell a progihoz) bemásolnom system32-be hanem magával hordozná, vagy automatice bemásolná...-de ez tényleg csak extra..)
    Válaszokat előre is köszönöm!

    A megírt cucc ez lenne:

    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Public Declare Sub PortOut Lib "io.dll" (ByVal Port As Integer, ByVal Value As Byte)
    Public Declare Function PortIn Lib "io.dll" (ByVal Port As Integer) As Byte

    Sub TEST()
    Dim x As Long
    Dim y As Long
    Dim v As Long
    Dim c As Long
    kezdes:
    v = InputBox("Válasszon az alábbi lehetősékeg közüll" & Chr(13) & Chr(10) & "1- 6 számjegyű számláló" & Chr(13) & Chr(10) & "2- 7 számjegyű számláló")

    If v = 1 Then GoTo sz1
    If v = 2 Then GoTo sz2
    If v <> 1 Or 2 Then GoTo kezdes

    sz1:
    v = InputBox("Válasszon az alábbi lehetősékeg közüll" & Chr(13) & Chr(10) & "1- Egy megadott értéket bepörget" & Chr(13) & Chr(10) & "2- A megadott értéktől, egy megadott értékig pörget")

    If v = 1 Then GoTo elso1
    If v = 2 Then GoTo masodik1
    If v <> 1 Or 2 Then GoTo sz1

    elso1:
    x = InputBox("Írja be a bepörgetni kívánt értéket!")
    For i = 1 To x
    Call PortOut(888, 1)
    Sleep 500
    Call PortOut(888, 0)
    Sleep 500
    Next
    GoTo vege

    masodik1:
    x = InputBox("Írja be a jelenlegi számlálóállást!")
    y = InputBox("Írja be az elérni kívánt számlálóállást")
    c = (y - x)
    If (x > y) Then c = ((999999 - x) + 1 + y)
    For i = 1 To c
    Call PortOut(888, 1)
    Sleep 500
    Call PortOut(888, 0)
    Sleep 500
    Next
    MsgBox (c)
    GoTo vege

    sz2:
    v = InputBox("Válasszon az alábbi lehetősékeg közüll" & Chr(13) & Chr(10) & "1- Egy megadott értéket bepörget" & Chr(13) & Chr(10) & "2- A megadott értéktől, egy megadott értékig pörget")

    If v = 1 Then GoTo elso2
    If v = 2 Then GoTo masodik2
    If v <> 1 Or 2 Then GoTo sz1

    elso2:
    x = InputBox("Írja be a bepörgetni kívánt értéket!")
    For i = 1 To x
    Call PortOut(888, 1)
    Sleep 500
    Call PortOut(888, 0)
    Sleep 500
    Next
    GoTo vege

    masodik2:
    x = InputBox("Írja be a jelenlegi számlálóállást!")
    y = InputBox("Írja be az elérni kívánt számlálóállást")
    c = (y - x)
    If (x > y) Then c = ((9999999 - x) + 1 + y)
    For i = 1 To c
    Call PortOut(888, 1)
    Sleep 500
    Call PortOut(888, 0)
    Sleep 500
    Next
    MsgBox (c)
    GoTo vege

    vege:
    MsgBox ("SZÁMLÁLÓ BEÁLLÍTVA" & Chr(13) & Chr(10) & "TOVÁBBI JÓ MUNKÁT!")
    End Sub

    Visual Basic 2008-ra javaslom a következőket:

    A Long-okat cseréld le Integer-re.

    Az inputboxokat pedig módosítsd így:
    v = Integer.Parse(InputBox("Válasszon az alábbi lehetősékeg közüll" & Chr(13) & Chr(10) & "1- 6 számjegyű számláló" & Chr(13) & Chr(10) & "2- 7 számjegyű számláló"))

    Az Integer.Parse() (vagy más konverziós függvény) azért kell, mert Vb.net-ben az inputbox stringet ad vissza.

  • #90999040
    törölt tag

    Szia!

    Javaslom neked a vbscriptet. Az 95%-ban kompatibils az office makróval.
    Azaz a kódodat másold át notepad-be, majd mentsd le .vbs néven.
    Ezt command line-ból cscript valami.vbs néven fogod tudni futtatni.

    Debugolni pedig cscript //X //D valami.vbs-ként fogod tudni, ha mégsem menne egy az egyben vbs-ként.

    Javaslom neked a vbscriptet.

    Vbscriptben Windows API függvény??? :Y

  • #90999040
    törölt tag

    Az a probléma, hogy az adatok megőrzéséhez kell kell valami struktúra, ami könnyen kereshető. Vbs-ben csak dictionary van, amit nem tudom lehet-e keresni.
    A hashtable-t beteszem egy ideiglenes tárba (ScriptContext), és onnan olvassa be a következőként futó script.

    AE

    Ez így tökéletesen működik:

    Class RelStore
    'Cache Time 5 min

    Private d_Timer
    Private b_Member
    Private b_Init
    Private VALIDITY

    Private Sub Class_Initialize
    VALIDITY = 300
    d_Timer = 0
    b_Member = False
    b_Init = False
    End Sub

    Public Function Initialize(Membership)
    d_Timer = Timer
    b_Member = Membership
    b_Init = True
    End Function

    Public Sub Invalidate()
    Class_Initialize
    End Sub

    Public Function IsMember()
    IsMember = b_Member
    End Function

    Public Function IsValid()
    IsValid = (b_Init AND ((Timer > d_Timer + VALIDITY) OR (Timer < d_Timer)))
    End Function
    End Class

    Set rs = new RelStore
    DebugWrite rs.isvalid

    Szerintem ez: htCache(SearchString) nem RelStore classt ad vissza.

  • #90999040
    törölt tag

    Gyors VBScript kérdés...
    Csináltam egy kicsi osztályt (alant), és egy Hastable-be bepakolom (tudom talán kicsit meredek). A problémám az, hogy az egyik függvényt nem hajlandó meghívni a futtatókörnyezet...
    Osztály:
    Class RelStore
    'Cache Time 5 min

    Private d_Timer
    Private b_Member
    Private b_Init
    Private VALIDITY

    Private Sub Class_Initialize
    VALIDITY = 300
    d_Timer = 0
    b_Member = False
    b_Init = False
    End Sub

    Public Function Initialize(Membership)
    d_Timer = Timer
    b_Member = Membership
    b_Init = True
    End Function

    Public Sub Invalidate()
    Class_Initialize
    End Sub

    Public Function IsMember()
    IsMember = b_Member
    End Function

    Public Function IsValid()
    IsValid = (b_Init AND ((Timer > d_Timer + VALIDITY) OR (Timer < d_Timer)))
    End Function
    End Class

    Ahol kicsomagolnám a Hastable-ből:
    If htCache.ContainsKey(SearchString) Then
    Set rs = htCache(SearchString)
    If rs.IsValid Then
    IsMember = rs.IsMember
    Else
    IsMember = False
    htCache.Remove SearchString
    End If
    Else
    DebugWrite "Object NOT found in cache: " & SearchString
    End If

    Hibaüzenet:
    An error occurred on line 97 while executing script 'User Group Check'
    Source: Microsoft VBScript runtime error
    Description: Object doesn't support this property or method: 'rs.IsValid'

    Ja és próbáltam már így is
    Public Property Get IsValid
    IsValid = (b_Init AND ((Timer > d_Timer + VALIDITY) OR (Timer < d_Timer)))
    End Property

    AE

    Ja és próbáltam már így is

    Valószínűleg nem az IsValid()-el van probléma, hanem hogy a htCache(SearchString) nem megfelelő típust vagy esetleg Nothing-ot ad vissza. Első lépésben vizsgálnám Nothing-ra:
    if (rs is Nothing) then
    'ide pl. valami kiiratás
    End If

  • #90999040
    törölt tag

    Sziasztok! VB6-tal kapcsolatban lenne kérdésem. Szeretnék számokat sorba rendezni. Van egy listám(list1), amihez egy gomb segítségével véletlen számokat adok. Egy másik gombbal pedig szeretném növekvő sorrendbe rendezni őket. Arra gondoltam, hogy páronként összehasonlítom az elemeket és az elem indexét kicserélem. Az elméleti megoldásom, hogy egy változóba eltárolom a lista elemek értékét, és ezt egy ciklussal léptetem a listavégig. Egy másik változó lenne az indexek, ami szintén egy ciklusban futna. Ha a k-dik elem kisebb, mint a k+1-dik, akkor a k-dik elem indexe legyen 0. A problémám az, hogy nem tudom összekapcsolni az elem értékét és az indexét. De vhogy sehogy sem akar működni. Tudna vki küldeni programkódot, vagy van vmi egyszerűbb megoldás? Előre is köszönöm.

    Ha csak 1-szerű sorbarendezést szeretnél:

    Private Sub Command2_Click()
    Dim rendezendoe As Boolean
    Dim szamlalo As Integer
    Dim temp As String
    Do
    rendezendoe = False
    For szamlalo = 0 To List1.ListCount - 2
    If (List1.List(szamlalo) > List1.List(szamlalo + 1)) Then
    rendezendoe = True
    temp = List1.List(szamlalo)
    List1.List(szamlalo) = List1.List(szamlalo + 1)
    List1.List(szamlalo + 1) = temp
    End If
    Next
    Loop Until rendezendoe = False
    End Sub

  • #90999040
    törölt tag

    igaz, az sem derült ki pontosan, hogy mit is ért űrlap alatt :))

    Én azért szeretem ezt a megoldást jobban, mert így anélkül lehet inicializálni, hogy az az Excel-ben vizuális felületen megjelenne, valamint nem kell a munkalap elrejtésével sem foglalkozni.

  • #90999040
    törölt tag

    Hi!

    valaki tudja, hogy működik a 2010-es excel alatt az ürlapkészítés???
    olyat szeretnék hogy egy listából kiválasztok egy elemet, s egy másik
    listában ettől függően jelennek meg a választható elemek, s végül
    kiíratni az eredményt. :))

    Vagy:

    1. Eszközök >> Makró >> Visual Basic Editor (ill. ALT+F11)
    2. A megjelenő ablakban: Insert >> UserForm

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