OVH Cloud OVH Cloud

VBA. Remplissage d'un tableau d'après une table de base de donnée

5 réponses
Avatar
HD
Bonjour,

Pour remplir un combobox d'après les données d'une base de donnée Access je
lis les données de la table que je mets sur une feuille Excel puis seulement
j'ajoute les données au combobox....

With ActiveSheet.QueryTables.Add(Connection:="ODBC;DSN=MS Access
Database;DBQ=X:\local\bases\bdd.mdb;DefaultDir=X:\local\bases;DriverId=25;FI
L=MS Access;MaxBufferSize=8192;PageTimeout=5000;", Destination:=Range("A1"))
.Sql = "SELECT DISTINCT table.dos, table.rs FROM table"
.FieldNames = True
.RefreshStyle = xlInsertDeleteCells
.RowNumbers = False
.FillAdjacentFormulas = False
.RefreshOnFileOpen = False
.HasAutoFormat = True
.BackgroundQuery = True
.TablesOnlyFromHTML = True
.Refresh BackgroundQuery:=False
.SavePassword = True
.SaveData = True
End With

Do
ComboBox1.AddItem Cells(i, 2).Value
i = i + 1
Loop Until Cells(i, 1).Value = ""

Mais y'a-t-il un moyen beaucoup plus rapide qui me permetterais de remplir
directement le combobox à partir de la table de données sans passer par une
feuille Excel intermédiaire ? Quelque chose du style :

Pour tout table.dos de table combobox = table.dos

Merci d'avance pour votre aide
--
@+
HD

5 réponses

Avatar
MichDenis
Bonjour HD,


Voici 2 procédures qui font ce type de travail. Une utilisant DAO et l'autre ADO. Chacune demande d'ajouter une référence
particulière à ton projet VBA selon celle que tu retiendras. Pour ce faire, dans la fenêtre VBE (visual basic editor), barre des
menus / outils / référence / tu coches la référence indiquée dans chacune des procédures.

Dans les 2 cas, la requête utilise 3 champs, tu dois définir les propriétés de ton combobox pour avoir le nombre de colonne
(ColumnCount) et ColumnWidths selon le nombre de champs de ta requête. Évidemment, tu devras adapter le nom des objets selon ceux
de ton application.


'-------------------------------------
Sub Access_Initialer_Un_Combobox_en_DAO()

'Testé à partir d'office 2000 et Windows pro 2000
'Requiert la référence : "Microsoft DAO 3.6 object librairy"

'La base de données Comptoir.mdb est disponible sur le CD
'd'installation d'office.

Dim DB As DAO.Database, Rst As DAO.Recordset
Dim BD As String, Requete As String

BD = ThisWorkbook.Path & "Comptoir.mdb"

Requete = "SELECT Fournisseurs.Société ,Fournisseurs.Ville,Fournisseurs.Pays " & _
"FROM Fournisseurs "

Set DB = DBEngine.Workspaces(0).OpenDatabase(BD)
Set Rst = DB.OpenRecordset(Requete)
Rst.MoveLast: Rst.MoveFirst

UserForm1.ComboBox1.List = Application.Transpose(Rst.GetRows(Rst.RecordCount))
UserForm1.Show

Rst.Close
DB.Close
Set Rst = Nothing: Set DB = Nothing

End Sub
'-------------------------------------

Sub Access_Initialer_Un_Combobox_Avec_ADO()

'Testé à partir d'office 2000 et Windows pro 2000
'Requiert la référence : "Microsoft Activex data objects 2.0 librairy"

'La base de données Comptoir.mdb est disponible sur le CD
'd'installation d'office.

Dim Cnt As New ADODB.Connection, Rst As New ADODB.Recordset
Dim BaseAccess As String, Requete As String

BaseAccess = ThisWorkbook.Path & "Comptoir.mdb"

Requete = "SELECT Fournisseurs.Société ,Fournisseurs.Ville,Fournisseurs.Pays " & _
"FROM Fournisseurs "

'Création d'une connection avec la base de données.
Cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & BaseAccess

'Ouverture du recordset (exécution de la requête)
Rst.Open Requete, Cnt, adOpenStatic

UserForm1.ComboBox1.List = Application.Transpose(Rst.GetRows)
UserForm1.Show

'Fermeture du recordset
Rst.Close

'Fermeture de la connection entre excel et la base de données
Cnt.Close

'Libération de l'espace mémoire occupé par les objets
Set Rst = Nothing: Set Cnt = Nothing

End Sub
'-------------------------------------


Salutations!





"HD" a écrit dans le message de news:
Bonjour,

Pour remplir un combobox d'après les données d'une base de donnée Access je
lis les données de la table que je mets sur une feuille Excel puis seulement
j'ajoute les données au combobox....

With ActiveSheet.QueryTables.Add(Connection:="ODBC;DSN=MS Access
Database;DBQ=X:localbasesbdd.mdb;DefaultDir=X:localbases;DriverId%;FI
L=MS Access;MaxBufferSize92;PageTimeoutP00;", Destination:=Range("A1"))
.Sql = "SELECT DISTINCT table.dos, table.rs FROM table"
.FieldNames = True
.RefreshStyle = xlInsertDeleteCells
.RowNumbers = False
.FillAdjacentFormulas = False
.RefreshOnFileOpen = False
.HasAutoFormat = True
.BackgroundQuery = True
.TablesOnlyFromHTML = True
.Refresh BackgroundQuery:úlse
.SavePassword = True
.SaveData = True
End With

Do
ComboBox1.AddItem Cells(i, 2).Value
i = i + 1
Loop Until Cells(i, 1).Value = ""

Mais y'a-t-il un moyen beaucoup plus rapide qui me permetterais de remplir
directement le combobox à partir de la table de données sans passer par une
feuille Excel intermédiaire ? Quelque chose du style :

Pour tout table.dos de table combobox = table.dos

Merci d'avance pour votre aide
--
@+
HD
Avatar
HD
Merci j'ai utilisé DAO et cela marche très bien... Par contre comment
obtenir une seule donnée ? Par exemple :

BD = ThisWorkbook.Path & "Comptoir.mdb"
Requete = "SELECT Fournisseurs.Société FROM Fournisseurs WHERE
Fournisseurs.code = ' " & moncode & " ' "
Set DB = DBEngine.Workspaces(0).OpenDatabase(BD)
Set Rst = DB.OpenRecordset(Requete)
Rst.MoveLast: Rst.MoveFirst
MonFournisseur = Rst.GetRows(Rst.RecordCount)
Rst.Close
DB.Close
Set Rst = Nothing: Set DB = Nothing

Cela ne fonctionne pas... : ((

--
@+
HD
Avatar
Pierre CFI [mvp]
bonjour
MonFournisseur = Rst(0)

--
Pierre CFI
MVP Microsoft Access
Mail : http://cerbermail.com/?z0SN8cN53B

Site pour bien commencer
Access http://users.skynet.be/mpfa/
Excel http://www.excelabo.net
Site perso
http://access.cfi.free.fr
"HD" a écrit dans le message de news:
Merci j'ai utilisé DAO et cela marche très bien... Par contre comment
obtenir une seule donnée ? Par exemple :

BD = ThisWorkbook.Path & "Comptoir.mdb"
Requete = "SELECT Fournisseurs.Société FROM Fournisseurs WHERE
Fournisseurs.code = ' " & moncode & " ' "
Set DB = DBEngine.Workspaces(0).OpenDatabase(BD)
Set Rst = DB.OpenRecordset(Requete)
Rst.MoveLast: Rst.MoveFirst
MonFournisseur = Rst.GetRows(Rst.RecordCount)
Rst.Close
DB.Close
Set Rst = Nothing: Set DB = Nothing

Cela ne fonctionne pas... : ((

--
@+
HD




Avatar
Pierre CFI [mvp]
../..
Set Rst = DB.OpenRecordset(Requete)
if not rst.eof then MonFournisseur = Rst(0)

çà gére le non trouvé

--
Pierre CFI
MVP Microsoft Access
Mail : http://cerbermail.com/?z0SN8cN53B

Site pour bien commencer
Access http://users.skynet.be/mpfa/
Excel http://www.excelabo.net
Site perso
http://access.cfi.free.fr
"HD" a écrit dans le message de news:
Merci j'ai utilisé DAO et cela marche très bien... Par contre comment
obtenir une seule donnée ? Par exemple :

BD = ThisWorkbook.Path & "Comptoir.mdb"
Requete = "SELECT Fournisseurs.Société FROM Fournisseurs WHERE
Fournisseurs.code = ' " & moncode & " ' "
Set DB = DBEngine.Workspaces(0).OpenDatabase(BD)
Set Rst = DB.OpenRecordset(Requete)
Rst.MoveLast: Rst.MoveFirst
MonFournisseur = Rst.GetRows(Rst.RecordCount)
Rst.Close
DB.Close
Set Rst = Nothing: Set DB = Nothing

Cela ne fonctionne pas... : ((

--
@+
HD




Avatar
HD
Un grand MERCI à vous !!!

--
@+
HD