Köszönöm a segítséget mindenkinek!!!
Összejött
Gyorskeresés
Legfrissebb anyagok
- Bemutató Spyra: akkus, nagynyomású, automata vízipuska
- Bemutató Route 66 Chicagotól Los Angelesig 2. rész
- Helyszíni riport Alfa Giulia Q-val a Balaton Park Circiut-en
- Bemutató A használt VGA piac kincsei - Július I
- Bemutató Bakancslista: Route 66 Chicagotól Los Angelesig
Általános témák
LOGOUT.hu témák
- [Re:] [gban:] Ingyen kellene, de tegnapra
- [Re:] PLEX: multimédia az egész lakásban
- [Re:] [bitpork:] Balatoni autós tali 2024
- [Re:] Elektromos rásegítésű kerékpárok
- [Re:] [sziku69:] Fűzzük össze a szavakat :)
- [Re:] [Luck Dragon:] Asszociációs játék. :)
- [Re:] [sziku69:] Szólánc.
- [Re:] [D1Rect:] Nagy "hülyétkapokazapróktól" topik
- [Re:] [antikomcsi:] Való Világ: A piszkos 12 - VV12 - Való Világ 12
- [Re:] [ubyegon2:] Airfryer XL XXL forrólevegős sütő gyakorlati tanácsok, ötletek, receptek
Szakmai témák
PROHARDVER! témák
Mobilarena témák
IT café témák
Hozzászólások
Zsargon89
csendes tag
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.
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]
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!
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 .
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..."
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]
Brown ügynök
senior tag
Nézem én az MSDN-t de hatalmas anyag.
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..."
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..."
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..."
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!
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.
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!
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!
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.
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
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!
martonx
veterán
FKERES függvény pont ezt csinálja
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!
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.
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!
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!!!
[ Szerkesztve ]
#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
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..."
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]
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..."
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..."
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!
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
#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...
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!
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!
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.
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?
#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
ö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.
[ Szerkesztve ]
#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.
ö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?
(#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
#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 ]
öcsi-bácsi
csendes tag
Köszönöm, hasznosítani fogom a leírtakat.
ö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 ]
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 )
Én kérek elnézést!
öcsi-bácsi
csendes tag
Köszönöm, próbálkozok.
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!!!!!!!
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]
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?
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]