Új hozzászólás Aktív témák
-
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!
-
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.
-
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 ]
-
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!
-
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!!!!!!!
-
vilag
tag
Halihó!
Egy újabb problémával találtam magam szemben VBA kapcsán.
Van nekem egy adattáblám ami, ugyebár tartalmazza az adatokat.
Userformon szeretnék keresést eszközölni a megfelelő kulcsadat segítségével.
A probléma pedig abban áll, hogy jelenleg csak úgy tudom visszakérni a megfelelő sor megfelelő oszlopának adatát, ha megmondom neki, hogy hanyadik oszlopból kérem vissza a kívánt adatot.
A cél viszont az lenne, hogy ne oszlopszámot kelljen megadnom, hanem az oszlopfejléc nevét, mert könnyen lehet, hogy még plusz oszlopokat kell közbeszúrnom, és ekkor minden egyes oszlopszámra hivatkozó kódrészletet újra kéne kézzel számolnom.
Jelenleg így használom:ComboBox4.Text = gtorzs.Cells(gsor, 7)
ahol gtorzs=a munkalap neve
gsor=a kiván sor sorszáma
7=oszlop számaTehát azt szeretném, hogy a "7" helyett legyen az oszlopfejléc neve (tudom, az hosszabb lesz, de így bárhová tehetném a táblán belűl).
Hogyan tudnám ezt kivitelezni?
Köszönöm a segítséget!
Üdv, vilag -
vilag
tag
Üdv!
Ez akár jó is lehetne, de túl hosszú és ha jól látom akkor minden egyes (keresett) oszlopfejléc szövegre meg kéne írni, ami több fáradtság lenne, mint ha minden egyes változáskor (ami mondjuk ritkán fog változni ha egyszer elkészült az egész) kézzel újraszámozom a megfelelő kódrészletet.
Nincs esetleg valami rövidebb megoldás?
Én gondoltam a vlookup-ra, de aztán elvetettem, minthogy meg kéne adni melyik oszlopban keresse a keresési értéket, de ha ezt tudnám akkor már nem volna szükség az egészre.
Tulajdonképpen nekem az is elég lenne, ha találnánk valami olyan megoldást ami megmondja, hogy a keresett szöveg milyen számú oszlop milyen számú sorában van (persze elég csak az oszlop száma is). Innen már nyert ügyünk lenne.
Egyébként köszönöm az eddigi ötletelést is!
-
vilag
tag
Üdv!
Esetleg mit szóltok az excel "hol.van" (match) függvényére. Nekem úgy tűnik használható lenne az adott problémára.
Az ötlet egyébként a kollégámé, őt illeti a dícséret.
Microsoft excel súgó:
"A függvény egy olyan elem tömbben elfoglalt relatív pozícióját adja vissza, amely megadott értékkel megadott módon egyezik. A HOL.VAN abban különbözik a többi kereső függvénytől, hogy a megtalált elem helyét adja meg, és nem magát az elemet.Szintaxis
HOL.VAN(keresési_érték;tábla;egyezés_típus)
Keresési_érték: Az az érték, amelynek segítségével a táblázatban a keresett érték megtalálható."
-
vilag
tag
Igazából már muszáj "makrobizni", mert userformon fog történni minden, ez csak egy apró szeletet volt a dolognak. Mindössze enélkül nem lett volna értelme folytatni, mert később újra kellett volna írnom az egészet.
A megoldás ez lett (bár gondolom az előzőekből nektek ez már nemigen lesz újdonság):
név = Application.WorksheetFunction.Match("Név", ThisWorkbook.Sheets("gtorzs").Range("1:1"), 0)Listboxal kapcsolatban viszont lenne egy érdekes kérdésem, amelyre eddig önerőből nem találtam választ.
A listbox ugye egy kijelölt excel tartományt "mutat meg". Azt viszont, hogyan lehet megoldani, hogy az egyesített cellák is egyesítettként jelenjenek meg benne?Pl. excel táblában van nekem egy fejléc oszlopom ami viselje pl a következő nevet: "Születési dátum", viszont ez három oszlop (év, hónap, nap) fejléce. A listboxban viszont úgy jelenik meg, hogy az év oszlop felett van a "Születési dátum", a másik kettő felett pedig üres cella (elválasztó vonallal mindennel együtt).
Ötlet?
-
vilag
tag
válasz ArchElf #1603 üzenetére
Akkor röviden a lényeg.
Egy gazdálkodói adatbázisról lenne szó, minden egyes adathoz (legalább is a nagy részéhez) tartozik egy userform vezérlő.
A userformnak kettős célja van, egyrészt lehetővé teszi a meglévő adatbázisban a találatok szűkítését az adott vezérlőbe írt szöveg alapján, másrész új tételek felvitelére is alkalmas lesz (legalább is eddig ez a terv)
Induló állapotban a listbox tartalmazza a teljes adatbázist. A beírt karakterek alapján az adatbázis (és így a listbox is) szűkítésre kerül.
Ha a szűkítés megtörtént és látható a (vélhetően) keresett gazdálkodó, akkor a listboxban rákattinthatunk a keresett emberkére, és egy gombot megnyomva az összes adata betöltődik a megfelelő vezérlőbe ahol ezután változtatásokat hajthatunk végre az adatain.Összegezve tehát jól "ment le" neked a dolog, két említett probléma független egymástól.
Valóban a címsorban akartam keresni. Pontosítva a címsor megfelelő szövegét kerestem, hogy megkaphassam a helyét (oszlop sorszmát), mert később szeretnék hivatkozni a helyére (amikor visszatöltöm az adatokat), de az adatbázis oszlopbeosztása még képlékeny, ezért nem akartam abszolult hivatkozásokat (vagy offset-et) használni. Mert ha esetleg később be kell szúrnom egy oszlopot (vagy éppen ki kell vennem) akkor nézhetném át az egész kódot, így viszont nem kell ilyesmivel törődnöm.
Remélem nagyjából értelmezhető amit írtam.
Egy pár kép, hogy jobban átlátható legyen a dolog:
[link][ Szerkesztve ]
-
vilag
tag
válasz martonx #1605 üzenetére
Sajnos ez van.
Pénz nincs semmire, tehát a lightswitch kilőve.
Az Oracle-t használja a cég (a központi szoftverünk arra lett írva), de kétlem, hogy a szerverhez kapnánk hozzáférést, mivel az a központban van, mi meg megyei szinten vagyunk.
Az Access járható út lenne (gondoltunk is rá), de sajnos ahhoz még annyit sem konyítunk mint az excelhez és a VBA-hoz.Megj.: a gazdálkodói adatbázis jelenleg is excelben van (ugyan így VBA-val "megbolondítva"), de eljárt felette az idő. Új tartalmak szükségesek és megváltoztak az elvárásaink is, így arra gondoltunk, hogy már egyszerűbb újra írni, (és persze akkor már a funkciókat is kibővíteni) mint toldozni-foltozni.
Esetleg ha lenne egy mentor akkor elkacérkodnánk az access gondolatával, de anélkül egyikünknek sincs annyi (fölös) munkaideje, hogy önerőből belevesse magát a dologba.
Szerk.: a félreértések elkerülése végett, ez nem kiadott munka, inkább a saját munkánk megkönnyítése, és kihívás is egyben.
[ Szerkesztve ]
-
vilag
tag
válasz martonx #1608 üzenetére
Ha már így megcsiklandoztad a fantáziámat, akkor ajánlhatnál valami jó könyvet (lehetőleg magyar nyelvűt), ami esetleg a világhálón is elérhető. Aztán lehet, hogy belevetem magamat az access-re történő átültetésbe (bár még excelben sincs befejezve )
Most belekukkantottam az accessbe, de azt sem tudom mit kell indítani, úgyhogy kicsit megrémültem, de gondolom ez csak kezdeti ijedtség lesz...
-
vilag
tag
Tudja esetleg valaki, hogyan tudom az oszlop számából visszanyerni az oszlop betűjelét?
Vagy kit tudom e "váltani" valamivel?A probléma az előzőekből adódik (nem akarok fiksz hivatkozásokat használni).
Van azonban egy olyan kódrészletem amiben egy változó által hozott cellanevet adok meg.
Selection.Sort Key1:=Range(kulcs1), Order1:=xlAscending _
, Key2:=Range(kulcs2), Order2:=xlAscending _
, Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom _
, DataOption1:=xlSortNormal, DataOption2:=xlSortNormalahol kulcs1=a cella hivatkozása (pl.: b2)
kulcs2=egy másik cella hivatkozása (pl.: d2)Jelen esetben a 2 az fix lenne, de az előtte lévő oszlopnak csak a számát tudom, mivel az dinamikus lenne, tehát adott pillanatban nem biztos, hogy az adat a b oszlopban van.
Tudom, hogy valami egyszerű a megoldás csak nem találom.
Igazából annyit szeretnék, hogy az oszlop betűjelét helyettesíthessem az oszlop számával.
[ Szerkesztve ]
-
vilag
tag
Megoldottam, tudtam, hogy valami egyszerű megoldása lesz.
Selection.Sort Key1:=Cells(kulcs1, 2), Order1:=xlAscending _
, Key2:=Range(kulcs2), Order2:=xlAscending _
, Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom _
, DataOption1:=xlSortNormal, DataOption2:=xlSortNormalahol range(kulcs1) helyett, cells(kulcs1, 2) van,
ahol kulcs1 a korábbi b2 helyett, már csak az oszlop száma (pl.4) -
vilag
tag
Sziasztok
Egy furcsaságra lettem figyelmes az egyik általam írt programban.
Az a baj, hogy nem csak furcsa, hanem bonyodalmakat is okozott, melynek kikerülésére egy újabb változót voltam kénytlen bevezetni.A jelenség a következő:
Adott egy userform,.amin vezérlők és fram-ek is vannak.
Az egyik (ponosabban kettő) vezérlő change rutinja akkor is lefut amikor azt se nem hívom meg, se nem folyik olyan művelet (legalább is ismereteim szerint) aminek azt meg kellene hívnia.A folyamat a következő:
adott egy gomb a userformon aminek a megnyomásával 3 comboboxban és egy textboxban lévő text visszaíródik az excel tábla megfelelő sorának megfelelelő helyére.
Ekkor azonban (nem tudom miért) el kezd lefutni egy tök másik combobox (amelynek tudtommal nincs köze az adott eseményekhez) change rutinja.Van valakinek valami ötlete, hogy ezt mi okozhatja? Léptetéssel végignéztem, de sehol nem találok olyan sort amely indokolná ennek a changenek a lefutását.
Várom az ötleteket.
Üdv, vilag
-
vilag
tag
válasz martonx #1681 üzenetére
De tudomásom szerint csak excelbe történő kiírás folyik, onnan visszaolvasás nem. Legalább is ennél a folyamatnál nem. Tehát nem tudok rájönni, hogy mi indokolja egy elvileg nem érintett combobox change-ének lefutását. Mitől változna az értéke????
Csak egy nyamvad évszám van benne.
Akkor a kódrészletek:
A gomb megnyomásakor ez fut le:
Private Sub CommandButton6_Click() 'Partner rögzítése a gyakori partnerek listájára
If ComboBox12.Text = "" Or ComboBox2.Text = "" Or TextBox3.Text = "" Or ComboBox1.Text = "" Then
hiba = MsgBox("Valamely címzéshez szükséges adat hiányzik, kérlek ellenőrizd!", 16, "Címadat hiba")
Exit Sub
End If
üzenet = MsgBox("Biztosan rögzíteni akarod a partnert a gyakori partnerek listájára az alábbi adatokkal?" + Chr(13) + Chr(13) + _
"Név:" + Chr(9) + Chr(9) + ComboBox12.Text + Chr(13) + _
"Település:" + Chr(9) + ComboBox2.Text + Chr(13) + _
"Utca, hászám:" + Chr(9) + TextBox3.Text + Chr(13) + _
"Irányítószám:" + Chr(9) + ComboBox1.Text, 36, "Partnerrögzítés")
If üzenet = 2 Then
Exit Sub
Else
kileptet = False
partnerujsor = ThisWorkbook.Worksheets("Partnerek").Range("a2").End(xlDown).Row + 1
ThisWorkbook.Worksheets("Partnerek").Range("a" + Trim(Str(partnerujsor))).Value = Trim(Str(partnerujsor - 1))
ThisWorkbook.Worksheets("Partnerek").Range("b" + Trim(Str(partnerujsor))).Value = ComboBox12.Text
ThisWorkbook.Worksheets("Partnerek").Range("c" + Trim(Str(partnerujsor))).Value = ComboBox2.Text
ThisWorkbook.Worksheets("Partnerek").Range("d" + Trim(Str(partnerujsor))).Value = TextBox3.Text
ThisWorkbook.Worksheets("Partnerek").Range("e" + Trim(Str(partnerujsor))).Value = ComboBox1.Text
kileptet = True
End If
End Subahol kiléptet=a probléma miatt bevezetett változó
A futkározó vezérlő change-e:
Private Sub ComboBox4_Change() 'postázás éve
If kileptet = False Then Exit Sub
If eloszor = True Then Exit Sub
CommandButton3.Enabled = True
CommandButton2.Enabled = True
If ComboBox4.MatchFound = False And Len(ComboBox4.Value) > 0 Then
hiba = MsgBox("A postázás éve négy jegyű és nem térhet el az aktuális évtől egy évvel többel!", vbCritical + vbOKOnly, "Dátum beviteli hiba")
ComboBox4.ListIndex = -1
Exit Sub
End If
If ComboBox4.ListIndex = -1 Then Exit Sub
postev = ComboBox4.Value
If Int(postev / 4) <> postev / 4 Then szoko = False Else szoko = True
If postho = "02" Then
If szoko = True Then
ComboBox6.RowSource = "napló!h2:h30"
If ComboBox6.ListIndex = -1 Then
ComboBox6.ListIndex = 28
postnap = ComboBox6.Text
End If
Else
ComboBox6.RowSource = "napló!h2:h29"
If ComboBox6.ListIndex = -1 Then
ComboBox6.ListIndex = 27
postnap = ComboBox6.Text
End If
End If
End If
End SubMint látható az első részletben szó sem esik a Combobox4-ről.
Így esetleg valami ötlet???[ Szerkesztve ]
-
vilag
tag
válasz martonx #1690 üzenetére
Bocs, hogy értetlen vagyok, de nem tanultam egyetemen a programozást.
Egyébként meg Te sem értetted amit én írtam, mert nincs hibaüzenet, csak hibás működés amit ugyan elhárítottam (egy változó bevezetésével), csak az okát szeretném megtudni.
A Combobox4 közvetlenül nincs excel mezőhöz kötve (már ha egyáltalán excel mezőre gondolsz). Csak közvetetten van excelmezőhöz kötve. Egy dátum évszáma, tehát a CB4,CB5,CB6 mezők értéke összefűzésre kerül és csak ez után íródik a tábla egy cellájába.
A probléma csak annyi, hogy ez esetben ez nem történik meg, mert az tök más folyamat ami ettől független.Még egy dolog jutott eszembe. Az évszám a userform initializálásakor kap automatikusan értéket a trim(str(Year(date))) segítségével. Ez indukálhatja eseteg a change lefutását valamilyen módon?
-
vilag
tag
válasz martonx #1692 üzenetére
Abban én is biztos vagyok, hogy valami nagyon egyszerű megoldása lesz a dolognak (ha egyszer megtalálom).
Egyébként ha tudnád, hogy a debuggolást már hányszor játszottuk végig...
Egyszerűen értetlenül állok a dolog előtt.Azért ha esetleg mégis megtalálom a megoldást megírom, hátha érdekel.
-
vilag
tag
válasz martonx #1692 üzenetére
Ezt már komolyan nem hiszem el.
Próbálok egy másik problémát orvosolni, erre azt veszem észre, hogy ugyan oda lyukadok ki, hogy a már említett vezérlő change elkezd futni.
Épp az initializálást futtatja, aztán ennél a sornál átvált a CB7 Change-re:Sheets("napló").Range("j2").Value = Sheets("irszam").Range("a1").End(xlDown).Row
Most mond meg nekem, hogy ez hogy a búbánatos francban váltja ki a CB7 Change lefutását????
-
vilag
tag
válasz martonx #1692 üzenetére
Van egy rutin ami egy gomb megnyomására az egyes vezérlők tartalmát elkezdi egyesével kiirkálni az excel tábal megfelel cellájába.
Most azt vettem észre, hogy a két évszámos vezérlő (CB4 és CB7) change minden egyes alkalommal lefut amikor egy-egy érték kiíródik az excel tábla.
Esetleg ez megvilágosít nálad valamit? -
vilag
tag
válasz ArchElf #1696 üzenetére
Üdv!
Úgy tűnik, hogy az automatikus számolás okozza ezt a fölösleges futkározást.
Már csak abban legyetek a segítségemre, hogy magyarázzátok el, hogy ennek a bekapcsolása miért is okozza azt, hogy folyton lefut a change.Volna még egy olyan kérdésem, hogy a userform jobb felső sarkában található "X" gombot le lehet e valahogyan tiltani, mert az terminate-re futtatja a kódot, amin viszont már nem tudok megállítani, meg egyébként is okoz nekem más problémákat.
Van nekem egy másik problémám is, bár könnyen meglehet, hogy nem kapcsolódik szorosan a VBA-hoz.
A probléma a fájl biztonsági beállításoknál van. A már említett programocskát többen is használjuk, de azt szeretném elérni, hogy írásra csak bizonyos felhasználóknak legyen elérhető. Eddig még nincs is gond, csak az a baj, hogy az egyik felhasználó akinek írásra is engedélyezve van a fájl, valahogyan mindig saját tulajdonba veszi a fájlt (mikor ráment) és a biztonsági beállítások elszállnak, aminek egyenes következménye, hogy megint mindenki hozzáfér írásra.Tud nekem ebben valaki segíteni?
Üdv, vilag
-
vilag
tag
válasz martonx #1700 üzenetére
Szia!
A vezérlők valóban rá vannak kötve egy egy excel cellára, de nem azonnali hatállyal. A kiírás csak egy gomb megnyomása (és a megfelelő ellenőrzések futtatása) után történik meg.
Nem tudom ez változtat e a nézőpontodon valamit.A többi kérdésben esetleg tudsz segíteni? (Előbbi hozzászólásom)
Üdv, vilag
-
vilag
tag
válasz martonx #1702 üzenetére
Nagyon szépen köszönöm a megoldást!!!! Ezzel sok bonyodalomtól mentettél meg!
Pedig mennyi féle megoldást kipróbáltunk mielőtt megkérdeztem....
A biztonsági beállításokban nem tudsz esetles segíteni?
A futkározással kapcsolatban annyit, hogy rendben, hogy működik a dolog hogy ki kell kapcsolni az automatikus újraszámolást, de szeretném megérteni a dolog miértjét.
Szóval miért van ez így? Mi az oka?
-
vilag
tag
válasz martonx #1710 üzenetére
Az addig világos is (eddig is az volt), hogy amikor az adott vezérlőhöz kötött cella értéke megváltozik akkor annak a change lefut. Ez eddig sem volt kérdés. Viszont ez a change lefut ha kell hanem, minden egyes alkalommal amikor valamelyik másik vezérlő értékének a kiírása történik, sőt ennek a vezérlőnek semmi köze az egészhez.
[ Szerkesztve ]
-
vilag
tag
Üdv!
A következő problémára keresek választ:
Adott egy userformon több frame, melyek szintén több vezérlőt tartalmaznak.
Egy közbenső frame léptetési sorrendben utolsó vezérlőjének exit subjába írtam meg egy vizsgálatot, amely ebből következőleg a vezérlőből való kilépéskor elvégez bizonyos ellenőrzést.
A probléma azonban az, hogy ha ez az adott frame utolsó (aktív) vezérlője, akkor az exit sub nem fut le sem akkor ha tabbal közlekedem, sem pedig akkor ha egérrel. Akkor fut le az említett exit sub ha újra visszatérek a frambe (mondjuk egérkattintással)Valakinek van ötlete, hogy mi okozza ezt, illetve, hogy hogyan lehet meggyógyítani vagy kitrükközni?
Előre is köszönöm!
[ Szerkesztve ]
-
vilag
tag
válasz #90999040 #1761 üzenetére
Igen, ezzel csak az a baj, hogy ez rengeteg plusz melót igényel, tekintve, hogy minden egyes vezérlő Enter() eseményéhez meg kellene írni.
Az ActiveControl-al már próbákoztunk másik programban, hasonló ok miatt de az nem működik megfelelően.
Ha pl. van egy formod amin belül van egy frame, amint belül pedig egy vezérlő és a kurzor a vezérlőben villog, tehát elvileg ugye a vezérlő az aktív, az ActiveControl azt fogja eredményül adni, hogy az aktív kontrol a userform.
Ezúton is köszönjük neki. Így el nem tudom képzelni, hogy ez mire lehet jó.Egyébként találtunk akkor erre megoldást, de az hack volt.
Szóval nekem valami jóval egyszerűbb megoldásra lenne szükségem, mert a framen belül és kívül is van jónéhány vezérlő.
Üdv, vilag
-
vilag
tag
Sziasztok!
Szembe kerültem egy eleddig megoldhatatlannak tűnő problémával.
Több kiutat is látok belőle, csak nem tudom kivitelezhető e, illetve, hogy hogyan.Van nekem egy excelre épülő VBA projektem.
Ez gyakorlatilag a hálózatról is futtatható kis programocska.Jelenleg úgy működik, hogy egy .bat fájlra mutató parancsikont tetettem ki a felhasználókkal. Ez a .bat fájl indítja az abban megadott helyen lévő excel fájlt.
Ennek a .bat fájlra mutató parancsikonja azonban egy sima kötegfájl az ikonja.
Ez meglehetősen ronda.
Szeretném elérni valahogyan, hogy felhasználói beavatkozás nélkül legyen egy általam beállított kép az ikon.Nekem az alábbi megoldások jutottak eszembe:
1. Ne egy .bat fájl, hanem egy .exe fájl tartalmazza az elérési utat (elvileg az .exe már tárolhat ikont is). Sajnos lövésem sincs hogyan lehet exe fájlt programozni, és hosszas keresgélés után sem jutottam előrébb.2. Magából a projektből kellene valahogyan egy exe fájlt csinálni (ha egyáltalán kehetséges)
3. Egy .bat fájlt megírni úgy, hogy az elvégezze a felhasználó helyett a parancsikon kihelyezését az asztalra és az ikoncseré is. (ezt meg nem tudom megcsinálni).
Szóval szeretnélek titeket megkérni, hogy akár más megoldással, vagy akár a fentiek közül valamelyik megoldás kivitelezésével segítsetek megoldani a problémát!
Egy másik probléma, hogy a .bat fájl indításával egy parancsfájl ablak is megnyílik ami addig ott is marad míg az excel tábla nyitva van.
Nem lehetne valahogy megoldani, hogy ez az excel fájl megnyitásakor bezáródjon, vagy legalább láthatatlan legyen?Köszönettel, volag
-
vilag
tag
válasz sztanozs #1791 üzenetére
Először is köszönöm a válaszokat!
Az első két megoldási javaslattal kapcsolatban nincs semmi tapasztalatom, szóval nem tudom, hogy vajon mekkora meló lenne egy több mint 5000 soros kód lefordítása.
Valakinek valami tapasztalat ezzel kapcsolatban?
A bat fájlra -mint írtam- azért van szükség jelenleg, mert ez a fájl tartalmazza az excel fájl nevére mutató hivatkozást. Vagyis inkább ez nyitja meg a benne megadott hivatkozást.
Minderre azért van szükség, mert a fájl nevét időnként változtatom. Erre a verziószám változások miatt van szükség. Ebből kifolyólag pedig az arra mutató parancsikonok érvénytelenek lennének.Azért keresek olyan megoldást amivel magában a fájlban lehet tárolni a parancsikont, vagy automatizálni annak lecserélését, mert a hálózat (illetve a program) felhasználóit 100 km is elválasztja egymástól, így nem mehetek oda minden egyes géphez és végezhetem el én az ikoncserét
Azt meg ne is mondjam, hogy a felhasználók milyen szinten állnak informatikából...
Vagy aki meg ért is hozzá, az esetleg tesz rá... -
vilag
tag
válasz martonx #1792 üzenetére
A meglévő program átfordítása mekkora erőfeszítést igényelne vajon?
Illetve még ha le is fordítom, minden gépen menne vajon vagy esetleg kell hogy legyen hozzá telepítve valamilyen program, hogy fusson?Utóbbit azért kérdezem, mert a hálózatban nem rendelkezem rendszergazda jogosultságokkal. (legalább is nem egészen legálisan )
-
vilag
tag
válasz martonx #1795 üzenetére
Minden céges gépen XP van.
Sajnos azonban a legtöbb gépen még az SP3 sincs fent, nemhogy a .net keretrendszer...De azért lehet, hogy ha más nem kíváncsiságból megpróbálom majd átfordítani.
A későbbi futtatáshoz is kell majd gondolom a keretrendszer gondolom.
Azt azonban nem tudom, hogy ha abból exe-t csinálok akkor is kell? (mintha azt írtátok volna, hogy abból már lehet exe-t csinálni.)Üdv, vilag
-
vilag
tag
válasz martonx #1799 üzenetére
Sajnos akkor mindkét megoldást (VB6, .NET) el kell vetnem, mert még ha tudom is a rendszergazda jelszót, nem lesz alkalmam feltenni minden gépre.
Még amik helyben vannak, azok csak-csak, mert mondjuk a kora reggeli órákban megcsinálom mikor nincs itt senki, de a másik két központban lévő gépekre nem tudom feltenni. Elmenni nem tudok (na meg nem is akarok), a gépneveket meg nem tudom.Innentől meg a rendszergazda jóindulatán múlik, hogy hajlandó e ennyit vacakolni....
de ahogy ismerem első szóra biztos nem csinálja meg. -
vilag
tag
válasz sztanozs #1801 üzenetére
Van esetleg valami hasonló command file mintád?
Valami hasonlót kerestem igazából. Bár sejtem, hogy egy file ikoncserét nemigen lehet belőle levezérelni.
Már az is haladás volna ha egy asztali parancsikon elhelyezést le tudnék vele vezérelni.Egyébként van domain, szerver meg minden Istennyila.
Azért az vicces lenne ha a rendszergazda gépén is megjelenne a kis telepítőablak
-
vilag
tag
válasz martonx #1802 üzenetére
Bár a mi rendszergazdánk a 90%-ba esik (nem ügyes annyira), azért meg is kell védenem, mert csak mellékesen rendszergazda, emellett ugyan olyan ügyintéző mint bármelyikünk a cégnél. A nemakarás, így betudható a rengeteg ügynek.
Mondjuk ha sokat macerálom valami miatt általában kötélnek áll
-
vilag
tag
Sziasztok!
Egy újabb problémával találtam szemben magamat.
A probléma az lenne, hogy egy excel dokumentumot úgy akarok megnyitni, hogy egyből a userform jelenjen meg, viszont (mivel ez nem túl nagy) a háttérben maga az extel tábla ne is látszódjon.
A googliban kutakodva meg is találtam amire szükségem van, de sajnos nem egészen úgy történik minden ahogyan én szeretném.
Már több megoldással is próbálkoztam de eddig csak félsikert értem el mindegyikkel.
1.Private Sub Workbook_Open()
Application.WindowState = xlMinimized
UserForm1.Show
End SubEbben az esetben a munkafüzet megnyitásakor az valóban a tálcára kerül, viszont a userform-al együtt.
2.
Private Sub CommandButton1_Click()
Application.WindowState = xlMinimized
UserForm1.Show
End SubEllenben ha egy úgy van megcsinálva, hogy a munkafüzetben van egy gomb, amihez ugyan ez a kód van beírva, akkor a gombnyomásra úgy működik ahogyan kell.
Csak ugye pont ezt szeretném elkerülni, mert semmi szükség még egy felesleges gombnyomásra.-----------------
Próbáltam már magából a userform initializálásból megcsinálni, de az eredmény ugyan az mint a 2. esetben.
Próbáltam már a userform initializálásból meghívni a kattintást, de az nem tetszett neki.
Próbáltam már az első programkódot megcserélni, azaz előbb nyitni a userformot aztán minimalizálni, de ekkor nem történik semmi.
Próbáltam már az első verzió után valahogyan aktiválni a munkafüzetet, de ez sem sikerült.Van esetleg valakinek valami használható megoldása?
------------------
Lenne még egy olyan kérdésem, hogy valahogyan ki lehet e nyerni, hogy az altív munkafüzeten kívül van e még nyitva másiki munkafüzet?
Kérdezem ezt azért, mert mondjuk egy kilépés gombnál akkor le tudnám vezérelni, hogy csak az aktív munkafüzetet zárja e be, vagy az egész excelt.
Így elkerülhető lenne, hogy a felhasználónál nyitva lévő (és esetleg mentetlen) más munkafüzetet is bezárjak. (Az application.displayalerts direkt falsra van állítva).Előre is köszönöm!
[ Szerkesztve ]
-
vilag
tag
válasz sztanozs #1833 üzenetére
Igazából csak annyit szeretnék elérni, hogy az excel megnyitása után azonnal csakis a userform látszódjon. Se a munkalap, se pedig az üres excel ablak ne látszódjon, csak és kizárólag a userform.
A táblába jelen esetben semmiféle kivétel-visszaírás nem történik!
Gyakorlatilag kódból fut minden.
Az egész csak annyit csinál, hogy gombnyomásra kiválasztott fájlt/fájlokat bizonyos helyre másol. Kilépéskori mentésre semmi szükség.
Rendben, valamint egy kilépés gomb.--------------------
A több munkafüzetes problémára esetleg valami megoldás?
Üdv, vilag
-
vilag
tag
válasz sztanozs #1835 üzenetére
Hali!
Az ötleted sokat segített a modul tekintetében.
a Show Modal = False az jó volt, de Window Position tulajdonsága nincs a userformnak.Végül is úgy sikerült megoldani, hogy ötvöztem az általad javasoltat a saját ötlettel, azaz a Show Modal-t Falsra állítottam, illetve a userform initializáláshoz beírtam ezt:
Application.WindowState = xlMinimizedA kettő együtt végül is azt csinálja amit szerettem volna
A több Workbook-ra kínált megoldással még nem volt időm foglalatoskodni, mert a másik sürgősebb.
Azzal igazából azt szeretném megoldani, hogy amikor a userformon megnyomom a kilépés gombot, akkor megvizsgálja, hogy van e nyitva másik munkafüzet is vagy sem. Ekkor kettéválna a folyamat:
1. Az eredmény az, hogy nincs nyitva másik munkafüzet -> zárja be az egész excelt
2. Az eredmény az, hogy van nyitva másik munkafüzet -> csak ezt a munkafüzetet zárja be.A két különböző bezárást le tudom vezérelni, igazából a vizsgálatot nem tudtam megoldani.
Remélem az általad vázoltal meg tudom majd oldani.
Üdv, vilag
[ Szerkesztve ]
-
vilag
tag
válasz sztanozs #1835 üzenetére
Üdv!
Csináltam magamnak egy kis időt és megnéztem a több munkafüzetes megoldást is.
A megoldás működik...csak fordítva
Igazából azt írtad, hogy ha csak egy munkafüzet van nyitva, akkor csak a munkafüzetet zárja be, és ha több akkor pedig az egész programot
De a problémát megoldottam.
A hiba a következő volt:Private Sub CommandButton1_Click()
Dim wcount As Integer
Dim twb As Workbook
wcount = 0
For Each twb In Application.Workbooks
wcount = wcount + 1
Next
If wcount = 1 Then helyette 0 kell
Application.Quit
Else
Application.DisplayAlerts = False
wb.Close False
End If
End SubValamint a wb.Close -ra hibát dob, így azt átírtam twb-re (de így sem működött), így átírtam ThisWorkbook-ra.
Meg annyi, hogy én ez után a hibajelzést újra true-ra állítottam, hogy a nyitva maradt munkafüzetekben működjön. Bár lehet, hogy ez csak adott munkafüzetre vonatkozik.
Az igazat megvallva ezt nem tudom.Mindent egybevéve, nagyon köszönöm a segítséget, most több programomba is beépítem a megoldást.
Üdv, vilag
-
vilag
tag
válasz sztanozs #1850 üzenetére
Végül is eddig úgy tűnik, hogy a következő verziónál maradok:
Workbook:
Private Sub Workbook_Open()
UserForm1.Show
End SubUserform:
Private Sub CommandButton2_Click() 'Kilépés gomb
mfszam = 0 'mfszam=munkafüzetek száma
For Each twb In Application.Workbooks
mfszam = mfszam + 1
Next
If mfszam = 0 Then
Application.Quit
Else
Application.DisplayAlerts = False
Unload Me
ThisWorkbook.Close
Application.DisplayAlerts = True
End If
Application.WindowState = xlNormal
End SubPrivate Sub UserForm_Terminate()
Application.DisplayAlerts = True
Application.WindowState = xlNormal
End SubEz lett a végleges (legalább is most annak tűnő) megoldás.
Még betettem egy Unload Me-t, mert így lefut a lejjebbi részben írt Terminate is, amivel el tudom érni, hogy a hibajelzést visszakapcsoljam, illetve, hogy újra nagy méretű legyen a megnyitva maradt munkafüzet (már persze ha több volt nyitva). Ha csak egy volt nyitva az sem gond, mert felugrik és aztán bezáródik az egész.A dim-eket kihagytam, mert anélkül is megy, illetve a változó nevét megváltoztattam, mert nekem így beszédesebb
Üdv, vilag
-
vilag
tag
válasz sztanozs #1852 üzenetére
Üdv!
Kicsit utánaolvastam az Option Explicit-nek, mert megmondom őszintén nem is hallottam róla.
A meglévő kevéske tudásomat a kollégámtól, innen, általánosságban az internetről, illetve saját kútfőböl szereztem. Vélhetően ezért nem hallottam róla.Szóval utánaolvastam, és szerintem nem fogom bekapcsolni (legalább is ebben a programban tuti nem), mert rövidke a program és a tárgyalt kódon kívül mindössze egy változó van, így igazán nincs is értelme.
Meg rosszat is olvastam (1 hsz):
[link]Bár nem olvastam végig, így könnyen lehet, hogy nem is ez okozta a problémát.
Üdv, vilag
Szerk: Annyit azonban észrevettem, hogy a fenti módon megoldott kilépéssel előállta az a helyzet, hogy a personal.xls-t is bezárja, így a kipakolt saját menük, illetve beállítások elszállnak.
Ezt nem lehet valahogyan elkerülni????[ Szerkesztve ]
-
vilag
tag
válasz sztanozs #1854 üzenetére
Üdv!
Felmerült még egy probléma.
Az a baj, hogy nem tudom, hogy a felhasználók közül ki az akinek van personal.xls és esetleg rendelkezik az általunk írt sajatfuggvenyek.xla-val.
Ebből kifolyólag sajnos nem tudom előre meghatározni, hogy melyik az ominózus munkafüzetszám amihez viszonyítani tudnám, hogy van e még nyitva munkafüzet vagy sem.Tudunk esetleg beépíteni valami erre vonatkozó vizsgálatot?
Esetleg vizsgáljuk meg, hogy megnyitáskor mennyi munkafüzet van nyitva és azt vegyük bázisértéknek?
Bár lehet, hogy ez sem jó, mert még így sem tudjuk megmondani, hogy az valóban egy látható munkafüzet e vagy az előbb említett kettő valamelyike...Próbáljunk meg esetleg ezekre a munkafüzet nevekre keresni és kivonni a számukat a bázisszámból?
Valami ötlet esetleg?Üdv, vilag
-
vilag
tag
válasz sztanozs #1856 üzenetére
Ez lett a végső (nek tűnő) megoldás:
For Each twb In Application.Workbooks
wbnev = twb.Name
If wbnev <> "PERSONAL.XLS" And wbnev <> ThisWorkbook.Name Then
GoTo bezar
End If
Next
kilep:
Application.Quit
GoTo vege
bezar:
Application.DisplayAlerts = False
Unload Me
ThisWorkbook.Close
vege:
Application.WindowState = xlMaximizedJelenleg úgy tűnik, hogy minden gond nélkül működik. mondom ezt néhány teszt után.
Remélem most már így is marad.Van azonban egy másik kérdésem:
A szóban forgó project le van jelszavazva a basicben azon oknál fogva, hogy a mezei felhasználó ne tévedhessen debug módba.
Van a felhasználói felületen egy gomb aminek a jelentősége most megnőtt (eddig nem is használtam). Ez a gomb arra szolgál, hogy a userformot bezárja és megnyissa a basicet.A probléma az lenne, hogy a project kibontásához jelszót kér (mivel ugye lejelszavaztam).
Szóval a kérdés az, hogy lehet e automatizálni a pojecthez tartozó jelszóbeadást?
Természetesen a userformon lévő gomb jelszavazva van.
Üdv, vilag
-
vilag
tag
Üdv!
Lenne egy olyan kérdésem, hogy valamely vezérlő RowSource-át be lehet e állítani úgy, hogy nem cella neveket adok meg hanem oszlop és sorszámokat?
Pl.: Combobox1.RowSource = "napló!a2:b5" helyett "napló!xy:xy", ahol x=oszlopszám és y=sorszám
Azért lenne szükséges, hogy ha esetleg a forrástáblába be akarok szúrni egy oszlopot vagy bővíteni akarom a sorok számát, akkor ne kelljen az egyes vezérlők tulajdonságait folyton kézzel áligatni.
Az már megvan, hogy a kívánt oszlop fejlécét megkeresve az adott táblában kinyerem az oszlop sorszámát az
Application.Worksheetfunction.Match-el.
Vagy olyan megoldás is érdekel, amelyben a keresés eredményeként nem oszlopszámot hanem oszlonevet kapok vissza.
Ez talán még jobb volna.Lehetséges?
Ha igen, akkor hogyan?Köszönöm!
Üdv, vilag
Új hozzászólás Aktív témák
- OLED TV topic
- Rövid előzetesen a S.T.A.L.K.E.R. 2: Heart of Chornobyl
- Távcső topik
- bitpork: Fogyasztásra ítélve
- HiFi műszaki szemmel - sztereó hangrendszerek
- EAFC 24
- Milyen autót vegyek?
- Tarr Kft. kábeltv, internet, telefon
- Házi barkács, gányolás, tákolás, megdöbbentő gépek!
- Autós topik
- További aktív témák...