Izpolnite kontrolnik ListBox z vrednostmi iz zaprtega delovnega zvezka z uporabo VBA v programu Microsoft Excel

Anonim

V tem članku bomo podatke iz zaprtega delovnega zvezka prenesli v polje Seznam v obliki uporabnika z uporabo VBA.

Neobdelani podatki za ta primer so v obsegu A2: B10 v delovnem zvezku »23SampleData.xls«, ki je postavljen v pot do datoteke »D: \ Excelforum \ ExcelForum office \ excel tip stara koda \ Shared Macro \ 23 \«.

Na glavnem delovnem listu smo ustvarili dva ukazna gumba za izvajanje dveh različnih uporabniških oblik. Vsak ukazni gumb je povezan z različnimi oblikami uporabnikov.

Logična razlaga

V tem primeru se za pridobivanje podatkov iz zaprtega delovnega zvezka uporabljata dva različna načina. To so:-

  1. Odprite zaprti delovni zvezek in pridobite podatke

  2. Uporaba povezave ADODB

Odprite zaprti delovni zvezek in pridobite podatke

Lastnost RowSource kontrolnika ListBox je mogoče nastaviti tako, da pridobiva podatke iz drugega delovnega zvezka, tako da lastnosti RowSource dodeli vrednost na naslednji način:

‘[Ime datoteke.xls] List1?! $ B $ 1: $ B $ 15

ListBox Control bo prikazal vrednosti le, če je odprt drugi delovni zvezek.

Tako bomo za pridobivanje podatkov iz zaprtega delovnega zvezka ustvarili makro za odpiranje drugega delovnega zvezka, ne da bi ga uporabnik opazil, in pridobivanje podatkov iz delovnega zvezka za dodajanje elementov v polje s seznamom in zapiranje delovnega zvezka.

S klikom na gumb »Izberi« se aktivira uporabniški obrazec »Uporabniški obrazec1«. Dogodek Initialize uporabniške oblike se uporablja za dodajanje elementov v polje s seznamom. Ta dogodek najprej odpre zaprt delovni zvezek in nato vrednost v razponu dodeli različici »ListItems«. Po dodelitvi vrednosti se delovni zvezek zapre in elementi se dodajo v polje s seznamom.

Seznam se uporablja za izbiro imena iz obstoječih vrednosti seznama. S pritiskom na gumb »OK« se prikaže izbrano ime.

Uporaba povezave ADODB

Podatkovni objekti ActiveX (ADO) so vmesnik na visoki ravni in enostaven za uporabo za povezavo OLE DB. To je programski vmesnik za dostop do podatkov v zbirki podatkov in njihovo upravljanje.

Za vzpostavitev povezave ADODB bomo morali projektu dodati knjižnico ADO.

Če želite dodati referenco, izberite v meniju Orodja> Referenca.

S klikom na gumb »ADODB Connection« na delovnem listu se aktivira uporabniška oblika »UFADODB«. V dogodku inicializacije te uporabniške oblike smo za pridobivanje podatkov iz zaprtega delovnega zvezka uporabili povezavo ADODB. Ustvarili smo prilagojeno uporabniško definirano funkcijo (ReadDataFromWorkbook), ki jo definira uporabnik (UDF), da vzpostavimo povezavo in podatke iz zaprtega delovnega zvezka prenesemo v matriko.

Za inicializacijo uporabniškega obrazca smo za dodajanje elementov v polje Seznam uporabili drugo "FillListBox" UDF. List Box bo prikazal podatke v dveh stolpcih, en stolpec vsebuje ime, drugi pa starost.

Če pritisnete gumb »V redu«, potem ko izberete element v polju Seznam, se prikaže informativno sporočilo o izbranem elementu.

