Vyplňte ovládací prvek ListBox hodnotami z uzavřeného sešitu pomocí jazyka VBA v aplikaci Microsoft Excel

Anonim

V tomto článku načteme data z uzavřeného sešitu do seznamu v uživatelské formě pomocí VBA.

Nezpracovaná data pro tento příklad jsou v rozsahu A2: B10 v sešitu „23SampleData.xls“, který je umístěn v cestě souboru „D: \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \“.

Na hlavním listu jsme vytvořili dvě příkazová tlačítka pro spouštění dvou různých uživatelských formulářů. Každé příkazové tlačítko je propojeno s různými formami uživatele.

Logické vysvětlení

V tomto příkladu se používají dva různé způsoby načítání dat z uzavřeného sešitu. Tyto jsou:-

  1. Otevřete zavřený sešit a získejte data

  2. Použití připojení ADODB

Otevřete zavřený sešit a získejte data

Je možné nastavit vlastnost RowSource ovládacího prvku ListBox pro získávání dat z jiného sešitu přiřazením hodnoty vlastnosti RowSource následujícím způsobem:

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

ListBox Control zobrazí hodnoty, pouze pokud je otevřený druhý sešit.

Chcete -li tedy načíst data ze zavřeného sešitu, vytvoříme makro k otevření druhého sešitu, aniž by si toho uživatel všiml, a načítání dat ze sešitu pro přidání položek do seznamu a zavření sešitu.

Kliknutím na tlačítko „Vybrat“ aktivujete uživatelský formulář „UserForm1“. Událost Initialize uživatelského formuláře se používá pro přidávání položek do seznamu. Tato událost nejprve otevře zavřený sešit a poté přiřadí hodnotu v rozsahu variantě „ListItems“. Po přiřazení hodnoty sešit zavře a položky se přidají do seznamu.

Pole seznamu slouží k výběru názvu z existujících hodnot seznamu. Stisknutím tlačítka „OK“ se zobrazí vybrané jméno.

Použití připojení ADODB

ActiveX Data Objects (ADO) je snadno použitelné rozhraní na vysoké úrovni pro připojení OLE DB. Jedná se o programovací rozhraní pro přístup a manipulaci s daty v databázi.

Abychom mohli vytvořit připojení ADODB, budeme muset do projektu přidat knihovnu ADO.

Chcete -li přidat odkaz, zvolte v nabídce Nástroje> Reference.

Kliknutím na tlačítko „Připojení ADODB“ na listu aktivujete uživatelský formulář „UFADODB“. V případě inicializace tohoto uživatelského formuláře jsme použili připojení ADODB k načtení dat z uzavřeného sešitu. Vytvořili jsme vlastní uživatelem definovanou funkci (UDF) „ReadDataFromWorkbook“ pro navázání připojení a načtení dat z uzavřeného sešitu do pole.

Použili jsme další UDF „FillListBox“ k přidání položek do pole Seznam během inicializace uživatelské formy. Seznam zobrazí data ve dvou sloupcích, jeden sloupec obsahuje název a druhý sloupec věk.

Po stisknutí tlačítka „OK“ po výběru položky v seznamu se zobrazí informační zpráva o vybrané položce.

Pro kód prosím postupujte níže

 Možnost Explicit Sub běží () UserForm1.Show End Sub Sub ADODBrunning () UFADODB.Show End Sub 'Add below code in UFADODB userform Možnost Explicit Private Sub CommandButton1_Click () Dim name1 As String Dim age1 As Integer Dim i As Integer' Assign the selected hodnota v poli seznamu pro proměnnou 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 "You have selected" & name1 & ". Jeho věk 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šeho požadavku, "Sample_data" is named defined range tArray = ReadDataFromWorkbook ("D: \ Excelforum \ ExcelForum office \ excel tip starý kód \ Shared Macro \ 23 \ 23SampleData.xls", "Sample_Data") 'Funkce volání FillListBox pro přidání položek do seznamu' Přiřadit objekt seznamu a tarray jako parametr FillListBox Me .ListBox1, tArray 'Uvolnění proměnných pole a zrušení přidělení paměti použité pro jejich prvky. Vymazat 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' Assigning value to listbox For r = LBound (RecordSetArray , 2) To 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 ve výchozím nastavení v poli Seznam. ) 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 'Vytvoření nového připojení ADODB Nastavit dbConnection = Nový ADODB.Connection při chybě GoTo InvalidInput 'Otevřete připojení k databázi dbConnection.Open dbConnectionString' Získání sady záznamů z definovaného pojmenovaného rozsahu Set rs = dbConnection.Execute ("[" & SourceRange & "]") Při chybě GoTo 0 'Vrátí dvě dimenzionální pole se všemi záznamy v r ReadDataFromWorkbook = rs.GetRows 'Zavřít sadu záznamů a připojení k databázi rs.Close dbConnection.Close Set rs = Nothing Set dbConnection = Nothing Exit Function' Kód pro zpracování chyby InvalidInput: MsgBox "Zdrojový soubor nebo zdrojový rozsah je neplatný! ", _ vbExclamation," Získat data z uzavřeného sešitu "Koncová funkce 'Přidat níže kód do UserForm1 Volba Explicitní Private Sub CommandButton1_Click () Dim name1 As String Dim i As Integer' Přiřadit vybranou hodnotu proměnné name1 For i = 0 To ListBox1.ListCount - 1 If 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 = Workbooks.Open ("D: \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \ 23SampleData.xls", _ False, True) 'Získejte požadovaný rozsah hodnot ListItems = SourceWB.Worksheets (1 ) .Range ("A2: A10"). Hodnota 'Zavřít zdrojový sešit bez uložení změn SourceWB.Close False Set SourceWB = Nothing Application.ScreenUpdating = True' Převést hodnoty na svislé pole ListItems = Application.WorksheetFunction.Transpose (ListItems) Pro i = 1 na UBound (ListItems) 'Vyplňte seznam. AddDemtem ListItems (i) Další i' Ve výchozím nastavení nevybírejte žádné položky, pro výběr první položky nastavte na 0. ListIndex = -1 Konec s koncovým sub 

Pokud se vám tento blog líbil, sdílejte ho se svými přáteli na Facebooku. Také nás můžete sledovat na Twitteru a Facebooku.

Rádi bychom od vás slyšeli, dejte nám vědět, jak můžeme zlepšit naši práci a zlepšit ji pro vás. Napište nám na e -mail