Попълнете контрола ListBox със стойности от затворена работна книга, използвайки VBA в Microsoft Excel

Anonim

В тази статия ще извлечем данни от затворена работна книга в полето със списък в потребителска форма, използвайки VBA.

Необработените данни за този пример са в диапазон A2: B10 в работната книга „23SampleData.xls“, който се поставя в път на файл „D: \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \“.

Създадохме два командни бутона в основния работен лист за изпълнение на две различни потребителски форми. Всеки команден бутон е свързан с различни потребителски форми.

Логично обяснение

В този пример се използват два различни начина за извличане на данни от затворената работна книга. Това са:-

  1. Отворете затворената работна книга и вземете данните

  2. Използване на ADODB връзка

Отворете затворената работна книга и вземете данните

Възможно е да зададете свойството RowSource на контрола ListBox за получаване на данни от друга работна книга, като присвоите стойност на свойството RowSource, както следва:

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

ListBox Control ще показва стойности само ако другата работна книга е отворена.

Така че, за да извлечем данните от затворена работна книга, ще създадем макрос за отваряне на другата работна книга, без потребителят да я забележи и извличане на данни от работната книга, за да добави елементи в полето със списък и да затвори работната книга.

Щракването върху бутона „Избор“ ще активира потребителската форма „UserForm1“. Събитието за инициализация на потребителската форма се използва за добавяне на елементи в полето със списък. Това събитие първо отваря затворената работна книга и след това присвоява стойността в диапазона на варианта „ListItems“. След присвояване на стойността, работната книга се затваря и елементите се добавят към списъчното поле.

Списъчното поле се използва за избор на име от съществуващите стойности на списъка. Натискането на бутона „OK“ ще покаже избраното име.

Използване на ADODB връзка

ActiveX Data Objects (ADO) е интерфейс на високо ниво, лесен за използване за OLE DB връзка. Това е интерфейс за програмиране за достъп и манипулиране на данни в база данни.

За да създадем ADODB връзка, ще трябва да добавим библиотеката ADO към проекта.

За да добавите препратка, изберете от менюто Инструменти> Справка.

Щракването върху бутона „ADODB Connection“ на работния лист ще активира потребителската форма „UFADODB“. В инициализиращото събитие на тази потребителска форма използвахме ADODB връзка за извличане на данни от затворената работна книга. Създадохме персонализирана потребителска функция (UDF) „ReadDataFromWorkbook“, за да установим връзката и да извлечем данните от затворената работна книга в масив.

Използвахме друг UDF „FillListBox“, за да добавим елементи в полето List по време на инициализация на потребителската форма. List Box ще показва данни в две колони, една колона съдържа името, а втората колона съдържа възрастта.

Натискането на бутона „OK“ след избор на елемент в полето Списък ще покаже информационното съобщение за избрания елемент.

Моля, следвайте кода по -долу

 Опция Explicit Sub running () UserForm1.Show End Sub Sub ADODBrunning () UFADODB.Show End Sub 'Добавете кода по -долу в потребителската форма на UFADODB Опция Explicit Private Sub CommandButton1_Click () Dim name1 As String Dim age1 As Integer Dim i As Integer' Задайте избраното стойност в списъчно поле към променлива име1 и възраст1 За i = 0 Към ListBox1.ListCount - 1 Ако ListBox1.Selected (i) Тогава name1 = ListBox1.Value age1 = ListBox1.List (ListBox1.ListIndex, 1) Изход за край, ако следващ ' Разтоварване на потребителската форма Unload Me 'Показване на изход MsgBox "Избрали сте" & name1 & ". Неговата възраст е" & age1 & "yrs." End Sub Private Sub UserForm_Initialize () 'Попълване на ListBox1 с данни от затворена работна книга Dim tArray As Variant' Функция за извикване ReadDataFromWorkbook за получаване на данни от определен диапазон в масив 'Промяна на пътя според вашите изисквания, "Sample_data" се нарича определен диапазон tArray = ReadDataFromWorkbook ("D: \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \ 23SampleData.xls", "Sample_Data") 'Функция за извикване FillListBox за добавяне на елементи в List Box' Присвояване на обект в полето List и тарелка като параметър FillListBox Me .ListBox1, tArray 'Освобождаване на променливи на масива и освобождаване на паметта, използвана за техните елементи. Erase tArray End Sub Private Sub FillListBox (lb As MSForms.ListBox, RecordSetArray As Variant) 'Попълване на списъчно поле lb с данни от RecordSetArray Dim r As Long, c As Long With lb .Clear , 2) Към UBound (RecordSetArray, 2) .AddItem За c = LBound (RecordSetArray, 1) Към UBound (RecordSetArray, 1). Списък (r, c) = RecordSetArray (c, r) Следващ c Следващ r 'Не избираме елемент в полето Списък по подразбиране. ListIndex = -1 Край с End Sub Частна функция ReadDataFromWorkbook (SourceFile As String, _ SourceRange As String) As Variant 'изисква препратка към библиотеката на Microsoft ActiveX Data Objects' (меню Инструменти> Препратки във VBE ) Dim dbConnection Като ADODB.Connection, rs Като ADODB.Recordset Dim dbConnectionString As String 'Деклариране на низ за връзка и драйверът изискват за установяване на връзка dbConnectionString = "DRIVER = {Microsoft Excel Driver (*.xls)}; ReadOnly = 1; DBQ = "& SourceFile 'Създаване на нова ADODB връзка Задайте dbConnection = Нов ADODB.Connection при грешка GoTo InvalidInput 'Отваряне на връзката към базата данни dbConnection.Open dbConnectionString' Получаване на набора от записи от дефиниран диапазон Set rs = dbConnection.Execute ("[" & SourceRange & "]") On Error GoTo 0 'Връща две размерни масиви с всички записи в rs ReadDataFromWorkbook = rs.GetRows 'Затворете набора от записи и връзката с базата данни rs.Close dbConnection.Close Set rs = Нищо не е зададено dbConnection = Нищо Изход Функция' Код за обработка на грешка InvalidInput: MsgBox "Изходният файл или изходният диапазон е невалиден! ", _ vbExclamation," Получаване на данни от затворена работна книга "Крайна функция" Добавете кода по -долу в UserForm1 Опция Изрично частно подкомандно CommandButton1_Click () Dim name1 As String Dim i As Integer 'Присвояване на избраната стойност на име на променлива1 За i = 0 Към ListBox1.ListCount - 1 Ако ListBox1.Selected (i) Тогава name1 = ListBox1.Value Изход за край, ако Следващ 'Unload the userform Unload Me' Показва избраното име MsgBox "Вие сте избрали" & name1 & "." End Sub Private Sub UserForm_Initialize () Dim ListItems As Variant, i As Integer Dim SourceWB As Workbook „Изключване на екрана се актуализира Application.ScreenUpdating = False With Me.ListBox1“ Премахване на съществуващите записи от списъка. Clear ”Отваряне на работната книга източник като ReadOnly Set SourceWB = Workbooks.Open ("D: \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \ 23SampleData.xls", _ False, True) 'Вземете диапазона от стойности, които искате ListItems = SourceWB.Worksheets (1 . For i = 1 To UBound (ListItems) 'Попълнете списъчната кутия. AddItem ListItems (i) Next i' Избирайки без елементи по подразбиране, задайте 0, за да изберете първия елемент. ListIndex = -1 End With End Sub 

Ако този блог ви е харесал, споделете го с приятелите си във Facebook. Също така можете да ни следвате в Twitter и Facebook.

Ще се радваме да чуем от вас, уведомете ни как можем да подобрим работата си и да я направим по -добра за вас. Пишете ни на имейл сайта