Za kodo sledite spodaj

 Možnost Explicit Sub running () UserForm1.Show End Sub Sub ADODBrunning () UFADODB.Show End Sub 'Dodaj spodnjo kodo v uporabniški obliki UFADODB Možnost Explicit Private Sub CommandButton1_Click () Dim name1 As String Dim age1 As Integer Dim i As Integer' Dodelite izbrano vrednost v polju s seznamom na ime spremenljivke1 in starost1 Za i = 0 Za ListBox1.ListCount - 1 Če je ListBox1.Selected (i) Potem name1 = ListBox1.Value age1 = ListBox1.List (ListBox1.ListIndex, 1) Izhod za konec, če je naslednji ' Unload the userform Unload Me 'Prikaz izhoda MsgBox "Izbrali ste" & name1 & ". Njegova starost je" & age1 & "yrs." End Sub Private Sub UserForm_Initialize () 'Polnjenje ListBox1 s podatki iz zaprtega delovnega zvezka Dim tArray As Variant' Klicna funkcija ReadDataFromWorkbook za pridobivanje podatkov iz določenega obsega v matriko 'Spremenite pot glede na vaše zahteve, "Sample_data" je poimenovano določeno območje tArray = ReadDataFromWorkbook ("D: \ Excelforum \ ExcelForum office \ excel tip stara koda \ Makro v skupni rabi \ 23 \ 23SampleData.xls", "Sample_Data") 'Klicna funkcija FillListBox za dodajanje elementov v polje s seznamom' Dodeli objekt polja in polje kot parameter FillListBox Me .ListBox1, tArray 'Sprostitev spremenljivk matrike in sprostitev pomnilnika, uporabljenega za njihove elemente. Erase tArray End Sub Private Sub FillListBox (lb Kot MSForms.ListBox, RecordSetArray kot varianta) 'Polnjenje seznama lb s podatki iz RecordSetArray Dim r As Long, c As Long With lb .Clear' Dodelitev vrednosti seznamu za r = LBound (RecordSetArray , 2) V UBound (RecordSetArray, 2) .AddItem For c = LBound (RecordSetArray, 1) V UBound (RecordSetArray, 1) .List (r, c) = RecordSetArray (c, r) Naprej c Naprej r 'Izbira nobenega elementa privzeto v polju Seznam. ListIndex = -1 Končaj s končno podzasebno funkcijo ReadDataFromWorkbook (SourceFile As String, _ SourceRange As String) As Variant "zahteva sklic na knjižnico Microsoftovih podatkovnih objektov ActiveX" (meni Orodja> Reference v VBE ) Dim dbConnection Kot ADODB.Connection, rs Kot ADODB.Recordset Dim dbConnectionString As String 'Razglasitev niza povezave in gonilnika za vzpostavitev povezave dbConnectionString = "DRIVER = {Microsoft Excel Driver (*.xls)}; ReadOnly = 1; DBQ = "& SourceFile 'Ustvarjanje nove povezave ADODB Nastavite dbConnection = Nov ADODB.Connection On Error GoTo InvalidInput 'Odprite povezavo z bazo podatkov dbConnection.Open dbConnectionString' Geting the recordset from defined named range Set rs = dbConnection.Execute ("[" & SourceRange & "]") On Error GoTo 0 'Vrne dve dimenzionalna matrika z vsemi zapisi v rs ReadDataFromWorkbook = rs.GetRows 'Zaprite niz zapisov in povezavo z bazo podatkov rs.Zatvorite dbConnection.Close Set rs = Nič nastavite dbConnection = Nič Izhod Funkcija' Koda za obravnavo napake InvalidInput: MsgBox "Izvorna datoteka ali izvorni obseg je neveljaven! ", _ vbExclamation," Pridobite podatke iz zaprtega delovnega zvezka "Končaj funkcijo" Dodaj spodnjo kodo v UserForm1 Možnost Eksplicitno zasebno podrejeno CommandButton1_Click () Dim name1 As String Dim i As Integer 'Dodelite izbrano vrednost imenu spremenljivke1 Za i = 0 Na ListBox1.ListCount - 1 Če je ListBox1.Selected (i) Potem name1 = ListBox1.Vrednost Izhod za konec Če je naslednji 'Unload the userform Unload Me' Prikažite izbrano ime MsgBox "Izbrali ste" & name1 & ". End Sub Private Sub UserForm_Initialize () Dim ListItems As Variant, i As Integer Dim SourceWB As Workbook 'Izklop zaslona se posodobi Application.ScreenUpdating = False With Me.ListBox1' Odstranite obstoječe vnose iz seznama. Počisti 'Odprite izvorni delovni zvezek kot ReadOnly Set SourceWB = Delovni zvezki.Open ("D: \ Excelforum \ ExcelForum office \ excel tip stara koda \ Makro v skupni rabi \ 23 \ 23SampleData.xls", _ False, True) 'Pridobite želeni obseg vrednosti ListItems = SourceWB.Delovni listi (1 ) .Range ("A2: A10"). Vrednost 'Zaprite izvorni delovni zvezek, ne da bi shranili spremembe. Za i = 1 Za UBound (ListItems) 'Napolnite polje s seznamom. AddItem ListItems (i) Naprej i' Če privzeto ne izberete nobenega elementa, nastavite na 0 za izbiro prvega elementa. ListIndex = -1 End With End Sub 

Če vam je bil ta blog všeč, ga delite s prijatelji na Facebooku. Prav tako nam lahko sledite na Twitterju in Facebooku.

Radi bi slišali od vas, nam sporočite, kako lahko izboljšamo svoje delo in ga izboljšamo za vas. Pišite nam na spletnem mestu e -pošte