Moro,
Mikä olisi hyvä tapa hakea tiettyä lukuarvoa isosta joukosta lukuja. UserFormilla on Combobox1 johon valitaan nimi, ComboBox2 valitaan arvo, näiden perusteella labeliin haetaan lomakkeelta nimeä vastaava arvo. Lomakkeen sarake A= nimi ja sarake B= lukuarvo, rivejä on lomakkeella 1500.
En oikein ymmärrä mihin ongelmaan haet vastausta... Vai onko kysymys, kun Combobox2:een valitaan arvo ja sitten arvo laitetaan labeliin, niin "mihin ihmeeseen sitä 'lomaketta' oikein tarvitaan?" Eikö sen Combobox2:een valitun arvon vaan voisi laittaa suoraan labeliin?
Jos nyt kuitenkin ajatellaan, että tuossa kysymyksessä on joku aivopieru, ja tarkoitus on kysyä että miten tietuejoukosta voidaan hakea tietue, jonka 'sarake' A vastaa Combobox1:en arvoa ja näyttää ko. tietueen 'sarakkeen' B arvo Labelissa...
Dim arvo As arvot.Where(Function(a) a.A = Me.Combobox1.Value)).FirstOrDefault() If Not IsNothing(arvo) Then label.Text = arvo.B
Kyse on Excelin lomakkeesta ja VBA:sta, unohtui mainita. Exceliin on tehty UserForm johon haetaan tietoja lomakkeelta. Combobox1:n syötetään nimi (lomakkeelta) ja ComboBox2:n vastaava arvo kuin sarakkeissa A, C tai E (rivit 1...1500), labeliin haetaan arvo vastaavalta riviltä (samaan tapaan kuin Vlookup)
A --> B, C --> D, E --> F
Nimi 1
A B
Nimi 2
C D
Nimi 3
E F
Toivottavasti asia tuli hiukan selkeämmin esitetyksi
en kyllä itse käsitä vieläkään, mikset vaan näytä labelissa combobox2:n arvoa, jos siinä kerran on jo valittu arvo. eikö ylipäätään kannattaisi tehdä niin, että kun valitsee nimen combobox1:sessä, populoituu henkilön arvot combobox2:seen (vain kyseisen nimen arvot), joista sitten valittu näkyy labelissa.
Ja vielä kerran, UserFormilla on ComboBox1, ComboBox2, label1 ja CommandButton1.
Combo1:n pudotusvalikosta valitaan nimi1 tai nimi2 tai nimi3
ComboBox2:n pudotusvalikosta valitaan arvo väliltä 1......1500
Labeliin palautetaan sheetin NN (rivit 1....1500) Combo2 vastaava viereisen sarakkeen arvo, kun painetaan CommanButtonia
Esim.
ComboBox1= Nimi1 ComboBo2x= Sheets("NN").Range("A5").Value Label1 = B5
ComboBox1= Nimi2 ComboBo2x= Sheets("NN").Range("C1000").Value Label1 = D1000
jne.
Ei tämä vieläkään avannut minulle syytä tehdä mitään vlookuppeja. voit asettaa comboboxin .text arvoksi eri tiedon kuin .value arvoksi. näin ollen voit asettaa labeliin suoraan .value arvon valitusta combobox2 itemistä, kuitenkin niin että combobox2 teksti on alkuperäinen haluttu arvo.
Kokeillaan vielä yhtä esimerkkiä. Sheetin NN, A sarakkeessa (A1...A61) on esim. lämpötiloja -30 ....+30, sarakkeessa B (B1...B61) on esim. lukuarvoja 345, 543....999
Combo1:n valitaan pudotusvalikosta nimi (Nimi1 vastaa sheetin aluetta A1,B61, Nimi2 vastaa aluetta C1,D61, jne.)
Combo2:n valitaan pudotusvalikosta esim. arvo -15 ---> Labeliin haetaan B sarakkeesta lukuarvo (vastaa A sarakkeen -15 rivin lukuarvoa).
Toivottavasti tämä avasi asiaa, sheetillä on rivejä useampi sata ja sarakkeita kolmisenkymmentä. En ole keksinyt miten haluttu lukuarvo saadaan labeliin
No nyt tuosta sai sentään jo selvää mitä olit hakemassa.
Eli combobox1:llä valitaan mitkä sarakkeet on käytössä
Comboxbox2:lla valitaan rivi edellä valituista sarakkeista ja Labelissa näytetään valitun rivin toisen sarakkeen arvo.
Tein userformin, jossa on ComboBox1, ComboBox2 ja Label nimellä ValueLabel ja kaikki oletusasetuksilla paitsi ComboBox2:ssa BoundColumn=2
Sitten tällainen koodi
Option Explicit Private Sub ComboBox1_Change() Dim col As Long col = ComboBox1.ListIndex * 2 + 1 If (col < 1) Then Exit Sub With Worksheets("Taul1") ComboBox2.List = .Range(.Cells(2, col), .Cells(2, col + 1).End(xlDown)).Value End With ComboBox2.ListIndex = 0 End Sub Private Sub UserForm_Initialize() Dim s As Worksheet Dim nimi As String Dim col As Long Set s = Worksheets("Taul1") For col = 1 To 10000 Step 2 nimi = s.Cells(1, col).Value If nimi = "" Then Exit For ComboBox1.AddItem nimi Next If (col > 1) Then ComboBox1.ListIndex = 0 End Sub Private Sub ComboBox2_Change() ValueLabel.Caption = ComboBox2.Value End Sub
Tässä vielä linkki toimivaan esimerkkiin: http://grez.info/putka/jamro/Jamro_esimerkki.
Kiitos kärsivällisyydestä ja vastauksesta.
Tein Grez:n esimerkin mukaisesti taulukon johon syötin satunnaisia arvoja. Mikähän on syynä, että ComboBox2 (sarake A) arvo kopioituu myös labeliin vaikka siihen pitäisi hakea arvo B sarakkeesta. Muuten toimii juuri siten kuin oli tarkoitus.
Voisin olettaa että et laittanut Combobox2:n BoundColumnin arvoksi 2 vaan se olisi 1.
Kopion linkin esimerkin koodin uuteen työkirjaan ja lisäsin taulukkoon lukuarvoja, en ymmärrä minkä vuoksi A sarake kopioituu Labeliin B:n sijaan vaikka koodi on täsmälleen esimerkin kaltainen.
Voisin olettaa, että et laittanut Combobox2:n BoundColumnin arvoksi 2 vaan se olisi 1.
Oletuksenne piti paikkansa, BoundColumnin arvo oli väärä. Asia ei mennyt heti jakeluun.
Lisäys:
Miten saadaan vielä lisättyä kolmannen sarakkeen arvo, esim. Combobox1= Nimi (A1), Combobox2= lämpötila (A2...A20), Label1= arvo2 (B2...B20), Label2=arvo3 (C3...C20).
Viittaan kysymyksellä edelliseen esimerkkiin missä Combobox1:n valitaan nimi, Combobox2:n lämpötila, Label1:n haetaan sarakkeen B:n vastaava arvo. Lisäksi pitäisi hakea label2:n sarakkeen C:n vastaava arvo. Toivottavasti kuvauksesta selviää asia. (esim. sarakkeessa C on lukuarvot väliltä 500...520)
Kokeilin lisätä Gez:n koodiin vielä kolmannen sarakkeen mutta huonolla menestyksellä, olisin kiitollinen pienestä vinkistä miten pitäisi edetä. Olen käynyt katsomassa foorumeilta vinkkejä, mutta ainakaan vielä asia ei ole auennut.
En oikeasti tiedä Excelistä, mutta voisit varmaan kokeilla sitä, että laittaisit ComboBox2:een kolme saraketta (Range-kohdassa col+1:n sijaan col+2) ja arvon lukemisen yhteydessä vaihtaisit arvoa ComboBox2.BoundColumn niin, että ensin lukisit sarakkeesta 2 yhteen labeliin ja sitten sarakkeesta 3 toiseen labeliin.
Grezin vastausta odotellessa...
En mäkään tiedä Excelistä ja tuo Metabolixin ehdotus toimii erinomaisesti.
Eli edelliseen esimerkkiin rivin 8 muutos
ComboBox2.List = .Range(.Cells(2, col), .Cells(2, col + 2).End(xlDown)).Value ' ^^
Ja sitten tuonne rivin 25 tilalle:
ComboBox2.BoundColumn = 2 Label1.Caption = ComboBox2.Value ComboBox2.BoundColumn = 3 Label2.Caption = ComboBox2.Value
Muutin ComboBox2.BoundColumnit, mutta ohjelma meni jumiin eikä sulkeudu kuin pakottamalla. Tulin siihen johtopäätökseen että jumin aiheutti BoundColumnin asetukset, ei ilmeisesti tykkää kahdesta BoundColumn arvosta.
Metabolixin ja Grez:n vastausta odotellessa...
Joo niin näköjään toi boundcolumnin vaihtaminen laukaisee tuon ComboBoxin Change -eventin :o eli jää ikuiseen looppiin.
Ongelman voisi ratkaista tällaisella rumalla virityksellä:
Private Sub ComboBox2_Change() Static processing As Boolean If processing Then Exit Sub processing = True ComboBox2.BoundColumn = 2 Label1.Caption = ComboBox2.Value ComboBox2.BoundColumn = 3 Label2.Caption = ComboBox2.Value processing = False End Sub
Nyt haku pelittää kuten oli tarkoituskin, kiitos Grez:lle ja Metabolixelle avusta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.