Completați un control ListBox cu valori din registrul de lucru închis utilizând VBA în Microsoft Excel

Anonim

În acest articol, vom prelua date din registrul de lucru închis în caseta Listă în formularul de utilizator folosind VBA.

Datele brute pentru acest exemplu sunt în intervalul A2: B10 din registrul de lucru „23SampleData.xls”, care este plasat în calea fișierului „D: \ Excelforum \ ExcelForum office \ excel tip vechi cod \ Shared Macro \ 23 \”.

Am creat două butoane de comandă pe foaia de lucru principală pentru a rula două forme de utilizator diferite. Fiecare buton de comandă este legat de diferite forme de utilizator.

Explicație logică

În acest exemplu, sunt utilizate două moduri diferite de a prelua date din registrul de lucru închis. Acestea sunt:-

  1. Deschideți registrul de lucru închis și obțineți datele

  2. Utilizarea conexiunii ADODB

Deschideți registrul de lucru închis și obțineți datele

Este posibil să setați proprietatea RowSource a unui control ListBox pentru a obține date din alt registru de lucru atribuind valoare proprietății RowSource după cum urmează:

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

Controlul ListBox va afișa valori numai dacă celălalt registru de lucru este deschis.

Deci, pentru a prelua datele din registrul de lucru închis, vom crea o macro pentru a deschide celălalt registru de lucru fără ca utilizatorul să observe acest lucru și să preia date din registrul de lucru pentru a adăuga elemente în caseta de listă și pentru a închide registrul de lucru.

Dacă faceți clic pe butonul „Selectare” se va activa forma de utilizator „UserForm1”. Evenimentul de inițializare a formei de utilizator este utilizat pentru adăugarea articolelor în caseta de listă. Acest eveniment deschide mai întâi registrul de lucru închis și apoi atribuie valoarea din interval variantei „ListItems”. După atribuirea valorii, registrul de lucru este închis și elementele sunt adăugate în caseta de listă.

Caseta listă este utilizată pentru a selecta numele din valorile listei existente. Apăsând butonul „OK” se va afișa numele selectat.

Utilizarea conexiunii ADODB

ActiveX Data Objects (ADO) este o interfață la nivel înalt, ușor de utilizat, pentru conexiunea OLE DB. Este o interfață de programare pentru accesarea și manipularea datelor dintr-o bază de date.

Pentru a crea conexiunea ADODB, va trebui să adăugăm biblioteca ADO la proiect.

Pentru a adăuga referință, alegeți din meniul Instrumente> Referință.

Dacă faceți clic pe butonul „Conexiune ADODB” din foaia de lucru, se va activa forma de utilizator „UFADODB”. În cazul inițializării acestui formular de utilizator, am folosit conexiunea ADODB pentru a prelua date din registrul de lucru închis. Am creat o funcție personalizată definită de utilizator (UDF) „ReadDataFromWorkbook” pentru a stabili conexiunea și a prelua datele din registrul de lucru închis în matrice.

Am folosit un alt „FillListBox” UDF pentru a adăuga elemente în caseta Listă în timpul inițializării formei de utilizator. List Box va afișa date în două coloane, o coloană conține numele și a doua coloană conține vârsta.

Apăsând butonul „OK” după selectarea articolului în caseta Listă, se va afișa mesajul de informații despre elementul selectat.

