Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Lukuarvon haku isosta joukosta

Sivun loppuun

Jamro [22.11.2017 18:58:10]

#

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.

Grez [22.11.2017 20:48:00]

#

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

Jamro [22.11.2017 21:41:34]

#

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

groovyb [25.11.2017 10:04:51]

#

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.

Jamro [26.11.2017 17:42:02]

#

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.

groovyb [27.11.2017 10:10:21]

#

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.

Jamro [27.11.2017 19:06:41]

#

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

Grez [28.11.2017 22:08:04]

#

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.xlsm

Jamro [29.11.2017 10:02:52]

#

Kiitos kärsivällisyydestä ja vastauksesta.

Jamro [02.12.2017 22:31:26]

#

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.

Grez [03.12.2017 07:03:40]

#

Voisin olettaa että et laittanut Combobox2:n BoundColumnin arvoksi 2 vaan se olisi 1.

Jamro [03.12.2017 19:00:04]

#

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.

pr0l3 [03.12.2017 19:14:58]

#

Voisin olettaa, että et laittanut Combobox2:n BoundColumnin arvoksi 2 vaan se olisi 1.

Jamro [04.12.2017 21:17:31]

#

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)

Jamro [06.12.2017 22:10:05]

#

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.

Metabolix [06.12.2017 22:31:39]

#

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...

Grez [07.12.2017 10:49:29]

#

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

Jamro [07.12.2017 19:56:52]

#

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...

Grez [08.12.2017 11:07:31]

#

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

Jamro [08.12.2017 19:47:17]

#

Nyt haku pelittää kuten oli tarkoituskin, kiitos Grez:lle ja Metabolixelle avusta.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta