Fyld en ListBox -kontrol med værdier fra lukket projektmappe ved hjælp af VBA i Microsoft Excel

Anonim

I denne artikel vil vi hente data fra lukket projektmappe til listeboks i brugerform ved hjælp af VBA.

Rådata for dette eksempel er i område A2: B10 på "23SampleData.xls" projektmappe, som er placeret i filstien "D: \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \".

Vi har oprettet to kommandoknapper på hovedarket til at køre to forskellige brugerformer. Hver kommandoknap er knyttet til forskellige brugerformer.

Logisk forklaring

I dette eksempel bruges to forskellige måder til at hente data fra den lukkede projektmappe. Disse er:-

  1. Åbn den lukkede projektmappe og hent dataene

  2. Brug af ADODB -forbindelse

Åbn den lukkede projektmappe og hent dataene

Det er muligt at indstille RowSource -egenskaben for en ListBox -kontrol til at hente data fra anden projektmappe ved at tildele værdi til RowSource -ejendommen som følger:

‘[Filnavn.xls] Ark1?! $ B $ 1: $ B $ 15

ListBox Control viser kun værdier, hvis den anden projektmappe er åben.

Så for at hente dataene fra lukket projektmappe, vil vi oprette en makro til at åbne den anden projektmappe, uden at brugeren bemærker det og henter data fra projektmappen for at tilføje elementer i listeboksen og lukke projektmappen.

Hvis du klikker på knappen "Vælg", aktiveres brugerformen "UserForm1". Initialiser hændelse for brugerformularen bruges til at tilføje elementer i listeboksen. Denne begivenhed åbner først den lukkede projektmappe og tildeler derefter værdien i området til varianten "ListItems". Efter tildeling af værdien lukkes projektmappen, og elementer tilføjes til listeboksen.

Listeboks bruges til at vælge navn fra de eksisterende listeværdier. Ved at trykke på knappen "OK" vises det valgte navn.

Brug af ADODB -forbindelse

ActiveX Data Objects (ADO) er en brugervenlig grænseflade på højt niveau til OLE DB-forbindelse. Det er en programmeringsgrænseflade til at få adgang til og manipulere data i en database.

For at oprette ADODB -forbindelse skal vi tilføje ADO -biblioteket til projektet.

For at tilføje reference skal du vælge i menuen Værktøjer> Reference.

Hvis du klikker på knappen "ADODB Connection" på regnearket, aktiveres brugerformen "UFADODB". I initialiseringshændelsen for denne brugerform har vi brugt ADODB -forbindelse til at hente data fra den lukkede projektmappe. Vi har oprettet en brugerdefineret brugerdefineret funktion (UDF) "ReadDataFromWorkbook" for at etablere forbindelsen og hente data fra den lukkede projektmappe til array.

Vi har brugt en anden UDF "FillListBox" til at tilføje emner i listeboksen under initialisering af brugerformularen. Listeboks viser data i to kolonner, en kolonne indeholder navnet og anden kolonne indeholder alderen.

Hvis du trykker på "OK" -knappen efter at have valgt elementet i feltet Liste, vises informationsmeddelelsen om det valgte element.

