В этой статье мы извлечем данные из закрытой книги в список в пользовательской форме с помощью VBA.

Исходные данные для этого примера находятся в диапазоне A2: B10 в книге «23SampleData.xls», которая помещается в путь к файлу «D: \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \».

ArrowSampleData

Мы создали две командные кнопки на основном рабочем листе для запуска двух разных пользовательских форм. Каждая командная кнопка связана с разными пользовательскими формами.

ArrowMainSheet

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

В этом примере используются два разных способа получения данных из закрытой книги. Эти:- . Откройте закрытую книгу и получите данные. Использование ADODB Connection

Откройте закрытую книгу и получите данные

Можно установить свойство RowSource элемента управления ListBox для получения данных из другой книги, присвоив значение свойству RowSource следующим образом:

‘[Filename.xls] Sheet1?! $ B $ 1: $ B $ 15 ListBox Control будет отображать значения, только если другая рабочая книга открыта.

Итак, чтобы получить данные из закрытой книги, мы создадим макрос, чтобы открыть другую книгу так, чтобы пользователь не заметил этого, и извлечем данные из книги, чтобы добавить элементы в список и закрыть книгу.

Нажатие кнопки «Выбрать» активирует пользовательскую форму «UserForm1».

Событие инициализации пользовательской формы используется для добавления элементов в список. Это событие сначала открывает закрытую книгу, а затем присваивает значение в диапазоне варианту «ListItems». После присвоения значения книга закрывается, и элементы добавляются в список.

ArrowClickingSelectButton

Поле списка используется для выбора имени из существующих значений списка. При нажатии кнопки «ОК» отображается выбранное имя.

ArrowSelectOutput

Использование ADODB Connection

Объекты данных ActiveX (ADO) — это простой в использовании высокоуровневый интерфейс для подключения к OLE DB. Это программный интерфейс для доступа и управления данными в базе данных.

Чтобы создать соединение ADODB, нам нужно будет добавить в проект библиотеку ADO.

Чтобы добавить ссылку, выберите в меню «Инструменты»> «Ссылка».

ArrowAddingReference

Нажатие кнопки «ADODB Connection» на рабочем листе активирует пользовательскую форму «UFADODB». В событии инициализации этой пользовательской формы мы использовали соединение ADODB для извлечения данных из закрытой книги. Мы создали настраиваемую функцию, определяемую пользователем (UDF) «ReadDataFromWorkbook», чтобы установить соединение и получить данные из закрытой книги в массив.

Мы использовали другую UDF «FillListBox» для добавления элементов в поле «Список» во время инициализации пользовательской формы. Список будет отображать данные в двух столбцах, один столбец содержит имя, а второй столбец содержит возраст.

ArrowClickingADODBConnection

При нажатии кнопки «ОК» после выбора элемента в окне списка отображается информационное сообщение о выбранном элементе.

ArrowADODBOutput

Пожалуйста, введите код ниже

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

'Assign the selected value in list box to variable name1 and 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 & ". His age is " & 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 according to your requirement, "Sample_data" is named defined range

tArray = ReadDataFromWorkbook("D:\Excelforum\ExcelForum office\excel tip old code\Shared Macro\23\23SampleData.xls", "Sample_Data")

'Calling function FillListBox  for adding items in List Box

'Assign List box object and tarray as parameter

FillListBox Me.ListBox1, tArray

'Releasing array variables and deallocate the memory used for their elements.

Erase 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 in the List box by default

.ListIndex = -1

End With

End Sub

Private Function ReadDataFromWorkbook(SourceFile As String, _

SourceRange As String) As Variant

' requires a reference to the Microsoft ActiveX Data Objects library

' (menu Tools > References in the VBE)

Dim dbConnection As ADODB.Connection, rs As ADODB.Recordset

Dim dbConnectionString As String

'Declaring a connection string and the driver require for establishing connection

dbConnectionString = "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & SourceFile

'Creating a new ADODB connection

Set dbConnection = New ADODB.Connection

On Error GoTo InvalidInput

'Open the database connection

dbConnection.Open dbConnectionString

'Getting the recordset from defined named range

Set rs = dbConnection.Execute("[" & SourceRange & "]")

On Error GoTo 0

'Returns a two dimensional array with all records in rs

ReadDataFromWorkbook = rs.GetRows

'Close the recordset and database connection

rs.Close

dbConnection.Close

Set rs = Nothing

Set dbConnection = Nothing

Exit Function

'Code for handling error

InvalidInput:

MsgBox "The source file or source range is invalid!", _

vbExclamation, "Get data from closed workbook"

End Function

'Add below code in UserForm1

Option Explicit

Private Sub CommandButton1_Click()

Dim name1 As String

Dim i As Integer

'Assign the selected value to variable 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)

'Get the range of values you want

ListItems = SourceWB.Worksheets(1).Range("A2:A10").Value

'Close the source workbook without saving changes

SourceWB.Close False

Set SourceWB = Nothing

Application.ScreenUpdating = True

'Convert values to a vertical array

ListItems = Application.WorksheetFunction.Transpose(ListItems)

For i = 1 To UBound(ListItems)

'Populate the listbox

.AddItem ListItems(i)

Next i

'Selecting no items by default, set to 0 to select the first item

.ListIndex = -1

End With

End Sub

Если вам понравился этот блог, поделитесь им с друзьями на Facebook и Facebook.

Мы будем рады услышать от вас, дайте нам знать, как мы можем улучшить нашу работу и сделать ее лучше для вас. Напишите нам на [email protected]