Vyplňte ovládací prvok ListBox hodnotami z uzavretého zošita pomocou jazyka VBA v programe Microsoft Excel

Anonim

V tomto článku budeme načítať údaje z uzavretého zošita do poľa Zoznam v používateľskej forme pomocou VBA.

Surové údaje pre tento príklad sú v rozsahu A2: B10 v zošite „23SampleData.xls“, ktorý je umiestnený v ceste k súboru „D: \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \“.

Na hlavnom hárku sme vytvorili dve príkazové tlačidlá na spustenie dvoch rôznych užívateľských foriem. Každé príkazové tlačidlo je prepojené s rôznymi užívateľskými formami.

Logické vysvetlenie

V tomto prípade sa na načítanie údajov z uzavretého zošita používajú dva rôzne spôsoby. Toto sú:-

  1. Otvorte zatvorený zošit a získajte údaje

  2. Použitie pripojenia ADODB

Otvorte zatvorený zošit a získajte údaje

Je možné nastaviť vlastnosť RowSource ovládacieho prvku ListBox na získavanie údajov z iného zošita priradením hodnoty k vlastnosti RowSource nasledovne:

„[Filename.xls] Sheet1?! $ B $ 1: $ B $ 15

ListBox Control zobrazí hodnoty iba vtedy, ak je otvorený druhý zošit.

Aby sme teda mohli načítať údaje z uzavretého zošita, vytvoríme makro na otvorenie druhého zošita bez toho, aby si to užívateľ všimol a načítaním údajov zo zošita pridal položky do poľa so zoznamom a zatvoril zošit.

Kliknutím na tlačidlo „Vybrať“ aktivujete užívateľský formulár „UserForm1“. Udalosť inicializácie užívateľského formulára sa používa na pridávanie položiek do poľa so zoznamom. Táto udalosť najskôr otvorí zatvorený zošit a potom priradí hodnotu v rozsahu variantu „ListItems“. Po priradení hodnoty sa zošit zatvorí a položky sa pridajú do poľa so zoznamom.

Pole so zoznamom sa používa na výber názvu z existujúcich hodnôt zoznamu. Po kliknutí na tlačidlo „OK“ sa zobrazí zvolené meno.

Použitie pripojenia ADODB

ActiveX Data Objects (ADO) je vysokoúrovňové a ľahko použiteľné rozhranie na pripojenie OLE DB. Je to programovacie rozhranie na prístup k údajom v databáze a manipuláciu s nimi.

Aby sme mohli vytvoriť pripojenie ADODB, budeme musieť do projektu pridať knižnicu ADO.

Ak chcete pridať referenciu, vyberte položku z ponuky Nástroje> Referencia.

Kliknutím na tlačidlo „Pripojenie ADODB“ v pracovnom hárku aktivujete používateľský formulár „UFADODB“. V prípade inicializácie tohto užívateľského formulára sme použili pripojenie ADODB na načítanie údajov z uzavretého zošita. Vytvorili sme vlastnú užívateľsky definovanú funkciu (UDF) „ReadDataFromWorkbook“ na vytvorenie pripojenia a načítanie údajov z uzavretého zošita do poľa.

Na pridanie položiek do poľa Zoznam počas inicializácie užívateľskej formy sme použili ďalší UDF „FillListBox“. V zozname sa zobrazia údaje v dvoch stĺpcoch, v jednom stĺpci sa nachádza názov a v druhom stĺpci sa uvádza vek.

Po stlačení tlačidla „OK“ po výbere položky v poli so zoznamom sa zobrazí informačná správa o vybranej položke.

