- Karácsonyfaként világíthat a Thermaltake új CPU-hűtője
- Az USA vizsgálja a RISC-V kínai terjedésének kockázatát
- Kicsit extrémre sikerült a Hyte belépője a készre szerelt vízhűtések világába
- Egészen nagy teljesítményspektrumon fedné le a mobil piacot az AMD
- Kihívás a középkategóriában: teszten a Radeon RX 7600 XT
- Gaming notebook topik
- NVIDIA GeForce RTX 3080 / 3090 / Ti (GA102)
- ZIDOO médialejátszók
- Vezetékes FEJhallgatók
- TCL LCD és LED TV-k
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Processzorra való vizesblokk az ASUS ROG-os portfóliójában
- OLED TV topic
- Kormányok / autós szimulátorok topicja
- VR topik (Oculus Rift, stb.)
Hirdetés
-
Agyi chipes gyártóba fektetett a kriptocég
it A Tether 200 millió dollárt fektet a Blackrock Neurotech agyi chipes vállalatba.
-
Kicsit extrémre sikerült a Hyte belépője a készre szerelt vízhűtések világába
ph A cég megoldása centralizált vezérelhetőséggel, masszív radiátorral és robusztus ventilátorokkal igyekszik vásárlásra csábítani.
-
Megjelenési dátumot kapott a Star Wars: Hunters
gp A tervek szerint június elején végre befut a teljes kiadás mobilokra/tabletekre és Nintendo Switch-re.
Új hozzászólás Aktív témák
-
Zsargon89
csendes tag
Köszönöm a segítséget mindenkinek!!!
Összejött -
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
válasz RexpecT #1452 üzenetére
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
válasz RexpecT #1452 üzenetére
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 SubTisztá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
válasz Brown ügynök #1456 üzenetére
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 SubA 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 SubJa, é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
válasz Brown ügynök #1458 üzenetére
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 SubNa 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 nyomtatniElőre is köszönöm a segítséget!
-
Brown ügynök
senior tag
válasz Brown ügynök #1460 üzenetére
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..."
-
vilag
tag
válasz martonx #1463 üzenetére
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 SubAddig 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
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! -
-
vilag
tag
válasz martonx #1466 üzenetére
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 WithNehá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
válasz Brown ügynök #1474 üzenetére
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]
-
martonx
veterán
válasz Brown ügynök #1476 üzenetére
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!
-
Brown ügynök
senior tag
válasz Brown ügynök #1476 üzenetére
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..."
-
Brown ügynök
senior tag
válasz Brown ügynök #1478 üzenetére
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
válasz #90999040 #1473 üzenetére
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 ByteSub 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 kezdessz1:
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 sz1elso1:
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 vegemasodik1:
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 vegesz2:
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 sz1elso2:
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 vegemasodik2:
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 vegevege:
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.QuitEz 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
válasz Zsargon89 #1481 üzenetére
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!
-
Cpt. Flint
tag
válasz #90999040 #1482 üzenetére
Engem igazán az izgatna, hogy változót hogy tudok átadni mondjuk excelből wordbe.
Mert itt a legnagyobb problémánk az volt, hogy a körlevél rekordszám az excelben megfelelő programrésszel meghatározott/szűrt sorok száma kell legyen, de ezt a változót csak az excel tábla egyik cellájából bírtuk kibányászni Wordből indított DDE hívással, ami egy baromi körülményes és vacak megoldásnak tűnik nekem:
lngChannel = DDEInitiate(App:="Excel", Topic:="akarmi.xls")
ig2 = DDERequest(Channel:=lngChannel, Item:="r11c17")
Application.DDETerminateAll
Többek között ez csak a "Munka1" lapról szed, én nem tudtam elérni, hogy más munkalap legyen a forrás, aztán csak a R1C1 stílusú hivatkozás működött; illetve ha nem volt látható a hivatkozott cella (mondjuk el volt rejtve vagy össze volt csukva az adott sor v. oszlop), akkor valami nem jó értéket adott vissza (karakterként négyzet, chr$-ként talán 13?).
Sajnos a DDERequestről eddig nem sikerült normális (a VBA helpnél bővebb) leírást találnom, úgyhogy nem is vagyok tisztában vele, hogy esetleg valami más, értelmesebb, kezelhetőbb formában használható-e. -
#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 -
ö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
válasz öcsi-bácsi #1488 üzenetére
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
válasz #90999040 #1489 üzenetére
Köszi, rendes vagy.
Közben találtam egy megoldást:
'visszhang kikapcs
Application.ScreenUpdating = False
"makró fut"
Application.ScreenUpdating = TrueAmi 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? -
öcsi-bácsi
csendes tag
válasz öcsi-bácsi #1490 üzenetére
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
válasz öcsi-bácsi #1491 üzenetére
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:=passEz 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
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
válasz öcsi-bácsi #1494 üzenetére
Í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ótEnnyi. 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!
-
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 SubA 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 SubGondolom 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 Subakkor 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 SubAmú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
válasz ArchElf #1498 üzenetére
szóval, itt több rendbeli félreértés van.
1. maga a KeyCode úgy tűnik, nem vihető át, mert rendszerváltozó, hiába teszem public-ká, akkor is üres lesz, amint másik sub-ba ugrok. természetesen tudom, hogy egy felhasználói publikus változóba kiíratva átvihető, alkalmaztuk is, csak reménykedtünk, hátha mégis lehet az eredetit használni, merthogy úgyis azt kínálja fel a rendszer, mikor egy új keydown subot létrehozol. megspóroltunk volna egy saját változót, meg minden ilyen subban egy plusz sort.
2. honnan jön a tb változó? mert mi pont azt szeretnénk megspórolni, hogy minden keydown subban konkrétan (az adott vezérlő nevével/indexével) értéket kelljen neki adni. mivel ez esetben ez a rész mindegyik subban eltérő lesz, azaz nem lehet simán másolni, oda kell figyelni.
magyarul én a set tb=TextBox1 helyett a set tb=ActiveControl kifejezést szeretném használni, mert ez univerzális. csakhogy nem működik, mert az ActiveControl a VB szerint nem a TextBox1, amiben épp kavarok, hanem a MultiPage1. ez a problem.
3. A "Locked"-nek az az értelme, hogy így egyszerűen nem íródik be a textboxba a hibás karakter, és passz, megy tovább.
4. "Changed" az mi? Én nem találom. Ha a "Change"- re gondolsz, akkor azért a KeyDown-ból megy az egész, és nem a Change-ből, mert a KeyDown még a karakter megjelenése _előtt_ lefut, a Change meg csak utána (tehát ott már csak törölni tudnék).masked textbox hogy megy? a Format()-ra gondolsz?
-
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]
Új hozzászólás Aktív témák
- A fociról könnyedén, egy baráti társaságban
- Politika
- Nintendo Switch
- Mobil flották
- A pápa egyre jobban tart a romlott AI veszélyeitől
- Samsung Galaxy Watch (Tizen és Wear OS) ingyenes számlapok, kupon kódok
- Suzuki topik
- Gaming notebook topik
- Futás, futópályák
- Samsung Galaxy S23 és S23+ - ami belül van, az számít igazán
- További aktív témák...
- Díszdobozos Lenovo Yoga Slim 7i Pro "Kis Gamer" Ultrabook 14" -40% i5-11300H 16/512 QHD+ 2,8K OLED
- Ryzen5 esport Gamer(16gb ddr4/m2 ssd/win10/Vega11)
- HP ProBook 430 G6, 13,3" FULL HD IPS, I5-8265U, 8GB DDR4, 256GB SSD, WIN 10/11, SZÁMLA, GARANCIA
- Dell Latitude 3420, 14" FULL HD IPS, I5-1145G7 CPU, 8GB DDR4, 256GB SSD, W11, Számla, Garancia
- Dell Latitude 7280, 12,5" FHD IPS Kijelző, I5-6300U, 8GB DDR4, 256GB SSD, WIN 10, Számla, garancia