Dans cet article, nous allons récupérer les données du classeur fermé vers la zone de liste dans le formulaire utilisateur à l’aide de VBA.

Les données brutes de cet exemple se trouvent dans la plage A2: B10 du classeur «23SampleData.xls», qui est placé dans le chemin du fichier «D: \ Excelforum \ ExcelForum office \ excel tip old code \ Shared Macro \ 23 \».

ArrowSampleData

Nous avons créé deux boutons de commande sur la feuille de calcul principale pour exécuter deux formulaires utilisateur différents. Chaque bouton de commande est lié à différents formulaires utilisateur.

ArrowMainSheet

Explication logique

Dans cet exemple, deux méthodes différentes sont utilisées pour extraire les données du classeur fermé. Ceux-ci sont:- . Ouvrez le classeur fermé et récupérez les données. Utilisation de la connexion ADODB

Ouvrez le classeur fermé et récupérez les données

Il est possible de définir la propriété RowSource d’un contrôle ListBox pour obtenir des données d’un autre classeur en attribuant une valeur à la propriété RowSource comme suit:

‘[Filename.xls] Sheet1?! $ B $ 1: $ B $ 15 Le contrôle ListBox n’affichera les valeurs que si l’autre classeur est ouvert.

Donc, pour récupérer les données du classeur fermé, nous allons créer une macro pour ouvrir l’autre classeur sans que l’utilisateur ne le remarque et extraire les données du classeur pour ajouter des éléments dans la zone de liste et fermer le classeur.

Cliquez sur le bouton «Sélectionner» pour activer le formulaire utilisateur «UserForm1».

L’événement Initialize du formulaire utilisateur est utilisé pour ajouter des éléments dans la zone de liste. Cet événement ouvre d’abord le classeur fermé, puis affecte la valeur de la plage à la variante «ListItems». Après avoir attribué la valeur, le classeur est fermé et les éléments sont ajoutés à la zone de liste.

ArrowClickingSelectButton

La zone de liste est utilisée pour sélectionner un nom parmi les valeurs de liste existantes. Appuyez sur le bouton «OK» pour afficher le nom sélectionné.

ArrowSelectOutput

Utilisation de la connexion ADODB

ActiveX Data Objects (ADO) est une interface de haut niveau facile à utiliser pour la connexion OLE DB. C’est une interface de programmation pour accéder et manipuler les données d’une base de données.

Afin de créer une connexion ADODB, nous devrons ajouter la bibliothèque ADO au projet.

Pour ajouter une référence, choisissez dans le menu Outils> Référence.

ArrowAddingReference

Cliquer sur le bouton «Connexion ADODB» sur la feuille de travail activera le formulaire utilisateur «UFADODB». Dans l’événement initialize de ce formulaire utilisateur, nous avons utilisé la connexion ADODB pour récupérer les données du classeur fermé. Nous avons créé une fonction personnalisée définie par l’utilisateur (UDF) «ReadDataFromWorkbook» pour établir la connexion et récupérer les données du classeur fermé vers le tableau.

Nous avons utilisé un autre UDF «FillListBox» pour ajouter des éléments dans la zone de liste lors de l’initialisation du formulaire utilisateur. La zone de liste affiche les données dans deux colonnes, une colonne contient le nom et la deuxième colonne contient l’âge.

ArrowClickingADODBConnection

Appuyez sur le bouton «OK» après avoir sélectionné l’élément dans la zone de liste pour afficher le message d’information sur l’élément sélectionné.

ArrowADODBOutput

Veuillez suivre ci-dessous pour le 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

Si vous avez aimé ce blog, partagez-le avec vos amis sur Facebook et Facebook.

Nous serions ravis de vous entendre, faites-nous savoir comment nous pouvons améliorer notre travail et le rendre meilleur pour vous. Écrivez-nous à [email protected]