Pri kódovaní postupujte podľa nižšie uvedených pokynov

 Voľba Explicitné spustenie () UserForm1.Show End Sub Sub ADODBrunning () UFADODB.Show End Sub 'Add below code in UFADODB userform Možnosť Explicit Private Sub CommandButton1_Click () Dim name1 As String Dim age1 As Integer Dim i As Integer' Assign the selected hodnota v poli so zoznamom pre premennú name1 a age1 For i = 0 To ListBox1.ListCount - 1 If ListBox1.Selected (i) Then name1 = ListBox1.Value age1 = ListBox1.List (ListBox1.ListIndex, 1) Exit For End If Next ' Unload the userform Unload Me 'Displaying output MsgBox "Vybrali ste" & name1 & ". Jeho vek je" & age1 & "yrs." End Sub Private Sub UserForm_Initialize () 'Filling ListBox1 with data from a closed workbook Dim tArray As Variant' Calling function ReadDataFromWorkbook for getting data from specified range to array 'Change path Podľa vašej požiadavky, „Sample_data“ is named defined range tArray = ReadDataFromWorkbook ("D: \ Excelforum \ ExcelForum office \ excel tip starý kód \ Shared Macro \ 23 \ 23SampleData.xls", "Sample_Data") 'Funkcia volania FillListBox na pridávanie položiek do zoznamu' Priradiť objekt poľa a tarray ako parameter FillListBox Me .ListBox1, tArray 'Uvoľnenie premenných poľa a uvoľnenie pamäte použitej pre ich prvky. Vymazať SubArray 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' Assigning value to listbox For r = LBound (RecordSetArray , 2) Do UBound (RecordSetArray, 2) .AddItem For c = LBound (RecordSetArray, 1) To UBound (RecordSetArray, 1). List (r, c) = RecordSetArray (c, r) Next c Next r 'Selecting no item v predvolenom nastavení v poli Zoznam. ) Dim dbConnection As ADODB.Connection, rs As ADODB.Recordset Dim dbConnectionString As String 'Declaring a connection string and the driver require for creating connection dbConnectionString = "DRIVER = {Microsoft Excel Driver (*.xls)}; ReadOnly = 1; DBQ = "& SourceFile 'Vytvorenie nového pripojenia ADODB Nastaviť dbConnection = Nový ADODB.Connection pri chybe GoTo InvalidInput 'Otvorte databázové pripojenie dbConnection.Open dbConnectionString' Získanie sady záznamov z definovaného pomenovaného rozsahu Set rs = dbConnection.Execute ("[" & SourceRange & "]") Pri chybe GoTo 0 'Vráti dve dimenzionálne pole so všetkými záznamami v rs ReadDataFromWorkbook = rs.GetRows 'Zatvorte sadu záznamov a pripojenie k databáze rs.Close dbConnection.Close Set rs = Nothing Set dbConnection = Nothing Exit Function' Kód pre spracovanie chyby InvalidInput: MsgBox "Zdrojový súbor alebo zdrojový rozsah je neplatný! ", _ vbExclamation," Získať údaje z uzavretého zošita "Ukončiť funkciu 'Pridať nižšie uvedený kód do UserForm1 Voľba Explicitný Private Sub CommandButton1_Click () Dim name1 As String Dim i As Integer' Priradiť zvolenú hodnotu premennej name1 For i = 0 Do ListBox1.ListCount - 1 Ak ListBox1.Selected (i) Then name1 = ListBox1.Value Exit For End If Next 'Unload the userform Unload Me' Display the selected name MsgBox "You have selected" & name1 & "." End Sub Private Sub UserForm_Initialize () Dim ListItems As Variant, i As Integer Dim SourceWB As Workbook 'Turning screen updates off Application.ScreenUpdating = False With Me.ListBox1' Remove existing entries from the listbox .Clear 'Open the source workbook as ReadOnly Set SourceWB = zošity. Otvorené ("D: \ Excelforum \ ExcelForum office \ excel tip starý kód \ Shared Macro \ 23 \ 23SampleData.xls", _ False, True) 'Získajte požadovaný rozsah hodnôt ListItems = SourceWB.Worksheets (1 ) .Range ("A2: A10"). Hodnota 'Zatvoriť zdrojový zošit bez uloženia zmien SourceWB.Close False Set SourceWB = Nothing Application.ScreenUpdating = True' Previesť hodnoty na zvislé pole ListItems = Application.WorksheetFunction.Transpose (ListItems) Pre i = 1 na UBound (ListItems) 'Naplňte zoznam. AddDemtem ListItems (i) Ďalej i' Predvolene nevyberáte žiadne položky, prvou položkou vyberiete 0. ZoznamIndex = -1 Koniec s koncovým sub 

Ak sa vám tento blog páčil, zdieľajte ho so svojimi priateľmi na Facebooku. Môžete nás tiež sledovať na Twitteri a Facebooku.

Budeme radi, ak sa nám ozvete, dajte nám vedieť, ako môžeme zlepšiť našu prácu a zlepšiť ju pre vás. Napíšte nám na emailovú stránku