In diesem Artikel werden Daten mithilfe von VBA aus der geschlossenen Arbeitsmappe in das Listenfeld im Benutzerformular abgerufen.

Die Rohdaten für dieses Beispiel befinden sich im Bereich A2: B10 in der Arbeitsmappe „23SampleData.xls“, die im Dateipfad „D: \ Excelforum \ ExcelForum Office \ Excel-Tipp alter Code \ Freigegebenes Makro \ 23 \“ abgelegt wird.

ArrowSampleData

Wir haben im Hauptarbeitsblatt zwei Befehlsschaltflächen zum Ausführen von zwei verschiedenen Benutzerformularen erstellt. Jede Befehlsschaltfläche ist mit verschiedenen Benutzerformularen verknüpft.

ArrowMainSheet

Logische Erklärung

In diesem Beispiel werden zwei verschiedene Methoden zum Abrufen von Daten aus der geschlossenen Arbeitsmappe verwendet. Diese sind:- . Öffnen Sie die geschlossene Arbeitsmappe und rufen Sie die Daten ab. Verwenden der ADODB-Verbindung

Öffnen Sie die geschlossene Arbeitsmappe und holen Sie sich die Daten

Sie können die RowSource-Eigenschaft eines ListBox-Steuerelements festlegen, um Daten aus anderen Arbeitsmappen abzurufen, indem Sie der RowSource-Eigenschaft wie folgt einen Wert zuweisen:

‘[Dateiname.xls] Sheet1 ?! $ B $ 1: $ B $ 15 ListBox Control zeigt Werte nur an, wenn die andere Arbeitsmappe geöffnet ist.

Um die Daten aus der geschlossenen Arbeitsmappe abzurufen, erstellen wir ein Makro zum Öffnen der anderen Arbeitsmappe, ohne dass der Benutzer dies bemerkt, und rufen Daten aus der Arbeitsmappe ab, um Elemente in das Listenfeld einzufügen und die Arbeitsmappe zu schließen.

Durch Klicken auf die Schaltfläche „Auswählen“ wird das Benutzerformular „UserForm1“ aktiviert.

Das Initialisierungsereignis des Benutzerformulars wird zum Hinzufügen von Elementen im Listenfeld verwendet. Dieses Ereignis öffnet zuerst die geschlossene Arbeitsmappe und weist dann den Wert im Bereich der Variante „ListItems“ zu. Nach dem Zuweisen des Werts wird die Arbeitsmappe geschlossen und Elemente zum Listenfeld hinzugefügt.

ArrowClickingSelectButton

Das Listenfeld wird verwendet, um den Namen aus den vorhandenen Listenwerten auszuwählen. Durch Drücken der Taste „OK“ wird der ausgewählte Name angezeigt.

ArrowSelectOutput

Verwenden der ADODB-Verbindung

ActiveX Data Objects (ADO) ist eine übersichtliche Benutzeroberfläche für die OLE DB-Verbindung auf hoher Ebene. Es ist eine Programmierschnittstelle für den Zugriff auf und die Bearbeitung von Daten in einer Datenbank.

Um eine ADODB-Verbindung herzustellen, müssen wir die ADO-Bibliothek zum Projekt hinzufügen.

Um eine Referenz hinzuzufügen, wählen Sie im Menü Extras> Referenz.

ArrowAddingReference

Durch Klicken auf die Schaltfläche „ADODB-Verbindung“ im Arbeitsblatt wird das Benutzerformular „UFADODB“ aktiviert. Im Initialisierungsereignis dieses Benutzerformulars haben wir die ADODB-Verbindung verwendet, um Daten aus der geschlossenen Arbeitsmappe abzurufen. Wir haben eine benutzerdefinierte UDF (User Defined Function) „ReadDataFromWorkbook“ erstellt, um die Verbindung herzustellen und die Daten aus der geschlossenen Arbeitsmappe in das Array abzurufen.

Wir haben eine andere UDF-Datei „FillListBox“ verwendet, um während der Initialisierung des Benutzerformulars Elemente im Listenfeld hinzuzufügen. Das Listenfeld zeigt Daten in zwei Spalten an, eine Spalte enthält den Namen und die zweite Spalte enthält das Alter.

ArrowClickingADODBConnection

Durch Drücken der Taste „OK“ nach Auswahl des Elements im Listenfeld wird die Informationsmeldung zum ausgewählten Element angezeigt.

ArrowADODBOutput

Bitte folgen Sie unten für den Code

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

Wenn dir dieser Blog gefallen hat, teile ihn mit deinen Freunden auf Facebook und Facebook.

Wir würden gerne von Ihnen hören, lassen Sie uns wissen, wie wir unsere Arbeit verbessern und für Sie verbessern können. Schreiben Sie uns unter [email protected]