Vlookup

Status
Niet open voor verdere reacties.

Spiesse

Gebruiker
Lid geworden
14 jul 2011
Berichten
902
Heren, dames,

ik heb er geen flauw idee van, maar hoe je zoek je gegevens op in een visual basic form adhv een textvak en vlookup?

Moeten de gegevens in een database staan? Kunnen deze gegevens in een exceltabel staan?

Ik ben bekend met vba, maar vb is nieuw voor me...

Groeten,

Spiesse
 
Moet je wel aangeven hoe en wat natuurlijk. Zolang de informatie in een "collectie" zit kun je de informatie vinden. De collectie kan eigenlijk alles zijn wat je boven al aangeeft + platte lijstjes, gelinkte lijstjes, dictionaries, lists, arrays, datasets, etc.

Opzoeken kan ook via verschillende methodologieën in VB: LINQ, iterators, direct data traversal en eventueel ingebouwde methoden in je collection.

Anders dan in Excel hoeft data niet in een strak jasje en ook niet compatibel te blijven met concepten uit excel. Omdat ik niet weet wat je wil maken en welke concepten je op vast loopt is het moeilijk specifieker te zijn. ik zou gezien je vraagstelling iig ook jezelf inlezen in LINQ
 
Hey wampier,

dank voor je antwoord.

Hoe maak ik een collectie aan? Deze bestaat in principe uit 2 kolommen (1 met een wnnr, de andere met de naam).
Via een label wordt uit een barcode het wnnr gehaald. Van daaruit wil ik ook de naam opzoeken uit de collectie die je aangaf...
 
als de kolommen zoiets zijn als:

wnnr = "beschrijving"

en slechts 2 kun je misschien het het beste een dictionary gebruiken met als "key" je wnnr. keys moeten echter wel uniek zijn.
 
Goedemorgen Wampier,

in bijlage het excelbestand waar ik de gegevens in een tabel staan heb. Het ander bestand is de visual basic form met al enige code.

Wat me via youtube al gelukt is, is dat ik via de form de barcode kan inscannen (code is bv 001662SOEP). In een label verschijnt het wnnr (001662) en in een andere label verschijnt SOEP (kan ook MAALTIJD of MEENEEM zijn, afhankelijk van de barcode). Afhankelijk van de tweede label verschijnt een fotootje. (kan zijn dat dit niet lukt doordat de fotootjes in een aparte map zitten).

Nu zou ik op de één of andere manier "willen" dat de naam opgezocht wordt via de form in mijn exceltabel...

Ik zoek vandaag nog eens naar de dictionary waar je van spreekt.

Bekijk bijlage Agen.xlsBekijk bijlage DemoConnectToExcel.zip
 

Bijlagen

Je kunt ook je excel file benaderen als een database, zolang je weet wat hoe en waar de tabel staat die je wil raadplegen.

Een vbproj file bevat geen code, dus is niet nuttig om te hebben ;). Je moet echt besluiten of je eigenlijk excel wilt met een klein VB front-end, of een VB applicatie, met een kleine excel database. Anders loop je geheid een keer vast in je ontwerp
 
Ah oei, welk bestandje heb je dan nodig uit het VB-project?

Ik zou wel eens durven gaan voor een VB applicatie met een kleine excel database.

VBA lukt me redelijk, maar wil nu voor dit programmatje eens de VB proberen :)
 
VBA is eigenlijk VB6, uit 1999. Er zijn dus veel dingen hetzelfde qua taal-opzet, maar 16 jaar innovatie in dingen zoals 64-bit computers, multi-core computers, templates, standaard processen, nieuwe abstractielagen, etc etc. zijn allemaal voorbij gegaan ondertussen
 
ik gebruik vooral VBA vanuit excel zelf, maar wil nu eens proberen standalone te gaan met VB. En dus vanuit VB naar excel schrijven en opzoeken.

Het wegschrijven lukt me dus al, maar niet het opzoeken van de corresponderende naam bij het wnnr...
 
Deze code heb ik reeds in mijn VB-project staan (gevonden via youtube trouwens) :)

dus op zich kan ik in het bestand zaken wegschrijven op sheet 1 zonder dat excel hiervoor open hoeft te staan.

het enige wat me nog ontbreekt is het opzoeken van de naam die bij een wnnr staat...

kan het bv dat als ik op een button klik, het bestand geopend wordt en dat er dan gezocht wordt naar een overeenkomst tussen wnnr en naam?
 
Door de juiste SQL statement te gebruiken:

[SQL]
SELECT * FROM [Sheet1$a1:g500] WHERE 'wnnr' = '123'
[/SQL]

Vervolgens krijg je een dataset met de gegevens. wil je alleen de naam kun je het specifieker maken:

[SQL]
SELECT 'naam' FROM [Sheet1$a1:g500] WHERE 'wnnr' = '123'
[/SQL]

je krijgt dan een dataset met 1 kolom (en waarschijnlijk 1 rij). Is de dataset leeg is het nummer niet gevonden.
 
dit is al een begin :) maar waar begin ik met het begin? :)

waar zet ik deze lijntjes? achter een button of?
 
