- Luck Dragon: Asszociációs játék. :)
- vrob: Az IBM PC és a játékok a 80-as években
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Lalikiraly: SÜNI energiaital.
- hdanesz: Elektromos autózás - első élmények
- eBay-es kütyük kis pénzért
- zebra_hun: Hűthető e kulturáltan a Raptor Lake léghűtővel a kánikulában?
- Gurulunk, WAZE?!
- sziku69: Fűzzük össze a szavakat :)
- sziku69: Szólánc.
Új hozzászólás Aktív témák
-
Homer
tag
Én még sosem használtam eddig a HOL.VAN függvényt, de jah, igazad van! Azzal is meg lehet oldani a feladatot. (Mondjuk a fenti megoldásom is hasonló eredményt adna.)
A konkrét feladattól függ, hogy én melyiket használnám. Ha nem muszáj makrobizni, akkor én a helyedben megmaradnék a "gyári" függvényeknél... -
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ó."
-
Homer
tag
válasz
martonx #1594 üzenetére
Nem olyan bonyolult ez. Nekem nem ez a munkám, de érdekel a dolog.
Ezt hoztam össze:Public Sub proba()
....MsgBox (keres("h"))
End SubPublic Function keres(mit As String) As Integer
...Dim elem As Object
...Dim oszlop As Integer
...oszlop = 0
...For Each elem In Range("A1", "Q1")
.....oszlop = oszlop + 1
.........If mit = elem.Value Then
.............keres = oszlop
.........End If
...Next
End FunctionHogy olvashatóbb legyen bepontpontpontoztam.
Persze ha picit még gondolkodnék rajta biztosan találnék más megoldást is. (Pl. az elem típusa nem túl elegáns object-ként kezelve, dehát műxik.)
A lényeg, hogy ha írsz egy ilyen function-t akkor azt bárhányszor meghívhatod a fenti sub-ban. Ez a megoldás A-tól Q oszlopig vizsgálja az egyezéseket. Ha nincs egyezés akkor 0-val tér vissza a függvény.
-
martonx
veterán
A baj az, hogy amit szeretnél az kivitelezhető, de összetettsége miatt baromira nem egy fórum keretein belül.
Klasszikusan elértél arra a szintre, ahol vagy veszed a fáradtságot és magadtól kimókolod a megoldást, vagy fizetsz érte, és helyetted egy szabadúszó programozó valamelyik ráérős estéjén megcsinálja neked. -
Homer
tag
Ha olyan függvényt írsz ami paraméterként megkapja a keresett szöveget, visszaadási értéke pedig az oszlop száma, akkor elég egyszer megírni, utána használhatod a függvényt ahányszor, és ahol csak akarod!
Valahogy így:
private function oszlop(byval mitkeresel as string) as integer
itt, a fent leírt módszerrel a fejlécsor összes elemén végigmész, majd
ha megvan a keresett oszlop akkor
return keresettoszlopszám
else
msgbox("Nincs meg minden oszlop")
end -
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!
-
EkSYS
senior tag
sziasztok!
Ha valaki esetleg tud segíteni abban hogy miként lehet egy makró futása közben egy user inputtal várakoztatni a továbbfutást (mondjuk egy formon van több text és combo, és amikor ezek tartalmát ellenőríztetem egy makróval akkor ha üres textb.-t talál akkor klikkeljen bele a text.-be és egy msgbox vagy ok után menne tovább) , érdekelne
b -
Homer
tag
Vagy pl:
Public Sub test()
Dim Keresett As String
Keresett = "Keresettoszlopszövege"
oszlop = 1
Dim megvan As Boolean
megvan = False
While Worksheets("Munka1").Cells(1, oszlop) <> Keresett And Not megvan And _ Worksheets("Munka1").Cells(1, oszlop) <> ""
oszlop = oszlop + 1
If Worksheets("Munka1").Cells(1, oszlop) = Keresett Then megvan = True
Wend
If megvan Then MsgBox (Keresett & " megvan, a következő oszlopban: " & oszlop) Else MsgBox ("Nincs meg")
End SubMondjuk ha a keresett oszlop pont az első akkor nem működik, de nem tartana sokáig módosítani, hogy azzal is működjön. (Neked is hagyok gondolkodni valót
)
-
Homer
tag
Én úgy oldanám meg első körben, hogy a fejléc sorain végigmennék egy each cells in row(1) ciklussal, aztán egy változóban eltárolnám azt az oszlopszámot ahol a cella értéke megyezik a keresett oszlopnévvel. Ezután már hivatkozhatsz arra az oszlopra mint oszlop sorszám...
-
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 -
ArchElf
addikt
válasz
kozicsd #1583 üzenetére
C és VBA közti alapvető különbségek:
nincs { }
nincs ; a sor végén
nincs == helyette is = kell
nincs != helyette <> kell
nincs return, hanem Exit Funtion és Exit Sub
a visszaadandó értéket Function esetén a funkció nevének megfelelő változóba (nem kell inicializálni) kell tenni.
For-nak Next a párja, a break pedig az Exit For (continue nincs se for-ban, se loop-ban)
nem
if ( ... )
{ ... }
else
{ ... }
hanem
If ... Then
...
Else
...
End Ifnem
while (...)
{ ... } hanem
do while (...)
...
loop
ha egy metódus Sub és nem Function akkor nincs visszaadott érték és nem kell az argumentumokat zárójelbe tenni
Nem kell a változókat inicializálni (kivéve az osztályokat).+ van help, a metódusokat meg lehet találni benne
AE
-
kozicsd
tag
Sziasztok
Lenne egy pár nagyon alap feladat, amit az öcsémnek meg kellene csinálnia. Én a vba-t nem vágom, ezért fordulok hozzátok, hogy le tudjam ellenőrizni. Nagyon fontos lenne
1.feladat:Írasd ki egy kollekció összes elemnének a nevét!
2.feladat:Az első 100 páratlan számot add össze!
3.feladat:Írj eljárást, ami az összes cellát nagybetűssé teszi!
4.feladat:Írj eljárást, ami paraméterként kap két fájlt, és az első fájl tartalmát belemásolja a másodikba!Köszönöm előre is a segítséget
üdv
Dávid -
-
martonx
veterán
válasz
erich85T #1573 üzenetére
Hát fel kellett fognom a problémát. Makroval biztosan meg lehet oldani, de azzal sem egyszerű. Függvények szvsz erre nem alkalmasak.
Igaziból háttal ülsz a lovon. A nagy cégek nem véletlenül csinálják, hogy:
1. Vagy minden hónap végén ráteszik a késedelmi kamatot a folyószámlára, az éppen aktuális kamattal
2. Vagy a késedelmi kamat kiterhelésekori éppen aktuális kamattal számolnak, és ha pl. az ügyfél fizetni akar, vagy értesítőt küldenek neki, akkor ez az éppen aktuális szám szerepel rajta.
3. A kettő módszer keveréke, havonta ráteszik a késedelmi kamatot, akit pedig hó közben érdekel az aktuális állás, annak a 2-es módszerrel kiszámolják az utolsó hóközijét.
A szerződések apró betűs részeiben ez szerepelni is szokott. Éppen ezért, mert így utólag ember legyen a talpán, aki visszanézi a régi kamatokat, ezekhez számol munkanapokat, és a többi. Br...
De biztosan meg lehet csinálni, ha rengeteg időt rászánsz, biztos egész szép megoldások is születhetnek.
A problémád inkább algoritmikus jellegű, mintsem VB specifikus. -
erich85T
csendes tag
Sziasztok!
Múltkor már írtam a fórumban, és kaptam is segítséget amiért nagyon hálás vagyok, nagyon megkönnyítette a munkámat. Azonban akadt egy másik problémám is amit megkellene oldanom excelben, remélem ismét sikerül valamiféle segítséget kapnom.
Feladat: Kamatszámítás
Adott egy excel táblázat egy „Tartozások”, valamint egy „Jegybanki alapkamat” munkalappal.
A „Tartozások” munkalapon az alábbi oszlopok vannak:
Tartozás kezdetének dátuma - Tartozás kiegyenlítésének dátuma – Név - Tartozás összege (kamat nélkül) - Tartozás összege (kamattal)
Az első 4 oszlopban lévő adatok adottak, nekem az 5. oszlopba kellene valamilyen módon Excel segítségével összeget számolnom a „Tartozás kezdetének dátuma „ valamint a „Tartozás kiegyenlítésének dátuma” alapján a „Jegybanki alapkamat” fülön lévő értékekkel.A probléma az, hogy egy adott kezdő dátumtól az adott kiegyenlítés dátumáig akár több jegybanki alapkamat változás is történik. Eszerint több jegybanki alapkamattal kell számolni az adott intervallumban ahhoz, hogy megkapjuk a „Tartozás összege (kamattal)” oszlop értékeit.
Tehát röviden: Egy kezdő és egy befejező dátum közötti intervallumban az alaptartozásra akarom megkapni a kamattal számolt tartozás összegét úgy, hogy az adott dátumtól dátumig lévő időszakban több jegybanki alapkamattal kell számolnom.
Excel fájl: http://muszakitanacsado.hu/doksi/kamatszamitas2.xlsx
Találkozott e már valakin hasonló feladattal? Van-e valakinek valamiféle megoldása rá? Excelben ez egyszerűen megoldható vagy makroprogramot kell rá írni?
Előre is köszönöm a hozzászólásokat!
-
EkSYS
senior tag
Sziasztok!
Abban tudna valaki segiteni hogy hogyan lehet egy combobox tartalmát betölteni egy adott tartományból? (esetleg egy egyszerü példa is hasznos lenne
)
köszi!
Szerk: rá is jöttem:
Me.ComboBox1.List = Worksheets("Sheet1").Range("B12376").Value
-
Homer
tag
Örülök, hogy segíthettem.
Egyébként ajánlok neked is egy könyvet:
Balogh Gábor - Visual Basic és Excel programozás
a neten megtalálod...Megpróbálom elmagyarázni mi nem volt teljesen világos:
- Szóval ha van egy táblázatod amiben minden sor (esetleg minden oszlop is) egyforma formátumú, akkor nem gond ha előre meghatározott stílust állítasz be default értéknek.
régi sor(x) stílus = régi formátum- Ha a sorok megegyeznek, de az oslopok formátuma eltér (pl színük más) akkor a cellék formátumát egyesével kell állítgatni.
régi cella(régi sor, oszlop(1...x)) formátuma = default cellastílus (régi sor, oszlop(1...x) formátuma- Ha az eredeti sorok formátumai is eltérnek egymástól (azaz különbözőek), akkor még bonyolultabb a helyzeted, mert a default értéket az eredeti stílus szerint kell meghatározni.
tehát pl a visszaállításnál a
cella1 stílus = eredeti cellaformátum1.oszlop
cella2 stílus = eredeti cellaformátum2.oszlop
...Tudom nem teljesen érthető a magyarázat, bocs.
-
Baboka
tag
Köszönöm ez egyelőre jó. Az előző formátumnál arra gondoltam hogy ez a színezés ez egy előre formázott táblázatban lesz, nagyon sok oszlopa van azért kell ez hogy az egész sort átszínezi ha rajta állok és ha más sorba kerül az aktív cella akkor, az előző sornak a formátumát állítsa vissza. Nem tudom mennyire írom érthetően, még eléggé amatőr vagyok VBA-ból
-
martonx
veterán
válasz
Sweet Lou 6 #1567 üzenetére
Pedig a videók elég beszédesek, legyenek bármilyen nyelven.
-
martonx
veterán
válasz
Sweet Lou 6 #1563 üzenetére
internet
-
Homer
tag
válasz
Sweet Lou 6 #1563 üzenetére
Üdv.
Pár könyv amiket én nézegettem:
Magyar és angol nyelven is elérhetők:
Fekete (és Kék) könyv. (Black book)
Alex Mackey - A NET 4.0 és a VS 2010Csak angol:
Visual Basic 2010 Programmer's Reference
Professional Visual Basic 2010 and .NET 4
Visual_Studio_2010_All-in-One_For_Dummies...és ha nagyon kezdő vagy (, mint én is), akkor ezek is hasznosak lehetnek, mert a VB alapok elsajátításához szerintem jók:
James Foxall - Tanuljuk meg a Visual Basic 2005 használatát 24 óra alatt
Demeter M. Ibolya - Visual Basic 6.0 lépésről lépésre
Juhász Tibor, Kiss Zsolt- Visual basic 2008-2010 Programozasi összefoglalo
Tóth Bertalan - Programozzunk vb rendszerben(Úgy írtam a neveket, hogy rákeresve gugliban az első-második találat már a közvetlen link lesz.)
-
Sweet Lou 6
addikt
Üdv.
Tud valaki linkelni olyan forrást, amelyből megtanulhatom a VB.NET szintaktikáját?
-
Homer
tag
Szia!
Nem teljesen értettem amit akartál, de ha minden igaz akkor ilyesmi válaszra vársz.
Egyrészt az nem teljesen világos, hogy az intersect minek bele? Gondolom a több cella egyszerre történő kijelölése végett van benne, így ez esetben az általam javasolt megoldás nem működik majd. De azért gondolkodtam rajta. Tess:Public elozo, default As Integer
Const uj = 3Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Az új sor színének beállítására
Rows(Target.Row).Interior.ColorIndex = uj'Annak a vizsgálatára, hogy kell-e visszaállítani formátumot, azaz első kijelölés, vagy már volt előtte kijelölve valami?
If elozo <> 0 Then
Rows(elozo).Interior.ColorIndex = default
End If'Az előzőleg kijelölt sor száma
elozo = ActiveCell.Row' itt az eredeti cella formátumát kellene beállítani az 5 helyett de ezt pontosan nem értettem a leírásodból... :S
default = 5
End Sub -
Baboka
tag
Sziasztok!
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A1:A50")) Is Nothing Then Exit Sub
If Selection.Cells.Count > 1 Then Exit Sub
If Target <> "" Then
Rows(Target.Row).Interior.ColorIndex = 10
Else
Rows(Target.Row).Interior.ColorIndex = xlNone
End If
End Subezt a programot szeretném úgy átalakítani hogy ha kijelölök egy cellát akkor az egész sort beszinezze, de ha másik cellát jelölök ki akkor az előző sor visszaálljon az előző állapotába.
-
Homer
tag
válasz
26centi #1558 üzenetére
Szia!
"A makrót ugyan a forrás munkalaphoz hoztam létre..."
Szerintem ezzel is lehet gond. Csinálj egy modult és másold át abba a makródat. Egy próbát megér.Közben rájöttem, hogy balgaságot írtam.
A Rows nem csak Stringet hanem integert is el kellene hogy fogadjon, tehát a
Rows("2:2").select-nek ugyan úgy működnie kéne mint a Rows(2)-nek.
Bocs. -
26centi
csendes tag
Helló,
Kösz az ötleteket, sajnos a megoldás nem ez lett.
Nem értem, hogy miért, de annak ellenére, hogy egy alőző sorban aktiválom (mindegy, hogy .select vagy .activate-el) a cél munkalapot, a rows(n).select sort csak úgy fogadja el, hogy előtte a munkalapot is beírom.
Ez működik:
Worksheets("missing cost centers").Activate
Worksheets("missing cost centers").Rows(n).SelectEz nem működik:
Worksheets("missing cost centers").Activate
Rows(n).Select (Rows(CStr(n) & ":" & CStr(n)).Select -el sem)A makrót ugyan a forrás munkalaphoz hoztam létre, de ha ez a baj, akkor sem értem a hibaüzenetet. Ha a cél munkalap aktiválása a sor kiválasztás sorra már nem hat, akkor miért nem választja ki az n. sort az anya-(forrás)munkalapon???
Úgy látszik itt még bőven van mit megtanulni a hivatkozásokról, mert a hétköznapi logika alapján ez elég katyvasz.
Egyébként kösz a tippeket, a cellánkénti másolás és a képernyőfrissítés kikapcsolása is hasznomra lesz még.
Derűs, dolgos munkanapot
-
Homer
tag
válasz
26centi #1551 üzenetére
Szia!
Ha tudod a sorok számát akkor:Sub Akarmi()
Worksheets(1).Select
Dim ujsor As Integer
ujsor = 1
For Index = 1 To 10
Rows(CStr(Index) & ":" & CStr(Index)).Select
If Cells(Index, 2).Text <> "#HIÁNYZIK" Then
Selection.Copy
Worksheets(2).Select
Rows(CStr(ujsor) & ":" & CStr(ujsor)).Select
ActiveSheet.Paste
Worksheets(1).Select
ujsor = ujsor + 1
End If
Next Index
End SubEgyébként én cellánként másolgatnám az értékeket anélkül, hogy mindig kijelölgetném a második worksheetet valahogy így:
Ha a vizsgált cella értéke megfelelő akkor
Worksheets(2).Cells(XY).text=worksheets(1).cells(ZY).text
(Sokkal gyorsabb lesz afutása a makrónak, és nem vibrál a kép futás közben)
Jah, bocs, elfelejtettem írni, hogy az a baj, hogy a sor kijelölésének formája:
Rows("1:1").select
Ebből gondolom látod mi a gond: String paramétert várna a rows sub
Remélem segítettem -
26centi
csendes tag
válasz
martonx #1552 üzenetére
nos nem tudom mit jelent az pontosan, hogy létezik-e ezen a helyen, de miután deklaráltam, és még értéket is adtam neki ugyanezen subrutinban, gondolom létezik. ha más nem, értékadásnál már nyafogott volna, hogy baja van, de az lefut.
Sub missing_cost_centers()
Dim i, n As Integer
i = 9
n = 2
Do
Sheets...... -
26centi
csendes tag
sziasztok,
én is most teszem kezdőlépéseimet vba-ban. és nem szeret engem. se.egy óriási adathalmaz adott feltétel alapján kiválasztott sorát szeretném egy másik munkalap, változóban (n) tárolt számú sorába másolni. kreáltam is egy kódot.
Do
Sheets("tools in SAP 3100").Activate 'forrás munkalapIf Cells(i, 14) = "#Hiányzik" Then
Rows(i).Select ' átmásolandó sor
Selection.Copy
Sheets("missing cost centers").Select 'cél munkalap
Rows(n).Select 'ezen a ponton kiakad, Application-defined or object defined error üzenettel Hibakód:1004
ActiveSheet.rows(n).Paste
n = n + 1End If
i = i + 1Loop Until Cells(i, 1) = ""
sajnos a hibakód helpjét elolvasva sem kaptam a leghalványabb utalást sem hogy mi a nyűgje. két sorral feljebb pedig ugyanez az utasítás működik.
van valakinek ötlete, hogy miért nem vagyunk barátok?
előre is kösz,
derűs, dolgos munkanapot -
martonx
veterán
Mi sem álljon távolabb tőlem, mint bárki más helyett megoldani a feladatot. Azért szeretem tudni az alap feladatot, mert szeretek optimális megoldásokat adni. Általában azt tapasztalom, hogy sokan kérnek tanácsot, de már az alap koncepciójuk hibás. Ilyenkor szvsz sokkal nagyobb segítség a jó úton elindítani őket, mint a rossz úton továbblökni egy lépéssel.
De ha titok, hát titok -
Homer
tag
válasz
martonx #1546 üzenetére
Ne haragudj meg, de nem szeretném elárulni pontosan mi a feladat, és szerintem nem is az a fórumozás célja, hogy más oldja meg helyettünk a feladatot. Ezért kérdeztem általánosságban. Így lesz véleményem szerint a legtöbb fórumozó számára hasznos az általad javasolt megoldás is.
Egyébként köszönöm a hsz-edet! A listview-ból való törlés valóban egyszerű megoldás lenne, csak szerintem nem túl elegáns ilyenkor újraépíteni a kollekciót.
Mivel a kollekció elemeire csak az indexükkel lehet hivatkozni, az okozta a gondot, hogy a névsorba rendezett lista indexei összekeveredhetnek az eredeti kollekció indexeihez képest. A megoldást közben én is megtaláltam (pár órás próbálkozással rájöttem), hogy a collection elemeire lehet key-el is hivatkozni. Mivel a key sem visszakereshető programból, (így a listview feltöltésekor sem tudom átadni az adott elem key-jét), a kollekció minden objektumához hozzárendeltem egy-egy key integert. Ezt a key-t átadva a kollekció remove metódusának törölhető a kívánt elem.
-
martonx
veterán
Listview-ból törlés:
ListView1.Items.Remove(RowNum) - ahol rownum a listview selecteditem-je
Ha a fenti törlés megy, talán a legáltalánosabb megoldás, hogy a maradék listview elemekből csinálsz egy új kollekciót, a régi kollekciót meg letörlöd.
Kár, hogy nem árultad el, hogy mi is a feladat pontosan, mert így marad a hülye kérdésre hülye válasz játék. Azért remélem a fentiekkel tudtam segíteni.
-
Homer
tag
válasz
martonx #1544 üzenetére
Az a kérdés, hogy:
Ha egy kollekció elemeit listview-ban jelenítem meg akkor az egér jobb klikk-jére megjenő törlés menüponttal hogyan tudom kitörölni a kollekció megfelelő elemét?Egyébként a kérdőjel azt jelenti a mondat végén, hogy az egy kérdés lenne. A fenti hsz-ben pedig:
"A kérdésem az lenne, hogy az ily módon feltöltött listview-ból hogyan tudom visszanyerni az eredeti objektum "helyét" a kollekcióban?"
-
martonx
veterán
Itt ma senki nem tud értelmesen beszélni? Az előbb egy emberke betett ide egy rakás kódot, de nem kért semmit, aztán meg írta, hogy tárgytalan, sosem fogjuk megtudni mit szeretett volna.
Most jössz te, beömlesztesz ide egy rakás információt, csak éppen az nem derül ki, hogy mit is akarsz.
Tanuljunk már meg kérdezni, és válasszuk már el a lényeget a lényegtelentől. Első körben csak erre válaszolj 1-2 mondatban:
MI A FELADAT? Mit akarsz csinálni?
Nem érdekel a listview-d, nem érdekelnek a collection-ök rokoni kapcsolatai. Azt mondd meg, hogy mi az alap felállás, mit szeretnél megoldani a programoddal? -
Homer
tag
Sziasztok!
Még csak a szárnyaimat bontogatom programozás terén, és nem is ez a szakterületem, de a munkám során néha jól jönne némi programozástechnikai ismeret, ezért vágtam bele a fejszémet a VB-be. Egy olyan dolgot szertnék kérdezni tőletek amire nem konkrét forráskódot várnék megoldásként, inkább az elméleti háttere érdekelne a dolognak.Adott egy collection amiben kétféle adattípusú adatot tárolnék. Az egyik féle osztályból (kereszteljük őket mondjuk "A-típus"-ra) létrehozott objektum tartalmaz vagy 5-6 féle mezőt + pár eljárást és függvényt a kezelésükre. A másik osztály (fantáziadúsan, legyen mondjuk "B-típus") az A típusból van örköltetve viszont még plussz 5 adatot tartalmaznának az ebből képzett objektumok. A kétféle objektum egy kollekcióba gyűjthető, és a "TypeOf(object) Is A-típus" kifejezéssel megállapítható az adott elem mezőinek mivolta is. Ahhoz, hogy a feltöltött listát megjeleníthessem használnék egy Listview1 objektumot.
A lista elemeit fel tudom tölteni ehhez hasonló módon:
...
For each elem as object in kollekció
if typeof(elem) is Atípus then listview1.items.add(elem.mező_a)
...(elem.mező_b)
...
else
listview1...items.add(elem.méret1)
nextA kérdésem az lenne, hogy az ily módon feltöltött listview-ból hogyan tudom visszanyerni az eredeti objektum "helyét" a kollekcióban? Lehet hogy alapból rosszul gondolkodom és nem is így kéne hozzálátni a feladathoz. Már többféleképpen is próbáltam, de mindig zátonyra futok valahol. A gond akkor jelentkezik amikor kijelölök egy listaelemet és ki akarom törölni a kollekcióból. Arra gondoltam, hogy a törlési eljárásban deklarálok egy objektumot, aminek manuálisan visszatöltöm az adatmezőit és ezt az objektumot használom a beazonosításra.
így valahogy:
sub gomb1.click(...)handles gomb1.click
obj.mező1 = listview1.selecteditems(0).items.tostring
obj.mező2 = istview1.selecteditems(0).subitems(0).items.tostring
...(és így végig az összes mezőn)
...
törlés(obj)
end subsub törlés(mit as object)
kollekció.remove(mit)
end subNagy balgaságot követek el így? Van ennél egyszerűbb mód, azon kívül hogy adatbázist használnék? (Még addig nem juttotam el a könyvben :$
. Még egy dolog mielőtt valaki az index-ek használatán gondolkodna: A listview-ban emelkedő sorrendben szeretném megjeleníttetni az elemeket, ami azt eredményezi hogy pl a 100-adiknak beírt adat legelőre kerül 0-s index-el(!), viszont a kollekcióban pedig időrendi sorrend szerint vannak tárolva. Viszont ami egyszerűsíti a helyzetet az az, hogy egy objektum sem ismétlődhet a sorban.
Előre is köszönöm ha valaki válaszra méltatna és megérti a kérdésemet!
-
RexpecT
addikt
válasz
martonx #1541 üzenetére
Ott volt a leírásban, a függvény megkap egy sztringet amiben számok állnak vesszővel elválasztva ezek közül adja vissza a két legnagyobb szám összegét:
Function osszead(param As String)
Dim szoveg() As String, szam1 As Integer, szam2 As Integer, i As Integer
szoveg = Split(param)
For i = LBound(szoveg) To UBound(szoveg)
If szam1 < szoveg(i) Then
If szam2 < szoveg(i) Then
szam1 = szam2
szam2 = szoveg(i)
Else
szam1 = szoveg(i)
End If
End If
Next i
osszead = szam1 + szam2
End Function
Sub main()
Dim szamok As String
szamok = "1 2 3 20 5 6 8 9 8"
MsgBox osszead(szamok)
End Sub -
RexpecT
addikt
Lenne egy feladatom:
Készítsen olyan függvényt, ami a paraméterként egyetlen sztringet kap, ami egész számokat tartalmaz szóközzel elválasztva. A függvény adja vissza a két legnagyobb szám összegét. A sztring legalább két számot tartalmaz.Function osszead(param As String)
Dim szoveg() As String
Dim szam1 As Integer
Dim szam2 As Integer
szoveg = Split(param)
First = LBound(szoveg)
Last = UBound(szoveg)
For i = First To Last - 1
For j = i + 1 To Last
If szoveg(i) > szoveg(j) Then
Temp = szoveg(j)
szoveg(j) = szoveg(i)
szoveg(i) = Temp
End If
Next j
Next i
szam1 = szoveg(i)
szam2 = szoveg(j)
osszead = szam1 + szam2
End Function
Sub main()
Dim szamok As String
szamok = "1 2 3 20 5 6 8 9 8"
MsgBox osszead(szamok)
End Sub -
Des1gnR
őstag
-
Des1gnR
őstag
válasz
martonx #1524 üzenetére
Erre nem gondoltam, de sajnos így is ugyan azt a hibát dobja:
http://img259.imageshack.us/img259/1186/hibag.png -
bazsi0322
tag
Köszönöm szépen mindkettőtöknek, sikerült
-
ArchElf
addikt
válasz
ArchElf #1529 üzenetére
Egészbe:
Sub Main()
Dim ev As Integer
Dim szokoev As String
ev = 0
szokoev = ""
If Integer.TryParse(Console.ReadLine(), ev) Then
If (ev Mod 400 = 0) Then
szokoev = ""
ElseIf (ev Mod 100 = 0) Then
szokoev = "nem "
ElseIf (ev Mod 4 = 0) Then
szokoev = ""
Else
szokoev = "nem "
End If
Console.WriteLine("A {0}. év {1}szökőév.", ev, szokoev)
Else
Console.WriteLine("A beadott érték nem szám.")
End If
Console.ReadKey()
End SubC#-ban a % a VB-s MOD (egész osztás maradéka).
AE
-
bazsi0322
tag
Hali!
Kérnék egy kis segítséget.
Ezt a programot kellene megírni: Írjunk egy programot, amely az adott évről eldönti, hogy szökőév-e! Egy év szökőév, ha néggyel osztható, azonban a százzal osztható évek közül csak a négyszázzal is osztható évek a szökőévek!!VISUAL BASIC 2010 EXPRESS-ben kellene!!
PLS HELP -
Des1gnR
őstag
válasz
martonx #1522 üzenetére
Lényeg, hogy működik.
Köszönöm a segítséget, sokat jelentettLenne még egy kérdésem.
A program rendesen működik, ha olyan tartalmat töltök le amihez nem kell bejelentkezni az oldalra. Ha olyan mappát nyitok meg amihez be kell jelentkezni, akkor ugye azt csak a bejelentkezés után tehetem meg. Ezzel nincs is semmi gond, teljesen ugyan olyan felületű oldalra visz, még a gombok inputjai sem változnak, viszont időtúllépéssel dob egy hibát.
Ha csak a webbrowser ablakba töltöm le akkor simán letölti, de ha ráengedném a "ciklust" akkor dobja a hibát. Valami ötlet erre? -
Des1gnR
őstag
válasz
martonx #1518 üzenetére
Köszönöm a segítséget, ez nagyon korrekt válasz volt.
Ezt a verziót választottam:
Dim mettől As Integer = TextBox4.Text
Dim meddig As Integer = TextBox2.Text
Dim i As Integer
Dim a As String
For i = mettől To meddig
a = i
Dim link As String = WebBrowser1.Document.GetElementById("save").GetAttribute("href")
TextBox1.Text = ("https://familysearch.org" + link)
Dim sourceURL = TextBox1.Text
Dim filedir = ("C:\" + a + ".jpg")
WebBrowser1.Document.GetElementById("next").InvokeMember("click")
My.Computer.Network.DownloadFile(sourceURL, filedir)
NextDe nem várja meg, hogy letöltsön a kép, és már megy is tovább a for ciklus.
-
martonx
veterán
válasz
Des1gnR #1517 üzenetére
Webclient-tel kétféleképpen tudsz letölteni. Aszinkron módon, azaz elindul a letöltés, de a kódod fut tovább, nem várja meg, hogy mi lett a letöltés eredménye. Ez a DownloadFileAsync.
Vagy szinkron módon, azaz elindul a letöltés, a kód megvárja míg letöltődik, és csak ezután fut tovább. Ez a sima DownloadFile.
Remélem érthető a különbség.
Emellett a létező legegyszerűbb letöltési lehetőség a My.Computer.Network.DownloadFile használata.
Sőt letölteni lehet a webhttprequest-tel is. A lehetőségek tárháza szinte végtelen.
Esetedben javaslom a szinkron letöltést, mert így a legegyszerűbb sorba mindent letölteni, és ha jól értem nem több száz megás cuccokat töltesz le.
De ha már aszinkron, azért nem működik a DownloadProgressChanged eseményed, mert ehhez a WebClient-edhez előbb hozzá kell kapcsolnod ezt az eseményt. Ezt az AddHandlerrel tudod megtenni. -
Des1gnR
őstag
válasz
martonx #1516 üzenetére
Ezt a szinkron-aszinkron dolgot nem teljesen értem.
Erről az oldalról töltenék le: https://familysearch.org/pal:/MM9.3.1/TH-1951-20648-29594-35?cc=1452460&wc=12890478És itt a teljes forráskód:
Imports System.Net
Public Class Form1
Private WithEvents download As WebClient
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim download As New WebClient
download = New WebClient
Dim i As Integer
Dim a As String
'For i = 1 To 3
a = i
Dim link As String = WebBrowser1.Document.GetElementById("save").GetAttribute("href")
TextBox1.Text = ("https://familysearch.org" + link)
Dim sourceURL = TextBox1.Text
Dim filedir = ("C:\" + a + ".jpg")
ProgressBar1.Value = 0
ProgressBar1.Maximum = 100
Try
download.DownloadFileAsync(New Uri(sourceURL), (filedir))
Catch ex As Exception
MsgBox("Failed" + ErrorToString(), MsgBoxStyle.Critical)
End Try
WebBrowser1.Document.GetElementById("next").InvokeMember("click")
' Next
End Sub
Private Sub download_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles download.DownloadProgressChanged
ProgressBar1.Value = e.ProgressPercentage
End Sub
End ClassEz még változni fog itt-ott annyiban, hogy lehessen mappát választani és lehessen megadni más url-t is, de most csak az a lényeg hogy működjön
-
Des1gnR
őstag
válasz
Des1gnR #1514 üzenetére
Jah azt még jelezném, hogy ez nem akar működni:
Private Sub download_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles download.DownloadProgressChanged
ProgressBar1.Value = e.ProgressPercentage
End Sub
Ezen kívül más megoldás lehetséges? -
Des1gnR
őstag
Sziasztok!
Egy olyan programot készítek ami egy weboldalról tölt le egy képet, majd ugrik a következőre és letölti azt is és így tovább
Így néz ki a kódrész ami a fájlt letölti:
Try
download.DownloadFileAsync(New Uri(sourceURL), (filedir))
Catch ex As Exception
MsgBox("Failed" + ErrorToString(), MsgBoxStyle.Critical)
End TryAzt szeretném megcsinálni, hogy csak akkor ugorjon át a következő képre, ha már letöltötte az aktuálisat. Mivel vizsgáljam ezt?
Válaszotokat előre is köszönöm.
-
erich85T
csendes tag
válasz
martonx #1511 üzenetére
Igen ez stimmel, valóban transzponálásról van szó. Viszont automatizálni szeretném ezt a folyamatot, nekem arra kell egy program, hogy a tartományt kiválassza és a fent leírt elv szerint transzponálja. Nagyon sok sor van a táblázatban, és a tartományok méretei is különböznek. Nekem azt kellene, hogy megvalósítsa a program, hogy kijelölje a megfelelő tartományt, jelen esetemben az egymás alatt lévő azonos neveket. Ehhez a névhez tartozó adatokat pedig egymás mellé oszlopba transzponálja.
tehát ebből:
név1 - adat1
név1 - adat 2
név1 - adat 3név2 - adat 4
név2 - adat 5
név3 - adat 6ezt csinálja:
név 1 - adat 1 - adat 2 - adat 3
név 2 - adat 4 - adat 5
név 3 - adat 6Köszönöm az eddigi hozzászólásokat, várom a további megoldásokat, javaslatokat.
-
ArchElf
addikt
válasz
erich85T #1509 üzenetére
Excel topicban szerintem hamarabb találsz megoldást
AE
-
erich85T
csendes tag
Sziasztok! Új vagyok a fórumon. Nem tudom, hogy mennyire nehéz megvalósítani, de ha esetleg van valakinek valami ötlete, esetleg kész megoldása a problémámra azt szívesen fogadnám. A kérdésem excel makro programozása témakörhöz kapcsolódik.
Van két oszlop, az első oszlopban nevek vannak a másodikban meg a névhez tartozó adatok. Valahogy így:
név - adat
a - x
a - y
a - z
b - q
b - w
b - p
b - qEzen táblázatot úgy szeretném transzponálni, hogy a név (egy adott sorban) csak egyszer szerepeljen, és az adatok a sorokból, egymás mellé kerüljenek oszlopokba. Így:
a - x - y - z
b - q - w - p - qTöbb problémát is meg kellene így oldani a kódolásban:
- a kódnak figyelnie kell az azonos neveket, mivel valamelyik névhez lehet másik névhez meg akár 200 adat is tartozhat.
- ennek megfelelően az egymás mellé kerülő oszlopok száma is változik
- át kell rendeznie a táblázatot,a fenti formának megfelelően stb stb.Ha valakinek van erre ötlete, hogy miképpen lássak neki, esetleg kész kódja van ehhez azt megköszönném.
Erik
-
ArchElf
addikt
válasz
Cpt. Flint #1505 üzenetére
Azért olvasgass utána, jó?
Google keresést csak akkor szoktam linkelni, ha az első oldalon nagyrészt csak releváns találatok vannak. Ebben az esetben nem szükségszerűen VBA témakörben - mivel ez az alapelv majd minden fejlesztői nyelvre azonos.
Amúgy em nagyképű itt általában senki (legalább is itt a programozás fórumon talán nem azok a befordult kockák vannak csak, mint máshol...) Másrész nem kell offenzívnek venni azt, hogy egyből az a reakció, hogy "hülyeségeket kérdezel". Attól még, hogy megsértödsz, hülye a kérdés - legalább is azt mutatja, hogy az alpokkal nagyon nem vagy tisztában. Nem probléma magában ez sem - csak nem kell feltétlen arra várni, hogy valaki megoldjon helyetted mindent - és nem kell érzelmi irányba terelni a dolgot, hiszen gyakorlati kérdésben jöttél.
Egy kis alázat nem árt, még ha nehezen is megy néha. Soha nem találkoztál az itt fórumozó emberekkel, és talán soha nem is fogsz - ha megvan a megoldás, vagy az oda vezető út, ne akadj fent azon, hogy valakinek rossz napja van. Itt mindenki önszántából magyarázná el (illetve - ha rossz napja van - éppen nem magyarázná el) 1001-szer az alapokat.Ha hobbi szinten csinálod, szánj rá - még - egy-két órát, és máris csak annyi hátrányban leszel, hogy nem tudod egyből hogy merre indulj el (nem pedig alapvető problémáid lesznek).
GetActive - ha vannak benne új dolgok (a használt TypeName függvény kivételével) - pl. rekurzió, típusok, akkor tényleg mielőbb keríts egy (alapszintű, bármilyen nyelvet bemutató) programozási könyvet. Nem bántásból mondom: 20-30 oldal után kész megvilágosodásban lesz részed, ha van érzéked a témához.
Sub csakszam(KeyCode, Shift) - ebben az esetben u.n. Varian típusra deklarálod a változókat (típus nélküli változó), ami az értékadáskor pontosítja a változó típusát. Használata mellőzendő, hacsak nem elkerülhetetlen - mivel növeli a kód bizonytalanságát. Ugyanez vonatkozik az Option Explicit-re is: célszerű használni, mert rákényszerít a pontosságra.
MaskedEdit VB6 kontrol, nem VBA (VB 6.5 = Visual Basic for Applications = gyak. Office VB). Azért nem találtad, mert valami egységcsomagban lenne benne (asszem MS Common Controls, vagy valami hasonló) - neten rá kell keresni és lehetőleg MS oldalról letölteni.
Azután ha megvan (feltelepítve), akkor először hozzá kell adni a References... hez, majd már használható lesz a kontroll-ok között.AE
-
Cpt. Flint
tag
válasz
martonx #1503 üzenetére
"Cpt. Flint pedig nem attól hülye, hogy itt mi a rangja, hanem a kérdése minőségétől. ... Biztos én vagyok a bunkó, de egyszerűen valami hihetetlen mélységekből jönnek elő ezek a mai fiatalok."
Cpt. Flint nem hülye, csak ugyanolyan érzékeny, mint te. A "kérdés minőségétől" se lesz valaki hülye, legfeljebb tudatlan. Azért kérdez. Nem láttam a fórum szabályzatában, hogy csak okleveles, elsővonalbeli programozók lehetnek tagok és azok is csak – általad – értelmesnek minősített kérdéseket tehetnek fel. Nagyon szépen kérlek, ha hülyének tartasz, ne foglalkozz a hozzászólásaimmal. Bizonyára te is tudnál olyat kérdezni, amiért én körberöhögnélek (lehet, hogy már kérdeztél is máshol), és a lehülyézés bizonyára neked is rosszul esne (mert az ekkora arcoknak szokott leginkább).
Ja, és sajnos baromira nem vagyok mai fiatal. Valszleg pont ez az egyik oka annak, hogy kérdeznem kell, én nem úgy kezdtem, hogy 10 évesen már javascriptet írtam mondjuk, vagy akármi. Kb. egy avíttas FORTRAN könyv volt az első kapcsolatom a számítástechnikával. Lehet, azóta se vittem többre véleményed szerint, de ez annyira azért nem izgat. És hát hiába, nem ez a szakmám, úgyhogy ne kívánd tőlem, hogy nekiálljak informatikusnak tanulni, mielőtt kérdezek. Elég nekem a saját szakmámat követni, dolgozni, családot eltartani. Elhiheted, hogy csak akkor fordulok a fórumokhoz, ha sehol nem találtam számomra érthető megoldást. Aztán van aki bunkózik, van aki válaszol.
-
Cpt. Flint
tag
válasz
ArchElf #1502 üzenetére
nem vagyok fejlesztő. ez probléma? itt csak azok lehetnek tagok? mert akkor szorri, lelépek. autodidakta excel vba projekt író vagyok (mondjuk), félig kényszerből, félig szórakozásból.
Az angolom is hagy kívánnivalót maga után, úgyhogy ha nagy ritkán végképp nem találok valamire megoldást, akkor szoktam jólelkű fórumozókhoz fordulni. nyilván valszleg magában az objektumorientált programozás alapjaiban is vannak hiányosságaim, ezt vagy elnézitek nekem, vagy nem. ha nem, akkor nem válaszoltok, volt már ilyen.
ha egy többszázas google találati oldalt linkelsz, az nemigen ösztönzi az embert olvasásra. ettől függetlenül szemezgettem belőle, de az általad írtakat sajna pont nem találtam meg."- Ha egy függvény definíciójában van definiálva egy változó (vastaggal)
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
azt hiába definiálod előre, az adott függvényben az itt definiált "változat" fog élni."
most már érteni vélem (úgy látszik, mégis el tudod magyarázni ha van kedved, ugye nem is kellett hozzá olyan hatalmas energia). arra valóban nem gondoltam, hogy a KeyDown függvény paramétereiben voltaképp újradefiniálom a változót...
de nekem úgy tűnik, a csakszam-hoz már elég ez is: Sub csakszam(KeyCode, Shift)már látom, hogy mi volt a ByRef hiba oka; többféle változónévvel futottunk itt a példákban, aztán nem egyezett az átadott az átvettel. úgyhogy valóban, köszi, működik.
Az a GetActive nagyon frappáns ki hackelés
, mélységes hálám a visszafejtésért (vannak benne önmagukban is új/hasznos dolgok számomra); de hogy miért (csak) így működik, azt nem tudod véletlenül? Szerintem az ActiveControl így elég használhatatlan/bacsapós önmagában... nincs olyan utasítás, ami ténylegesen, közvetlenül, azonnal azt az egy darab, fókuszban levő vezérlőt adná eredményül?
masked editre akkor semmi ötlet?
-
martonx
veterán
válasz
ArchElf #1502 üzenetére
ember te nagyon diplomatikus vagy.
Cpt. Flint pedig nem attól hülye, hogy itt mi a rangja, hanem a kérdése minőségétől.
Értsd ha egy programozás fórumban megkérdezed, hogy miért piros a majom feneke, akkor nem azért fognak kiröhögni mert újoncként kérdezed. Sőt egy újoncnak még esetleg jobban el is néznek egy ilyen kérdést.
Devportálon meg prog.hu-n mostanában renike24 nick tud olyanokat kérdezni ASP.Net vonalon, hogy ajánlom mindenki figyelmébe, aki jót akar röhögni. Próbáltam volna rávezetni a megoldásra (tanulás, olvasás), de még én lettem leszólva, hogy miért nem mondom meg a megoldást.
Biztos én vagyok a bunkó, de egyszerűen valami hihetetlen mélységekből jönnek elő ezek a mai fiatalok. -
ArchElf
addikt
válasz
Cpt. Flint #1501 üzenetére
Pedig jó volna ha megértenéd a változók hatókörét. Nem tudom milyen fejlesztési tapasztalatod lehet, de ez a VB-re nem nagyon terjed ki.
Anélkül elég nehezen tudom elmagyarázni azt, amit látsz (és nem éresz meg). De röviden azért megpróbálom:
- Ha egy függvény definíciójában van definiálva egy változó (vastaggal)
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
azt hiába definiálod előre, az adott függvényben az itt definiált "változat" fog élni.
- Ha definiálsz egy változót egy függvényben, attól még az onnan meghívott függvényekben a változó nem létezik. A változó hatóköre csak a definiálás helyére érvényes (kivétel a kód "gyökerében" globálisan definiált változók, de azok a függvényekben felüldefiniálhatók - pl. mint paraméter)
- Használd az Option Explicit parancsot (kód legelején), hogy lásd, hogy minden változód helyesen van definiálva (és nem írtál el sehol semmit). Ez az utasítás kikényszeríti a változók definiálását.Az ActiveControl az aktuális konténerben aktív kontrolt kéri le. Arra meg kell nézned, hogy Container típusú-e és vannak-e tagjai, ha iden abban is meg kell nézni, hogy van-e aktív komponens -rekurzívan el lehet jutni az utolsó tagig, ami jelen esetben a TextBox1 komponens. De a KeyCode-ot és Shift-et nem lehet nem átadni. (Ha pedig odaírod, hogy ByVal - azaz érték és nem referencia szerinti átadás van -, akkor átkonvertálja neked az MSForms.ReturnInteger-t mezei Integer-ré)
Option Explicit
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
csakszam KeyCode, Shift
End Sub
Sub csakszam(ByVal KeyCode As Integer, ByVal Shift As Integer)
Dim Vezerlo As Control
Set Vezerlo = GetActive(ActiveControl)
'MsgBox TypeName(GetActive(ActiveControl))
If TypeName(Vezerlo) <> "TextBox" Then
Exit Sub
End If
If Shift <> 0 Then
Vezerlo.Locked = True
Else
If KeyCode = 8 Or KeyCode = 46 Or _
(KeyCode >= 48 And KeyCode <= 57) _
Or (KeyCode >= 96 And KeyCode <= 105) Then
Vezerlo.Locked = False
Else
Vezerlo.Locked = True
End If
End If
End Sub
Private Function GetActive(con As Control) As Control
If TypeName(con) = "UserForm" Then
Dim f As UserForm
Set f = con
Set GetActive = GetActive(f.ActiveControl)
ElseIf TypeName(con) = "MultiPage" Then
Dim mp As MultiPage
Set mp = con
Set GetActive = GetActive(mp.SelectedItem)
ElseIf TypeName(con) = "Page" Then
Dim pg As Page
Set pg = con
Set GetActive = GetActive(pg.ActiveControl)
ElseIf TypeName(con) = "Frame" Then
Dim fr As Frame
Set fr = con
Set GetActive = GetActive(fr.ActiveControl)
Else
Set GetActive = con
End If
End FunctionAE
-
Cpt. Flint
tag
válasz
ArchElf #1500 üzenetére
Általánosságban: jó, majd olvasgatok, ha lesz időm. (de azért, mert _itt_ újonc vagyok, még nem bizti, hogy totál hülye is.)
VB 6.5, Office 2003 SP31-2. Melyik függvény hozza létre újra, ha public?
Én ezt csináltam (volna, ha menne):Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 'Ügyirat főszámba csak számot enged írni
Dim vezerlo As Object
set vezerlo = ActiveControl
csakszamEnd Sub
Sub csakszam()
If Shift <> 0 Then
vezerlo.Locked = True
Else
If KeyCode = 8 Or KeyCode = 46 Or _
(KeyCode >= 48 And KeyCode <= 57) _
Or (KeyCode >= 96 And KeyCode <= 105) Then
vezerlo.Locked = False
Else
vezerlo.Locked = True
End If
End IfEnd Sub
Úgy gondoltam, hogy amikor a KeyDown subból meghívom a csakszam subot, akkor a KeyCode és a Shift ott is ugyanazt az értéket fogja még tartalmazni. De nem, ezek kiürülnek. Akkor is, ha külön felveszem őket public változóként. Ezért a KeyDown subban mindkettő értékét kiíratom egy-egy saját változóba (kc=KeyCode, ks=Shift) és a csakszam subban már azokat használom. Ez nem probléma, csak két plusz sor és két plusz változó.
Kipróbáltad, hogy át lehet-e adni (úgy, ahogy írtad) a KeyCode-ot? Mert nálam nem lehet, csakszam TextBox1, KeyCode-re ezt kapom: Compile error: ByRef type mismatch.
És mint írtam, pont azt szeretném elkerülni, hogy a TextBox1-et bárhol is leírjam (értékadásba vagy érték átadásba), mert azt majd akkor minden egyes subban át kell írnom a megfelelőre (ráadásul még ComboBox is lesz). Ezért szeretném az ActiveControlt használni helyette, ami általános, és elvileg mindig azt adná, ami épp kell).
"le kell ellenőrizni, hogy az aktuális ActiveControl TextBox-e"
Leellenőriztem, nem az. De MIÉRT nem az, mikor azon van a fókusz, abban szerkesztek, abból fut le a KeyDown sub??? A VB helpje szerint az ActiveControl az, amelyik épp fókuszban van. De mégsem a TextBox1-et kapom, hanem a MultiPage1-et.
Próbáltam így: set vezerlo=MultiPage1.Pages(0).ActiveControl. Ez eggyel beljebb vitt, mert így Frame1-et kaptam eredménynek, amiben a TextBox1 is van, de még mindig nem a textboxot... És ez már ebben a formában úgysem érne semmit, hiszen már akkor ha a konkrét lapot meg kell adnom, az sem jobb semmivel, mintha éppenséggel a konkrét vezérlőt adom meg.
Én sem igen szeretem a globális változókat szaporítani, de miért kell elfelejteni? Van valami komoly hátrányuk?
3. Miért lenne hack? Ez egy egyszerű, frappáns megoldás, egy darab létező tulajdonságot állítok át, és a felhasználó annyit lát, hogy ha nem megfelelő billentyűt nyom, egész egyszerűen nem történik semmi. Nyista vágólap, mert a Ctrl+akármit ez a rutin a KeyCode-ok közül nem engedélyezi (ugye vizsgálom a Shift-et, és ha nem 0, akkor eleve locked, de ha éppen nem a Ctrl-ra, akkor meg a v-re lenne az).
4. sem a VB helpjében, sem az Object Browserben nem találok MaskedEditet, egyetlen Mask tulajdonságot leltem, ami csak a CommandBarButton-ra alkalmazható.
Osztályom sincs olyan, hogy MaskEdBox, vagy akár MaskedTextBox. Sőt, az ominózus MSMASK32.OCX sem található meg a gépemen.Egyébként természetesen köszönöm a segítséget és az eszmecserét, sokat tanulok belőle.
Új hozzászólás Aktív témák
Hirdetés
- A fociról könnyedén, egy baráti társaságban
- Házimozi belépő szinten
- LEGO klub
- Milyen pendrive-ot vegyek?
- iPhone topik
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Milyen egeret válasszak?
- Azonnali informatikai kérdések órája
- Folyószámla, bankszámla, bankváltás, külföldi kártyahasználat
- Egyre csak fejlődik az AI, emberek tízezreit rúgja majd ki a BT
- További aktív témák...
- PS5 Slim Disc 1TB 2026.10.08 GARANCIA
- Bomba Ár! Dell Latitude 3190 - Intel N4120 I 4GB I 128GB SSD I 11,6" HD I Cam I W11 I Garancia!
- Bomba Ár! Dell Latitude 3190 - Intel N4120 I 4GB I 64GB SSD I 11,6" HD I Cam I W11 I Garancia!
- Bomba ár! Dell Latitude E6520 - i7-2760QM I 8GB I 256SSD I Nvidia I HDMI I 15,6" HD+ I W10 I Gari!
- Bomba ár! Dell Latitude E7240 - i7-4GEN I 16GB I 256SSD I 12,5" HD I HDMI I Cam I W10 I Garancia!
- BESZÁMÍTÁS! 6TB Seagate SkyHawk SATA HDD meghajtó garanciával hibátlan működéssel
- Bomba ár! Fujitsu LifeBook U758 - i5-8GEN I 8GB I 256GB SSD I HDMI I 15,6" FHD I W11 I Garancia!
- Samsung Galaxy A32 4G 128GB, Kártyafüggetlen, 1 Év Garanciával
- Konzol felvásárlás!! Nintendo Switch
- ÁRGARANCIA! Épített KomPhone Ryzen 5 7600X 32/64GB RTX 5070 12GB GAMER PC termékbeszámítással
Állásajánlatok
Cég: PC Trade Systems Kft.
Város: Szeged
Cég: CAMERA-PRO Hungary Kft
Város: Budapest