Hirdetés

2024. május 3., péntek

Gyorskeresés

Útvonal

Fórumok  »  Szoftverfejlesztés  »  Visual Basic

Hozzászólások

(#1451) Zsargon89


Zsargon89
csendes tag

Köszönöm a segítséget mindenkinek!!! :R
Összejött :DD

(#1452) RexpecT


RexpecT
addikt

Előző félévben C++ -ot tanultam az egyetemen, ebben a félévben VB lesz.Mennyire piacképes a nyelv?Szerintem a C++ -ot érdemesebb lett volna folytatni, szélesebb felhasználást biztosít.Vagy rosszul gondolom, jöhetnek a Pro és Kontra érvek :).Egyébként Gazdaság Informatika szakra járok.

(#1453) ArchElf válasza RexpecT (#1452) üzenetére


ArchElf
addikt

Ha esetleg Risk/Controlling területre kerülsz, akkor a VBA jól fog jönni (Excel/Access alapú elemző "szoftverek" vannak szinte mindenhol) :(

AE

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]

(#1454) martonx válasza RexpecT (#1452) üzenetére


martonx
veterán

Gazdasági informatikán a C++-al kitörölheted.

Én a VB-vel elfogult vagyok, makró programozáshoz baromi nagy segítség a VB tudás, személy szerint a VB.Net nagy kedvencem (ennek mondjuk gyakorlatilag eltűnt a piaca), a vbscript is hasznos lehet céges, hardver üezemeltetési környezetben.

Én kérek elnézést!

(#1455) RexpecT


RexpecT
addikt

Értem, köszi a válaszokat.Ezen kívül még lesz Progab1 illetve Proglab2 tárgyam is majd a következő és a rákövetkező félévben.Eddig ott vagy C# vagy JAVA vagy PHP volt, ha jól tudom, de most lehet változtatnak.De a lényeg, hogy hasznát lehet venni a munkaerőpiacon :R .

(#1456) Brown ügynök


Brown ügynök
senior tag

Nemrég kezdtem el VB.NET-t tanulni VS 2008 E-n. A feladat egy hiteltörlesztő program elkészítése lenne, ami a megadott paraméterek alapján kiszámítaná a törlesztés összegét havi bontásban és ezt táblázatos formában jelenítené meg.

Egyelőre annyit szeretnék, hogy a megadott adatokat (dátum, futamidő, stb.) kiírassam a táblázat első sorába. Eddig jutottam a dátummal:

Private Sub Szamolas() Handles btnCalculate.Click

Dim Datum As Date
Dim Grid As String

Datum = DateTimePicker1.Text

Grid = Datum

End Sub

Tisztában vagyok vele, hogy a Grid = Datum nem jó de a neten nem tudtam kiszűrni ezt kis részt ami nekem kell.

"hacsak nem jön a jó tündér break utasítás képében..."

(#1457) ArchElf válasza Brown ügynök (#1456) üzenetére


ArchElf
addikt

VS2008 mellé használd az MSDN-t, és rögtön tudod, melyik osztály mit csinál.
Amúgy a leít kódodban nem az a rossz, sor, hanem az aláhúzott:
Private Sub Szamolas() Handles btnCalculate.Click
Dim Datum As Date
Dim Grid As String
Datum = DateTimePicker1.Text
Grid = Datum
End Sub

A Date (azaz DateTime) szerintem nem eszi meg közvetlenül a string-et, hanem fel kell dolgozni a Parse függvénnyel. Ráadásul a DateTimePicker-nek van közvetlen property-je a Dátum lekérdezásáre, ez a Value. Ha pedig DateTime-ot akarsz String-gé formázni, arra (általában minden más osztálynál is) ott a ToString metódus, ami az bject osztályból öröklődik:
Private Sub Szamolas() Handles btnCalculate.Click
Dim Datum As DateTime
Dim Grid As String
Datum = DateTimePicker1.Value
Grid = Datum.ToString()
End Sub

Ja, és ez még semmit nem ír ki sehová :)

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]

(#1458) Brown ügynök válasza ArchElf (#1457) üzenetére


Brown ügynök
senior tag

Nézem én az MSDN-t de hatalmas anyag. :D

Esetleg a megjelenítésre tudnál valami rávezetőt írni / linkelni?

"hacsak nem jön a jó tündér break utasítás képében..."

(#1459) Brown ügynök válasza Brown ügynök (#1458) üzenetére


Brown ügynök
senior tag

Sikerült így megoldani:

Private Sub Szamolas() Handles btnCalculate.Click

Dim DatumCH As Date
Dim Datum As String
Dim Hitel As Int32
Dim DG As New DataTable()

Dim lRow As New DataGridViewRow

DatumCH = DateTimePicker1.Value
Datum = DatumCH.ToString()

Hitel = NumericUpDown1.Value


Dim Cell1 As New DataGridViewTextBoxCell
Cell1.Value = Hitel
lRow.Cells.Add(Cell1)

Dim Cell2 As New DataGridViewTextBoxCell
Cell2.Value = Datum
lRow.Cells.Add(Cell2)

grdTorlesztesiTerv.Rows.Add(lRow)

End Sub

Na most így minden cella értékét sorban kell megadni (ahogy a fejléc diktálja). Ez hasonlít kicsit a javascriptre. Van ennél egyszerűbb / jobb megoldás? Vagy egyéb tanács?

"hacsak nem jön a jó tündér break utasítás képében..."

(#1460) Brown ügynök


Brown ügynök
senior tag

Lenne egy problémám, amivel már sokat foglalkoztam de nem akar összejönni a megoldás...

Cél: Azt szeretném elérni, hogy a Do Loop Until ciklus addig futtassa a For Next ciklust, amíg a For Next ciklus végére az egyik cella értéke el nem éri a nullát.

A For Next lefutása esetén annyi történik, hogy a DataGridView-hoz hozzáadódik egy újabb sor, bizonyos számított értékekkel. Ezt egészen addig teszi amíg a futamidő tart (pl. 12 hónap, 12 sor). Igen ám, de a 0. sorban szeretném megjeleníteni a kiinduló értékeket, (tehát összesen 13 sor jelenne meg ) Hogy lehetne ezt megoldani?

Következő kérdés: A Do Loop Until-nak addig kellene futnia, amíg For Next ciklusban a ciklus végére az egyik oszlop értéke 0 nem lesz. Tehát valahogy érték változásokat kellene rögzítenem, mielőtt újból lefut a For Next. Hol változtassam meg az értéket, hogy a For Next a megváltozott értékekkel fusson?

És egy utolsó kérdés. Amikor a For Next lefutott ( 13 sor ), hogyan tudom eltüntetni ezeket a sorokat és a legközelebbi számításnál, újra csak 13 sort megjeleníteni?

Nagy segítség lenne. :)

"hacsak nem jön a jó tündér break utasítás képében..."

(#1461) vilag


vilag
tag

Hali!

Számomra megoldhatatlannak tűnő problémába ütköztem.
Arról lenne szó, hogy van nekem egy postakönyv.xls táblám. Ebben tárolom soronként az adott levélhez tartozó értékeket. Ez a tábla szolgál adatbázisként egy (illetve több) wordfájlhoz (mint boríték és tértivevény sablon).

Azt szeretném elérni, hogy a postakönyv mentése után ne kelljen azt bezárnom és a kívánt wordfájlt elindítva (a már korábban csatolt postakönyv.xls-t sql futását engedélyezve) nyomtatnom.

A cél az lenne, hogy a postakönyvből userform segítségével tudjam meghatározni, hogy melyik word fájlt indítsa el (természetesen csak a háttérben) és mettől meddig terjedő tételeket nyomtassa ki.

A megoldás már félig megvan. Odáig eljutottam, hogy az excellel elindítom a kívánt wordfájlt, majd hozzácsatolom a postakönyv.xls-ből kiexportált (ez a rész is megírva) nyomtatas.xls-t.

Léptetésben működik is a dolog, egyedül ott akad meg a dolog, hogy rákérdez, hogy az adatbázis tábla melyik lapját kívánom csatolni és az eslő sora oszlopfejléceket tartalmaz e.

Azt szeretném elérni, hogy ez ne akassza meg a folyamatot és ne legyen rákérdezés, hanem az előre definiált lapot csatolja és az első sor oszlopfejléceket tartalmazzon.

Eddig a programkód:
channelnumber = Application.DDEInitiate(app:="WinWord", topic:=op1)
Application.DDEExecute channelnumber, "[fileopen .name=""V:\Postakönyv\00-TV_sablon_(16,5x10,6_cm)1.doc""][mailmergeopendatasource .name=""V:\Postakönyv\nyomtatas.xls"" ][mailmergeopendatasource .SQLStatement:=SELECT * FROM `Munka1$`][mailmerge .destination=1, .mergerecords=1, .from=14, .to=" + ig + ", .mailmerge][appclose ""word""]" '[FILEPRINT .range=0]" '[appclose " + Chr(34) + "word" + Chr(34) + "]" '[toolsoptionssave .globaldotprompt=0]

Ahol op1 = "V:\Postakönyv\00-TV_sablon_(16,5x10,6_cm).doc"
ig = Trim(Str(hanysor + 13))
ahol:
hanysor= hány tételt kell nyomtatni

Előre is köszönöm a segítséget!

(#1462) Brown ügynök válasza Brown ügynök (#1460) üzenetére


Brown ügynök
senior tag

1. Ha a sorszám = 0 akkor kiíródnak az alapadatok.

2. A Next előtt, miután hozzáadtuk az aktuális sort megvizsgáljuk a szükséges cella értékét. Ha nem 0 akkor változtatunk a szükséges értékeken.

3. Me.DataGridView1.Rows.Clear()

"hacsak nem jön a jó tündér break utasítás képében..."

(#1463) martonx válasza vilag (#1461) üzenetére


martonx
veterán

Lehet nagyon banális ötlet, de megnézném makró rögzítéssel, hogy milyen makrót ír a fenti cselekvés sorozatnál. Esetleg msdn, vagy gugli nem javasol valami okosat?

Én kérek elnézést!

(#1464) vilag válasza martonx (#1463) üzenetére


vilag
tag

Ezeken már túl vagyok, de a wordben rögzített makrót nem tudom maradéktalanul átfordítani excelbe, mert nem egészen értem minden részét, de valaki ebben segít akkor lehet, hogy meg is oldódik a probléma. Alább a rögzített makró:

Sub
ActiveDocument.MailMerge.MainDocumentType = wdFormLetters
ActiveDocument.MailMerge.OpenDataSource Name:= _
"V:\Postakönyv\nyomtatas.xls", ConfirmConversions:=False, ReadOnly:=False _
, LinkToSource:=True, AddToRecentFiles:=False, PasswordDocument:="", _
PasswordTemplate:="", WritePasswordDocument:="", WritePasswordTemplate:= _
"", Revert:=False, Format:=wdOpenFormatAuto, Connection:= _
"Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=V:\Postakönyv\nyomtatas.xls;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type" _
, SQLStatement:="SELECT * FROM `Munka1$`", SQLStatement1:="", SubType:= _
wdMergeSubTypeAccess

End Sub

Addig eljutottam, hogy az "SQLStatement" adja meg a munkalapot, de még így is megáll (gondolom azért mert nem tudtam megadni a fejléc van/nincs-re a választ. Szóval az ablak így is feljön, a különbség csupán az, hogy nincs egyetlen egy kiválasztható munkalap sem a listán.

Sejtem, hogy a Extended Properties=""HDR=YES kell nekem, de nem tudom úgy megírni az excelben, hogy az eljáráshíváskor az is átkerüljön.

(#1465) martonx válasza vilag (#1464) üzenetére


martonx
veterán

hm, mezitlábas ötlet, de ha a használt excelből kitörlöd a többi munkalapot csak az az egy marad meg benne, akkor is rákérdez, hogy melyik munkalapot akarod használni?
A fejléccel kapcsolatban nincs ötletem.

Én kérek elnézést!

(#1466) martonx válasza vilag (#1464) üzenetére


martonx
veterán

hopsz a munkalap választásra megvan a válasz, gugli a barátod :)
Tedd bele az OpenDataSource-ba, hogy : Connection:="Munka1"
Ennek analógiájára, lehet lenne valami Headers:=true is vagy ilyesmi. Ez utóbbi csak ötlet volt. Ááá a HDR:=YES; mintha pont ezt jelentené

.OpenDataSource Name:="C:\Documents\Names.xls", _
ReadOnly:=True, _
Connection:="Sales"

Szóval akkor nem a header-rel lesz bajod, hanem a munkalap kiválasztásával.

Esetleg még egy próba lehetőség letiltani a felugró ablakokat, ilyenkor hátha csöndben a háttérben megcsinálja? Application.DisplayAlerts = false

Én kérek elnézést!

(#1467) Senki9876


Senki9876
tag

Egy VB programozóra lenne szükségem aki tudna segíteni egy VB ben írt program átalakításában.
Ha valakinek lenne ideje segíteni, rám írhatna.
:D
Előre is köszönöm a segítséget.

"Nem törődöm azzal, hogy az emberek nem ismernek, azzal törődöm, hogy nem ismerem az embereket." Kung Fu-Ce

(#1468) neo446


neo446
csendes tag

Sziasztok!
Excel bajom van és hátha tud valaki segíteni.
A feladat az lenne, hogy egy adott összeghez meg kell határoznom az utalási költséget.
Vagyis van A-B-C oszlopom, és ebben fel vannak sorolva az értékhatárok és hogy mennyi az utalási költség.
A,B,C
0,100,5
101,300,50
301,500,100
501,1000,150
1001,2000,200
stb...
Egy olyan függvényre lenne szükségem, aminek mondok egy utalandó összeget ezt összeveti az A-B oszlopokkal és visszaadja a C oszlopban szereplő utalási költséget.
Logikai függvényekkel próbáltam megoldani, de sajnos túl sok sort kell vizsgálni/felsorolni és szegény excel besokal tőle.
Köszönöm a segítséget előre is!

(#1469) martonx válasza neo446 (#1468) üzenetére


martonx
veterán

FKERES függvény pont ezt csinálja :DDD
A lényeg csak a B és a C oszlop az esetedben. Excelben nyomsz egy F1-et, majd rákeresel az FKERES-re, elolvasod mit ír, és menni fog ez. Fél perces ujjgyakorlat.
Miért kell ehhez Visual Basic?

Én kérek elnézést!

(#1470) neo446 válasza martonx (#1469) üzenetére


neo446
csendes tag

Próbálkoztam az fkeressel, de elsőre nem jött össze a mutatvány.
Nekifutok akkor még egyszer, köszi a tippet.

(#1471) martonx válasza neo446 (#1470) üzenetére


martonx
veterán

Ha esetleg mégse menne, akkor szólj, fél percet bármikor szívesen rászánok mások segítésére.

Én kérek elnézést!

(#1472) vilag válasza martonx (#1466) üzenetére


vilag
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

[ Szerkesztve ]

(#1473) #90999040 válasza vilag (#1472) üzenetére


#90999040
törölt tag

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

(#1474) Brown ügynök


Brown ügynök
senior tag

Annuitásos módszerrel ki kell számolnom a hitel törlesztőrészletet egy adott futamidőre. Ez excelben a célérték kereséssel könnyen megoldható. Azonban nekem úgy kell megírnom a programot, hogy excel beágyazás ne legyen benne.

Addig sikerült eljutni, hogy ha a kintlévőség a futamidő végére nem nulla akkor case select állapotokkal meghatározom, mennyit korrigáljon (mennyit adjon hozzá / vegyen el) a törlesztőrészleten. Pl:

Select Case kintlévőség
Case 500 To 1000
törlesztő += 0.1
stb.

Ez így baromi hosszú programkódot eredményez. Ezt kellene nekem valami matematikai összefüggés segítségével redukálnom. Bármilyen konstruktív ötletet jöhet, pl. segítenétek megérteni, hogyan is működik a goal seek fv. az is nagy segítség lenne (azt hiszem).

[ Szerkesztve ]

"hacsak nem jön a jó tündér break utasítás képében..."

(#1475) ArchElf válasza Brown ügynök (#1474) üzenetére


ArchElf
addikt

Annuitásos módszernek van leírása, vagy matematikai modellje (kell hogy legyen)...?

AE

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]

(#1476) Brown ügynök válasza ArchElf (#1475) üzenetére


Brown ügynök
senior tag

Van, a wikipédián találtam. [link] Nem nagyon tudtam értelmezni a képletet. Most jut eszembe, talán angolul bővebb leírás van róla. :)

"hacsak nem jön a jó tündér break utasítás képében..."

(#1477) martonx válasza Brown ügynök (#1476) üzenetére


martonx
veterán

egyedül a pénzáram nem érthető számomra, a többi szimpla matematikai műveleteket jelent a kamatlábbal.

Én kérek elnézést!

(#1478) Brown ügynök válasza Brown ügynök (#1476) üzenetére


Brown ügynök
senior tag

Itt lesz a megoldás elrejtve: [link] Azt szeretném kérdezni, hogy az első példában mikor helyettesítünk"a"-ba és mikor "b"-be?

[ Szerkesztve ]

"hacsak nem jön a jó tündér break utasítás képében..."

(#1479) Brown ügynök válasza Brown ügynök (#1478) üzenetére


Brown ügynök
senior tag

Az a lényeg, hogy a-t behelyettesítve mindig negatív oldalról közelít a 0-hoz, b-t behelyettesítve pedig pozitív oldalról.

"hacsak nem jön a jó tündér break utasítás képében..."

(#1480) vilag válasza #90999040 (#1473) üzenetére


vilag
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!

(#1481) Zsargon89


Zsargon89
csendes tag

Sziasztok!

Itt van egy program kód, és ezt szeretném megcsinálni, hogy ne LPT-n hanem USB-n tudjam használni. Ezt hogy tudom megtenni? milyen dll-t töltsek le? s milyen parancsokkal tudom ki be kapcsolni? -esetleg ha veszek egy USB to LPT átalakítót, akkor működne a jelenlegi program? maradna az LPT port címe ugyan ez?
(Olyan laptopon kéne lefuttatni ezt a progit, amiben nincs PLT port)

Választ előre is köszönöm!

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 1
Call PortOut(888, 0)
Sleep 1
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 1
Call PortOut(888, 0)
Sleep 1
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 1
Call PortOut(888, 0)
Sleep 1
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 1
Call PortOut(888, 0)
Sleep 1
Next
MsgBox (c)
GoTo vege

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

(#1482) #90999040 válasza vilag (#1480) üzenetére


#90999040
törölt tag

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...

(#1483) martonx válasza Zsargon89 (#1481) üzenetére


martonx
veterán

VB.Net tud alapból mindenféle Serial Portot kezelni.
Az USB pedig nem más mint Universal Serial Bus, azaz egy serial port.
Még nagy guglizás sem kell hozzá, msdn-en egész jó példák vannak.
A kódod esetében már múltkor is pedzegettem, hogy nincs szükség benne a winapi hivatkozásokra.

http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx#Y0

Én kérek elnézést!

(#1484) martonx válasza Zsargon89 (#1481) üzenetére


martonx
veterán

Most komolyan miben van manapság LPT port? Valami ledet villogtat a programod, nem lenne jobb magát a hardvert USB-síteni, a gyakorlatilag nem létező LPT helyett?

Én kérek elnézést!

(#1485) Cpt. Flint válasza #90999040 (#1482) üzenetére


Cpt. Flint
tag

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. :((

(#1486) Cpt. Flint válasza #90999040 (#1482) üzenetére


Cpt. Flint
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?

(#1487) #90999040 válasza Cpt. Flint (#1486) üzenetére


#90999040
törölt tag

É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

(#1488) öcsi-bácsi


öcsi-bácsi
csendes 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

[ Szerkesztve ]

(#1489) #90999040 válasza öcsi-bácsi (#1488) üzenetére


#90999040
törölt tag

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.

(#1490) öcsi-bácsi válasza #90999040 (#1489) üzenetére


öcsi-bácsi
csendes tag

Köszi, rendes vagy.

Közben találtam egy megoldást:
'visszhang kikapcs
Application.ScreenUpdating = False
"makró fut"
Application.ScreenUpdating = True

Ami viszont közben kérdésessé vált: adatokat másolok egy űrlapról makróval, egyik excel lapról a másikra, viszont szándékaim szerint a második lap egyfajta adatbázis lesz, amit ellátnék lapvédelemmel. Viszont a makróm természetesen megáll, ha a második lap védelmét bekapcsolom.
Kérdésem: hogyan másolhatna a makróm mégis ide adatokat? :U

(#1491) öcsi-bácsi válasza öcsi-bácsi (#1490) üzenetére


öcsi-bácsi
csendes 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 :)

(#1492) #90999040 válasza öcsi-bácsi (#1491) üzenetére


#90999040
törölt tag

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.

[ Szerkesztve ]

(#1493) öcsi-bácsi válasza #90999040 (#1492) üzenetére


öcsi-bácsi
csendes tag

Köszönöm, hasznosítani fogom a leírtakat.

(#1494) öcsi-bácsi


öcsi-bácsi
csendes tag

Sziasztok!
Accses lekérdezés adatait szeretném world körlevélbe illeszteni.
Van ötletetek, hogyan tehetném meg?
Akár VB, akár acces jelentés formája érdekelne.

[ Szerkesztve ]

(#1495) martonx válasza öcsi-bácsi (#1494) üzenetére


martonx
veterán

Írsz egy word makrót. Ez a makró az alábbiakat fogja csinálni:

1. létrehoz egy excel fájlt, amiben minden futásakor frissíti access-ből az adatokat.
2. elindítja megfelelően felparaméterezve a körlevél generálót

Ennyi. A 2-es pontra pont itt feljebb találsz példa makrót, az 1-es pont se olyan nagy kaland. Egyébként a word körlevél varázslója milyen adatforrásokat fogad el? Csak excel? (Az itthoni gépemen bevallom LibreOffice van, így nem tudom megnézni :B )

Én kérek elnézést!

(#1496) öcsi-bácsi válasza martonx (#1495) üzenetére


öcsi-bácsi
csendes tag

Köszönöm, próbálkozok. :))

(#1497) vilag


vilag
tag

Üdv!

Újabb fogós kérdés merült fel.

Egy multipage egyik lapján egy különböző frameeken belűl vannak nekem egy vezérlőim.

A vezérlőkbe beírható karaktereket szeretném korlátozni. Mivel egy részüknél ugyan az a korlátozás szükséges (vagyis csak számok írhatóak be), subrutinná tettem egy eddig vezérlőnként alkalmazott eljárást.

Sub csakszam()

'8: backspace, 9: tabulátor, 13: enter, 17: Ctrl, 32: space, 46: delete, 48-57: felső számok, 86: v, 96-105: numpad számok, 109: numpad mínuszjel, 110: numpad pont, 186: é, 187: ó,
'188: vessző, 189: kötőjel, 190: pont, 191: ü, 192: ö, 219: ő, 220: ű, 221: ú, 222: á, 226:í

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

End Sub

A vezlőnél pedig ez van megírva:

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

csakszam

End Sub

Gondolom sejtitek, hogy ez így nem működőképes (vagyis nem általánosságban), különben nem írtam volna.

Gondoltam könnyen általánossá tehető a dolog egy huszárvágással, mert a "Textbox1" helyére egyszerűen bevezetek egy változot, amely mindig az aktuális vezérlő nevét helyettesíti.
Azonban úgy nem működőképes a dolog.
Egyik okát tudom: a KeyCode "rendszerváltozó" tartalma nem vihető át egy másik rutinba csak egy változón keresztül (mondjuk azt nem értem miért nem tehető a KeyCode rendszerváltozó egyszerűen publikussá, erre is várok valami okosat ha lehet). Ezt még meg is oldottam.

NADE, azt mondja meg valaki, hogy hogyan lehet kinyerni, hogy melyik az aktív vezérlő????
Mert ugyan is ha beteszem mondjuk, hogy:

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

x=ActiveControl
csakszam

End Sub

akkor az x értéke furcsa módon nem az lesz, hogy "Textbox1", hanem az, hogy "Multipage1".

Pedig a súgója azt állítja, hogy az aktív vezérlő nevét adja eredményül, már pedig én erősen a Textbox1-ben buzerálódom.

Várom a megoldási javaslatokat, esetleg konkrét kódrészlettel is.
Az is érdekelne (ahogy fentebb is írtam, hogy ha meg tudja mondani valaki), hogy a KeyCode rendszerváltozó miért nem tehető publikussá.

Köszönöm a segítségeteket!!!!!!!

(#1498) ArchElf válasza vilag (#1497) üzenetére


ArchElf
addikt

Átvihető, csak át kellene adni neki.
A változók a VB-ben nem globálisak (hacsak nem annak lettek definiálva), a hatókörük csak az adott szerkezetre (szubrutinra, osztályra) vonatkozik.
így add át neki:
Sub csakszam(tb As TextBox, kc As Integer)
'8: backspace, 9: tabulátor, 13: enter, 17: Ctrl, 32: space, 46: delete, 48-57: felső számok, 86: v, 96-105: numpad számok, 109: numpad mínuszjel, 110: numpad pont, 186: é, 187: ó,
'188: vessző, 189: kötőjel, 190: pont, 191: ü, 192: ö, 219: ő, 220: ű, 221: ú, 222: á, 226:í
If kc = 8 Or kc = 46 Or _
(kc >= 48 And kc <= 57) _
Or (kc >= 96 And kc <= 105) Then
tb.Locked = False
Else
tb.Locked = True
End If
End Sub

Amúgy miért locked, ennek így semmi értelme nincs???

Én inkább a Changed-et használnám és megvizsgálnám, hogy az összes karakter érvényes-e (vagy egyszerűen használnék masked textbox-ot)...

AE

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]

(#1499) Cpt. Flint válasza ArchElf (#1498) üzenetére


Cpt. Flint
tag

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?

(#1500) ArchElf válasza Cpt. Flint (#1499) üzenetére


ArchElf
addikt

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]

Útvonal

Fórumok  »  Szoftverfejlesztés  »  Visual Basic
Copyright © 2000-2024 PROHARDVER Informatikai Kft.