이 기사에서는 VBA를 사용하여 닫힌 통합 문서에서 사용자 양식의 목록 상자로 데이터를 가져옵니다.

이 예제의 원시 데이터는 “23SampleData.xls”통합 문서의 A2 : B10 범위에 있으며 “D : \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \”파일 경로에 있습니다.

ArrowSampleData

두 개의 서로 다른 사용자 양식을 실행하기 위해 기본 워크 시트에 두 개의 명령 단추를 만들었습니다. 각 명령 단추는 서로 다른 사용자 양식에 연결됩니다.

ArrowMainSheet

논리 설명

이 예에서는 닫힌 통합 문서에서 데이터를 가져 오는 데 두 가지 다른 방법이 사용됩니다. 이것들은:- . 닫힌 통합 문서를 열고 데이터를 가져옵니다. ADODB 연결 사용

닫힌 통합 문서를 열고 데이터를 가져옵니다

다음과 같이 RowSource 속성에 값을 할당하여 다른 통합 문서에서 데이터를 가져 오도록 ListBox 컨트롤의 RowSource 속성을 설정할 수 있습니다.

‘[Filename.xls] Sheet1?! $ B $ 1 : $ B $ 15 ListBox 컨트롤은 다른 통합 문서가 열려있는 경우에만 값을 표시합니다.

따라서 닫힌 통합 문서에서 데이터를 가져 오기 위해 사용자가 알아 채지 않고 통합 문서에서 데이터를 가져와 목록 상자에 항목을 추가하고 통합 문서를 닫지 않고 다른 통합 문서를 여는 매크로를 만듭니다.

“선택”버튼을 클릭하면 사용자 폼 “UserForm1″이 활성화됩니다.

사용자 폼의 초기화 이벤트는 목록 상자에 항목을 추가하는 데 사용됩니다. 이 이벤트는 먼저 닫힌 통합 문서를 연 다음 범위의 값을 “ListItems”변형에 할당합니다. 값을 할당하면 통합 문서가 닫히고 항목이 목록 상자에 추가됩니다.

ArrowClickingSelectButton

목록 상자는 기존 목록 값에서 이름을 선택하는 데 사용됩니다. “OK”버튼을 누르면 선택한 이름이 표시됩니다.

ArrowSelectOutput

ADODB 연결 사용

ADO (ActiveX Data Objects)는 OLE DB 연결을위한 사용하기 쉬운 고급 인터페이스입니다. 데이터베이스의 데이터에 액세스하고 조작하기위한 프로그래밍 인터페이스입니다.

ADODB 연결을 생성하려면 ADO 라이브러리를 프로젝트에 추가해야합니다.

참조를 추가하려면 도구 메뉴> 참조에서 선택합니다.

ArrowAddingReference

워크 시트에서 “ADODB 연결”버튼을 클릭하면 “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]로 문의 해주세요