Telefonszámunk: 1-472-0679

UserForm

8 bejegyzés megtekintése - 1-8 / 8
  • Szerző
    Bejegyzés
  • #2424
    7even
    Felhasználó

      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 Sub

      Private Sub TextBox2_Change()
      End Sub

      Private 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 With

      With Me.TextBox2
      .Value = ComboBox1.Value
      End With
      End Sub

      • A témakör módosításra került: 8 years, 4 months telt el-7even.
      Attachments:
      You must be logged in to view attached files.
      #2427
      horvimi
      Adminisztrátor

        Szia!

        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

        #2428
        7even
        Felhasználó

          Szia!
          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.
          #2430
          horvimi
          Adminisztrátor

            Na, 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 a ré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, 4 months telt el-horvimi.
            #2437
            7even
            Felhasználó

              Há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ás

              #2452
              7even
              Felhasználó

                Szia 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!

                #2453
                horvimi
                Adminisztrátor

                  Szia András!

                  Minden új kérdés = Új fórum topic!

                  Köszi!

                  Imre

                  #2454
                  7even
                  Felhasználó

                    Rendben. Köszönöm! Közben a megoldàsra is ràjöttem.

                  8 bejegyzés megtekintése - 1-8 / 8
                  • Be kell jelentkezni a hozzászóláshoz.