Vă rugăm să urmați codul de mai jos

 Option Explicit Sub running () UserForm1.Show End Sub Sub ADODBrunning () UFADODB.Show End Sub 'Add below code in UFADODB userform Option Explicit Private Sub CommandButton1_Click () Dim name1 As String Dim age1 As Integer Dim i As Integer' Atribuie valoare în caseta listă a variabilelor name1 și age1 Pentru i = 0 To ListBox1.ListCount - 1 Dacă ListBox1.Selected (i) Atunci name1 = ListBox1.Value age1 = ListBox1.List (ListBox1.ListIndex, 1) Ieșiți pentru End Dacă Next ' Descărcați forma de utilizator Descărcați-mă 'Afișarea rezultatului MsgBox "Ați selectat" & nume1 & ". Vârsta lui este" & vârstă1 & "yrs." End Sub Private Sub UserForm_Initialize () 'Completarea ListBox1 cu date dintr-un registru de lucru închis Dim tArray As Variant' Funcția de apelare ReadDataFromWorkbook pentru obținerea datelor din intervalul specificat în matrice 'Schimbați calea în funcție de cerința dvs., "Sample_data" este denumit interval definit tArray = ReadDataFromWorkbook ("D: \ Excelforum \ ExcelForum office \ excel tip vechi cod \ Shared Macro \ 23 \ 23SampleData.xls", "Sample_Data") 'Funcție de apelare FillListBox pentru adăugarea de elemente în List Box' Atribuie obiect casetă List și tabel ca parametru FillListBox Me .ListBox1, tArray 'Eliberarea variabilelor matrice și repartizarea memoriei utilizate pentru elementele lor. Erase tArray End Sub Private Sub FillListBox (lb As MSForms.ListBox, RecordSetArray As Variant) 'Umplere casetă Listă lb cu date din RecordSetArray Dim r As Long, c As Long With lb .Clear' Atribuirea valorii listbox pentru 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 în caseta Listă în mod implicit. ListIndex = -1 Sfârșit cu funcția de sub-sfârșit privat ReadDataFromWorkbook (SourceFile As String, _ SourceRange As String) Ca Variant „necesită o referință la biblioteca Microsoft ActiveX Data Objects” (meniul Instrumente> Referințe în VBE ) Dim dbConnection As ADODB.Connection, rs As ADODB.Recordset Dim dbConnectionString As String 'Declararea unui șir de conexiune și driverul necesită pentru stabilirea conexiunii dbConnectionString = "DRIVER = {Microsoft Excel Driver (* .xls)}; ReadOnly = 1; DBQ Crearea unei noi conexiuni ADODB Setați dbConnection = Nou ADODB.Connection On Error GoTo InvalidInput 'Deschideți conexiunea bazei de date dbConnection.Open dbConnectionString' Obținerea setului de înregistrări din intervalul definit definit Set rs = dbConnection.Execute ("[" & SourceRange & "]") On Error GoTo 0 'Returnează două matrice dimensională cu toate înregistrările din rs ReadDataFromWorkbook = rs.GetRows 'Închideți setul de înregistrări și conexiunea bazei de date rs.Close dbConnection.Close Set rs = Nothing Set dbConnection = Nothing Exit Function' Code for handling error InvalidInput: MsgBox "Fișierul sursă sau intervalul sursă este nevalid! ", _ vbExclamation," Obțineți date din registrul de lucru închis "Funcția de sfârșit 'Adăugați codul de mai jos în UserForm1 Opțiune Explicit Private Sub CommandButton1_Click () Dim nume1 Ca șir Dim i Ca întreg' Atribuiți valoarea selectată variabilei nume1 Pentru i = 0 To ListBox1.ListCount - 1 If ListBox1.Selected (i) Then name1 = ListBox1.Value Exit For End If Next 'Unload the userform Unload Me' Afișează numele selectat MsgBox "Ai selectat" & name1 & "." End Sub Private Sub UserForm_Initialize () Dim ListItems As Variant, i As Integer Dim SourceWB As Workbook 'Dezactivarea actualizărilor ecranului Application.ScreenUpdating = False With Me.ListBox1' Ștergeți intrările existente din caseta de listă. SourceWB = Workbooks.Open ("D: \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \ 23SampleData.xls", _ False, True) 'Obțineți intervalul de valori pe care le doriți ListItems = SourceWB.Worksheets (1 ) .Range ("A2: A10"). Valoare 'Închideți registrul de lucru sursă fără a salva modificările SourceWB.Close False Set SourceWB = Nothing Application.ScreenUpdating = True' Convertiți valorile într-un tablou vertical ListItems = Application.WorksheetFunction.Transpose (ListItems) For i = 1 To UBound (ListItems) 'Populate the listbox .AddItem ListItems (i) Next i' Selecting no items by default, seted to 0 to select the first item .ListIndex = -1 End With End Sub 

Dacă ți-a plăcut acest blog, distribuie-l prietenilor tăi de pe Facebook. De asemenea, ne puteți urmări pe Twitter și Facebook.

Ne-ar plăcea să aflăm de la dvs., să ne anunțați cum putem îmbunătăți munca noastră și o putem îmbunătăți. Scrieți-ne pe site-ul de e-mail