Kezdőlap › Fórumok › Excel programozás › UserForm
- This topic has 7 hozzászólás, 2 résztvevő, and was last updated 8 years, 10 months telt el by 7even.
-
SzerzőBejegyzés
-
2015-12-20-19:25 #2424
Sziasztok!
Éppen az űrlapokkal ismerkedem és felmerült egy kérdés, remélem tud valaki segíteni…
Adott egy űrlap, ami tartalmaz egy db combobox-ot és 2 db textboxot. A kérdésem az, hogy hogyan tudnám a combobox-ban kiválasztott elem két oszlopának értékét átadni a megfelelő két textbox-nak (cím, szerző)?Jelenleg ennyi a kódom:
Private Sub ComboBox1_Change()
End SubPrivate Sub TextBox2_Change()
End SubPrivate Sub UserForm_Initialize()
‘Kombipanel feltöltése
With Me.ComboBox1
.ColumnCount = 3
.BoundColumn = 1
.ListWidth = 400
.ColumnWidths = „50;200;100”
.List = Sheets(1).Range(„adatok”).Value
.Value = „<válassz>”
End WithWith Me.TextBox2
.Value = ComboBox1.Value
End With
End Sub- A témakör módosításra került: 8 years, 11 months telt el-7even.
Attachments:
You must be logged in to view attached files.2015-12-20-21:08 #2427Szia!
Valahonnan olyan ismerős ez a kód… 🙂
Szóval a Kombi panel csak egy értéket „jegyez meg”, azt, ami a kötött oszlopban van.
A többi oszlopban lévő értéket csak esetleg mutatja, de nem tartalmazza az űrlap.Ezért ezeket VLOOKUP-al tudod kikeresni az adatok tartományból.
Persze ehhez az kell, hogy a Bound Column, azaz az első oszlop egy egyedi azonosító legyen. Emiatt szoktuk az első oszlop szélességét nullára venni, de valójában azt választjuk ki.De ha az első oszlopod neveket vagy címeket tartalmaz, és abban nincs egyforma, akkor persze nem kell nullázni a szélességét, az is lehet egyedi azonosító.
Na de nézzük a konkrétumot:
Tegyük fel, hogy az „adatok” tartományban a Cím a második oszlop.Private Sub ComboBox1_Change() Textbox1.Value = Worksheetfunction.Vlookup(ComboBox1.Value,Sheets(1).Range(“adatok”),2,0) End Sub
Szerintem.
Nem próbáltam.
Imre
2015-12-21-10:06 #2428Szia!
Igen, ismerős lehet, hiszen tőled származik. 🙂
Ohh nagyon nagyon szépen köszönöm! Ez így már kerek, bár még hibát dob a függvény, de majd rájövök mi a hiba 😉 nagyon igyekszem megérteni, hogy milyen is a userform-ok „mélylélektana”, arra még nem sikerült rájönnöm, hogy mi a subok futási sorrendje. Pl. hogy miért az initialize fut elsőként amikor a modulomból meghívom a form-ot a show paranccsal. Honnan tudja, hogy pont azt a rutint kell elsőként futtatnia. Illetve, hogy ezt a függvényt miért a combobox1 rutinjába kell írni és miért nem a textbox rutinjába (a megfelelő sorrendben)? Tehát vannak még homályos foltok, ám addig nem nyugszom, amíg meg nem tanulom. 🙂Attachments:
You must be logged in to view attached files.2015-12-22-22:22 #2430Na, egy kicsit körbejártam a problémát, mert valóban volt itt egy olyan gond, amivel még nem foglalkoztam Én sem. Ahogy a tanfolyamon is említettem, eddig élesben nem nagyon foglalkoztam userform-os alkalmazásokkal.
Volt két alap hiba. Az egyik, hogy miután bemásoltad a kódot a fórum weboldaláról, nem vetted észre, hogy a range(„adatok”) dupla idézőjelei nem egyenesek, hanem ferdék, azaz nem a VBA szintaxisának felelnek meg. Ezeket kézzel vagy cserével cserélni kell. Ezt valószínűleg a WP editor rontotta el.
A másik, amit Én is elmulasztottam kezelni, hogy ha választasz valamit a Combi panelben, akkor az szöveges lesz, de a Kód oszlopban számok vannak,ezért még egy Val függvényt be kell iktatni. Enélkül a Vlookup nem fog találni semmit, és hibával elszáll.A lényegi problémát viszont nem ezek, hanem a következő okozta:
Miközben az Initialize rutin fut, és eléri a BoundColumn=1 sort, az kiváltja a Combobox1 Change eseményét. A Change-ben pedig van egy Vlookup, ami keresi a Combobox1.value értéket a tartomány első oszlopában. de mi van éppen a Combipanelben? Egy nagy semmi, mert még el sem értünk arész betöltéséig. ha meg eljutottunk volna, akkor pedig a "<válassz>"
stringet keresné. Nem találja, ezért hibát dob.Megoldás
Van Combobox-nak egy ListIndex tulajdonsága, ami megmondja, hogy hányadik elemet választották. Nullától kezdődik a sorszámozása. Ha nem a listáról való a benne lévő aktuális tartalom, akkor pedig -1-et tartalmaz. na ezt kell figyelni a Change-ben.Private Sub ComboBox1_Change() If ComboBox1.ListIndex > -1 Then TextBox1.Value = WorksheetFunction.VLookup(Val(ComboBox1.Value), Sheets(1).Range("adatok"), 2, 0) TextBox2.Value = WorksheetFunction.VLookup(Val(ComboBox1.Value), Sheets(1).Range("adatok"), 3, 0) End If End Sub
Nézd meg, nálam működött.
Volt még kérdésed.
A Show metódus mielőtt megjeleníti az űrlapot, kiváltja az Initialize eseményt. ez gyárilag van így, pont azért, hogy a form egyes elemeinek tulajdonságait még a megjelenítés előtt, dinamikusan meg tudjuk határozni. Tehát a Show hívja meg az Initialize-t.Imre
- A hozzászólás módosításra került: 8 years, 11 months telt el-horvimi.
2015-12-23-13:44 #2437Hát nagyon nagyon hálás vagyok a válaszokért, most sok minden világos lett számomra. Nagyon szépen köszönöm! Ma este már tesztelni is fogom. Azt hiszem én is jövök már egy sörrel neked 😉
Kellemes karácsonyt és sok-sok pihenést kívánok!
Üdv:
Dékány András2016-01-05-13:19 #2452Szia Imre!
A segítséged kérném, ha időd engedi!
Megőrülök, mert nem találok sehol választ a kérdésemre, pedig biztos pofon egyszerű.
A lényeg: adott 3 db TextBox (TextBox1, TextBox2, TextBox3). A TextBox3 mező értéke a másik két box értékét kapja, valahogy így:TextBox3.Text = TextBox1.Text & TextBox2.Text
Remek! Ez még nekem is megy. Viszont, akad némi probléma. Nevezetesen az, hogy TextBox1 és TextBox2 értéke változik, egy adott,a kódomban szereplő eseményre, gondolom ebből következik, hogy TextBox3 értéke is változik. Ez is szuper és logikus. Ám én azt szeretném megoldani „valahogy” , hogy a TextBox3 első értéke is a boxban maradjon, majd amikor változik és új értéket kap, akkor az már egy új sorba kerüljön, és így tovább egészen addig, amíg egy, a kódomban lévő esemény (pl. commandbutton megnyomása) nem törli a TextBox3 tartalmát. (pl.UserForm1.TextBox3.Text = „”) A Texbox3.MultiLine = True értéken áll.
Előre is nagyon szépen köszönöm a válaszod!2016-01-05-22:41 #2453Szia András!
Minden új kérdés = Új fórum topic!
Köszi!
Imre
2016-01-06-02:52 #2454Rendben. Köszönöm! Közben a megoldàsra is ràjöttem.
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.