Følg venligst nedenstående for koden

 Option Eksplicit sub kører () UserForm1.Show End Sub Sub ADODBrunning () UFADODB.Show End Sub 'Tilføj nedenfor kode i UFADODB brugerform Option Explicit Private Sub CommandButton1_Click () Dim name1 As String Dim age1 As Integer Dim i As Integer' Tildel det valgte værdi i listeboks til variabelnavn1 og alder1 For i = 0 Til ListBox1.ListCount - 1 Hvis ListBox1.Selected (i) Så navn1 = ListBox1.Value age1 = ListBox1.List (ListBox1.ListIndex, 1) Afslut til slut hvis næste ' Unload userform Unload Me 'Viser output MsgBox "Du har valgt" & navn1 & ". Hans alder er" & age1 & "yrs." End Sub Private Sub UserForm_Initialize () 'Filling ListBox1 with data from a closed workbook Dim tArray As Variant' Opkaldsfunktion ReadDataFromWorkbook for at hente data fra specificeret område til array 'Skift sti i henhold til dit krav, "Sample_data" hedder defineret område tArray = ReadDataFromWorkbook ("D: \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \ 23SampleData.xls", "Sample_Data") 'Opkaldsfunktion FillListBox til tilføjelse af elementer i Listeboks' Tildel listeboksobjekt og tarray som parameter FillListBox Me .ListBox1, tArray 'Frigivelse af array -variabler og fordel lokalisering af den hukommelse, der bruges til deres elementer. Slet tArray End Sub Private Sub FillListBox (lb As MSForms.ListBox, RecordSetArray As Variant) 'Filling List box lb with data from RecordSetArray Dim r As Long, c As Long With lb .Clear' Tildel værdi til listbox For r = LBound (RecordSetArray , 2) Til UBound (RecordSetArray, 2) .AddItem For c = LBound (RecordSetArray, 1) Til UBound (RecordSetArray, 1) .Liste (r, c) = RecordSetArray (c, r) Næste c Næste r 'Vælg intet element i listen Liste som standard .ListIndex = -1 Slut med slut Sub Privat funktion ReadDataFromWorkbook (SourceFile As String, _ SourceRange As String) As Variant 'kræver en reference til biblioteket Microsoft ActiveX Data Objects' (menuværktøjer> Referencer i VBE ) Dim dbConnection As ADODB.Connection, rs As ADODB.Recordset Dim dbConnectionString As String 'Deklarerer en forbindelsesstreng og driveren kræver for at oprette forbindelse dbConnectionString = "DRIVER = {Microsoft Excel Driver (*.xls)}; ReadOnly = 1; DBQ = "& SourceFile 'Oprettelse af en ny ADODB -forbindelse Sæt dbConnection = Ny ADODB.Connection On Error GoTo InvalidInput 'Åbn databaseforbindelsen dbConnection.Open dbConnectionString' Henter rekordsættet fra defineret navngivet område Set rs = dbConnection.Execute ("[" & SourceRange & "]") On Error GoTo 0 'Returnerer to dimensionel array med alle poster i rs ReadDataFromWorkbook = rs.GetRows 'Luk rekordsættet og databaseforbindelsen rs.Close dbConnection.Close Set rs = Nothing Set dbConnection = Intet Afslut funktion' Kode til håndteringsfejl InvalidInput: MsgBox "Kildefilen eller kildeområdet er ugyldig! ", _ vbExclamation," Hent data fra lukket projektmappe "Afslut funktion 'Tilføj nedenstående kode i UserForm1 Option Explicit Private Sub CommandButton1_Click () Dim name1 As String Dim i As Integer' Tildel den valgte værdi til variabelnavn1 For i = 0 Til ListBox1.ListCount - 1 Hvis ListBox1.Selected (i) Then name1 = ListBox1.Value Exit For End If Next 'Unload the userform Unload Me' Vis det valgte navn MsgBox "Du har valgt" & navn1 & "." End Sub Private Sub UserForm_Initialize () Dim ListItems As Variant, i As Integer Dim SourceWB As Workbook 'Slå skærmopdateringer fra Application.ScreenUpdating = False With Me.ListBox1' Fjern eksisterende poster fra listeboksen. Ryd 'Åbn kildearbejdsbogen som ReadOnly Set SourceWB = Workbooks.Open ("D: \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \ 23SampleData.xls", _ False, True) 'Hent det område af værdier, du vil have ListItems = SourceWB.Worksheets (1 ) .Range ("A2: A10"). Værdi 'Luk kildearbejdsbogen uden at gemme ændringer SourceWB.Close False Set SourceWB = Intet Application.ScreenUpdating = True' Konverter værdier til et lodret array ListItems = Application.WorksheetFunction.Transpose (ListItems) For i = 1 Til UBound (ListItems) 'Populer listeboksen .AddItem ListItems (i) Næste i' Vælg ingen elementer som standard, indstil til 0 for at vælge det første element .ListIndex = -1 End With End Sub 

Hvis du kunne lide denne blog, kan du dele den med dine venner på Facebook. Du kan også følge os på Twitter og Facebook.

Vi vil meget gerne høre fra dig, lad os vide, hvordan vi kan forbedre vores arbejde og gøre det bedre for dig. Skriv til os på e -mail -stedet