Code:
Dim xlApp As New Excel.Application
        Dim xlWb As Excel.Workbook
        Dim xlsheet As Excel.Worksheet
        Dim lRow As Long = 0

        With xlApp
            .Visible = True

            '~~> Open workbook
            xlWb = .Workbooks.Open("\\dmvl\Receptie\excellijsten david\Agen.xls")

            '~~> Set it to the relevant sheet
            xlsheet = xlWb.Sheets("Lijst WN")

            With xlsheet
                lRow = .Range("A" & .Rows.Count).End(Excel.XlDirection.xlUp).Row
            End With

            MessageBox.Show("The last row in Col A of Sheet1 which has data is " & lRow)

            '~~> Close workbook and quit Excel
            xlWb.Close(False)
            xlApp.Quit()

            '~~> Clean Up
            releaseObject(xlsheet)
            releaseObject(xlWb)
            releaseObject(xlApp)

        End With

Wampier,

deze code laat me weten op welke rij de laatste gegevens staan op het tabblad "Lijst WN"

hoe zou ik de code kunnen aanpassen zodat hij lblWNNR.text zoekt in de rij A?
 
Code:
        Dim cn As New OleDbConnection
        Dim cm As New OleDbCommand
        Dim objDR As OleDbDataReader
        cn.ConnectionString = "provider=microsoft.jet.oledb.4.0;data source =y:\dl\Agen.xlsx;extended properties=excel 8.0;"
        cn.Open()

        cm.Connection = cn
        cm.CommandType = CommandType.Text
        cm.CommandText = "SELECT NAAM FROM [Lijst WN$] WHERE NR=" & "1"
        objDR = cm.ExecuteReader()
        If objDR.HasRows Then
            While objDR.Read()
                ListBox1.Items.Add(objDR.GetValue(0))
            End While
        Else
            ListBox1.Items.Add("nr niet gevonden")
        End If
        objDR.Close()
        cn.Close()

het stukje waar " & 1" staat vervangen door "& lblWNNR.text. Ik gebruik hier een listbox, maar je kunt met de gevens doen wat je wil

PS, zolang je dus een aaneengesloten tabel hebt hoef je begin en eind niet te waten om de data te gebruiken
 
Laatst bewerkt:
merci wampier,

ik heb nu onderstaande code onder een button geplaatst

Code:
Dim cn As New OleDbConnection
        Dim cm As New OleDbCommand
        Dim objDR As OleDbDataReader
        cn.ConnectionString = "provider=microsoft.jet.oledb.4.0;data source =\\DMVL\Receptie\excellijsten david\Agen.xls;extended properties=excel 8.0;"
        cn.Open()

        cm.Connection = cn
        cm.CommandType = CommandType.Text
        cm.CommandText = "SELECT NAAM FROM [Lijst WN$] WHERE NR= " & "lblWNNR.text"
        objDR = cm.ExecuteReader()
        If objDR.HasRows Then
            While objDR.Read()
                ListBox1.Items.Add(objDR.GetValue(0))
            End While
        Else
            ListBox1.Items.Add("nr niet gevonden")
        End If
        objDR.Close()
        cn.Close()
    End Sub

ik krijg echter een foutmelding bij objDR=cm.executeReader()...
 
ondertussen heb ik ook een code gevonden die in tabblad Lijst WN een waarde vindt en vervangt...
Hoe zou ik deze moeten aanpassen zodat hij enkel de waarde vindt en niet vervangt maar wel de waarde rechts van de gevonden waarde geeft?

Code:
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        xlWorkBook = xlApp.Workbooks.Open("\\DMVL\Receptie\excellijsten david\Agen.xls")

        '~~> Replace Sheet1 below by the relevant sheet where you want to do a replace
        xlWorkSheet = xlWorkBook.Sheets("Lijst WN")

        '~~> Display Excel
        xlApp.Visible = True

        ToFind = LblWnnr.Text
        ToReplace = "succes"
        ReplaceInValuesAndFormulas()
        '~~> Save the file 
        xlWorkBook.Save()

        '~~> Close the File
        xlWorkBook.Close()

        '~~> Quit the Excel Application
        xlApp.Quit()

        '~~> Clean Up
        releaseObject(xlApp)
        releaseObject(xlWorkBook)
    End Sub
    '~~> Sub to replace in values/formulas
    Sub ReplaceInValuesAndFormulas()
        '~~> Note: If the text is not found then Excel will display a popup box 
        'xlWorkSheet.Cells.Replace(ToFind, ToReplace, 2, 1, False, False, False)
        xlWorkSheet.Cells.Replace(ToFind, ToReplace, 2, 1, False, False, False)
        MsgBox("vervangen", MsgBoxStyle.Information, Text)

    End Sub
    '~~> Release the objects
    Private Sub releaseObject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub
 
Wat is de error dan? die tweede oplossing is excel doen in excel via een front-end. Je had net aangegeven dat je dat niet wilde.
 
Goedemorgen opnieuw,

de fout melding zat bij de ExecuteReader...

Wat bedoel je met een front-end? Deze term is me onbekend :)
 
Als je in VB wil ontwikkelen zul je toch wat meer in fouten moeten duiken. Foutmeldingen zijn vaak uitgebreid met goede hints over waar het probleem is. De originele code is 100% werkend, dus ik verwacht wel iets dat op te lossen is.

Een front-end is de "visuele kant" of "aansturing" van een programma (of groep programma's). Een pure front-end is een programma dat niets toevoegt aan het origineel, behalve dat het er visueel anders uitziet.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan