Alimenter une combobox avec un fichier dbf fermé

rcan7412

XLDnaute Occasionnel
Comment en VBA alimenter une combobox avec une fichier type 'DBF' géré depuis un progiciel externe ?

Dans le fichier joint, je souhaiterais lister la colonne 'RAIS' dans une combobox et renvoyer le 'PATH'.

Merci pour votre aide [file name=societes.zip size=1502]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/societes.zip[/file]
 

Pièces jointes

  • societes.zip
    1.5 KB · Affichages: 59

MichelXld

XLDnaute Barbatruc
bonsoir

tu peux tester cette nouvelle version ( si j'ai bien compris )


Private Sub Userform_Initialize()
'Private Sub CommandButton1_Click()
'necessite d'activer la reference Microsoft ActiveX Data Objects x.x Lib rary
Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim Chemin As String, Cible As String, laBase As String

'Chemin = ThisWorkbook.Path
Chemin = 'C:\\\\\\\\evolution'
laBase = 'societes.dbf'

With ComboBox1
.Clear 'suppression anciennes données dans combobox
.ColumnCount = 4 'nombre de colonnes
'Il y aura 4 colonnes dans ComboBox
.ColumnWidths = '130;0;0;0' 'largeur colonnes
End With

Set Cn = New ADODB.Connection
Cn.Open _
'Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=' & _
Chemin & ';'

'pour la recuperation des champs RAIS ,PATH ,DATEDEB,DATEFIN
Cible = 'SELECT RAIS,PATH,DATEDEB,DATEFIN FROM ' & laBase & ' ORDER BY RAIS ;'

Set Rs = New Recordset
Rs.Open Cible, Cn, adOpenKeyset, adLockOptimistic

Do While Not Rs.EOF
ComboBox1.AddItem Rs.Fields(0).Value 'champ RAIS
ComboBox1.List(ComboBox1.ListCount - 1, 1) = Rs.Fields(1).Value 'champ PATH
ComboBox1.List(ComboBox1.ListCount - 1, 2) = Rs.Fields(2).Value 'DATEDEB
ComboBox1.List(ComboBox1.ListCount - 1, 3) = Rs.Fields(3).Value 'DATEFIN
Rs.MoveNext
Loop

Rs.Close
Cn.Close
End Sub


Private Sub ComboBox1_Change()
TextBox1 = ComboBox1.List(ComboBox1.ListIndex, 2) ''DATEDEB
TextBox2 = ComboBox1.List(ComboBox1.ListIndex, 3) ''DATEFIN
Range('A1') = ComboBox1
End Sub




bonne soirée
MichelXld
 

rcan7412

XLDnaute Occasionnel
Merci de ta réponse rapide...mais il m'indique comme message 'erreur d'exécution '2147352571 (80020005)': Impossible de définir la propriété List. Le type ne correspond pas'. Quelle est la signification du message ?

D'autre part, comment avoir la possibilité de mettre à jour les champs datedeb et datefin via les textbox au sein du fichier societes.dbf ?

Bon dimanche

Rodolphe
 

MichelXld

XLDnaute Barbatruc
bonjour

Ouvre ta base 'societes.dbf' et verifie que tu as bien des dates indiquees dans les champs DATEDEB et DATEFIN


si ta base doit contenir des champs DATEDEB et DATEFIN vides tu peux utiliser

Do While Not Rs.EOF
ComboBox1.AddItem Rs.Fields(0).Value 'champ RAIS
ComboBox1.List(ComboBox1.ListCount - 1, 1) = Rs.Fields(1).Value 'champ PATH
If Not Rs.Fields(2).Value = '' Then _
ComboBox1.List(ComboBox1.ListCount - 1, 2) = Rs.Fields(2).Value 'DATEDEB
If Not Rs.Fields(3).Value = '' Then _
ComboBox1.List(ComboBox1.ListCount - 1, 3) = Rs.Fields(3).Value 'DATEFIN
Rs.MoveNext
Loop


pour ta derniere question , tu trouveras plusieurs exemples dans les liens indiqués plus haut


bon apres midi
MichelXld
 

rcan7412

XLDnaute Occasionnel
Re-merci,

Effectivement j'ai pu récupérer les valeurs dans les textbox (et dans ma feuille xl, mais là les valeurs ne sont pas directement interpretées en format date. Il faut faire F2 +ENTER. J'ai trouvé la parade en utilisant la fonction DATEVAL dans une autre cellule).

Pour la mise à jour des données vers le fichier DBF, là j'ai quelques problèmes. Je mes suis inspiré de tes ressources wiki avec 'Comment piloter un fichier DBase (.dbf) depuis Excel'.

Je l'ai inséré dans une procédure actionnée par un bouton du userform. Le problème, c'est que la table n'est pas mise à jour et qu'après action, le fichier societes.dbf semble corrompu, puisqu'il refuse toute action future sur celui-ci. Le fichier reste pourtant lisible dans le progiciel ? J'ai le message 'Le type ne correspond pas.'

Voici mon code :
Code:
Private Sub CommandButton3_Click()
'necessite d'activer la reference Microsoft ActiveX Data Objects x.x Library
Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim Chemin As String, Cible As String, laBase As String
Chemin = 'C:\\evolution'
laBase = 'societes.dbf'
Set Cn = New ADODB.Connection
Cn.Open _
'Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=' & _
Chemin & ';'
Cible = 'SELECT DATEDEB,DATEFIN FROM ' & laBase & ';'
Set Rs = New Recordset
Rs.Open Cible, Cn, adOpenKeyset, adLockOptimistic
With Rs
.AddNew
.Fields(0) = ComboBox1.List(ComboBox1.ListIndex, 2) ''DATEDEB
.Fields(1) = ComboBox1.List(ComboBox1.ListIndex, 3) ''DATEFIN
.Update
End With
Rs.Close
Cn.Close
End Sub
 

MichelXld

XLDnaute Barbatruc
bonsoir

l'exemple que tu as utilisé sert à ajouter un enregistement et non a mettre à jour un enregistrment existant

la macro ci dessous met a jour les champs DATEDEB (TextBox1) et DATEFIN (TextBox2) en fonction de l'enregistrement sélectionné dans la Combobox (champ RAIS)


Private Sub CommandButton1_Click()
Dim Cn As ADODB.Connection
Dim Chemin As String, laBase As String, Requete As String

Chemin = ThisWorkbook.Path
laBase = 'societes.dbf'

If ComboBox1.ListIndex = -1 Then Exit Sub
If Not IsDate(TextBox1) Or Not IsDate(TextBox2) Then Exit Sub

Set Cn = New ADODB.Connection
Cn.Open _
'Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=' & _
Chemin & ';'

'attention le format doit etre de type mois jour annee
Requete = 'UPDATE ' & laBase & ' Set ' & _
'DATEDEB = #' & Format(TextBox1, 'mm/dd/yyyy') & '#, DATEFIN = #' & _
Format(TextBox2, 'mm/dd/yyyy') & '# WHERE RAIS = '' & ComboBox1 & '''
Cn.Execute Requete

Cn.Close
End Sub




bonne soirée
MichelXld

Message édité par: michelxld, à: 22/01/2006 19:04
 

rcan7412

XLDnaute Occasionnel
Absolument génialissime.... Tu es vraiment un maître en la matière.

Pour faire le parallèle avec ACCESS, peut-on considérer qu'il s'agit d'une requête de type 'ajout' pour cette partie de code ?

Code:
Requete = 'UPDATE ' & laBase & ' Set ' & _
'DATEDEB = #' & Format(TextBox1, 'mm/dd/yyyy') & '#, DATEFIN = #' & _
Format(TextBox2, 'mm/dd/yyyy') & '# WHERE RAIS = '' & ComboBox1 & '''
Cn.Execute Requete

Merci beaucoup pour ton aide. J'ai l'impression d'avancer un peu dans la compréhension de vba.
 

rcan7412

XLDnaute Occasionnel
Comment effectuer une requête qui regroupe les enregistrements par mois/année, exemple : 01/2005 - 02/2005 .... 01/2006 - 02/2006, etc...
Mais pas en colonne (comme une requête croisée en access)

J'ai essayé avec group by, mais sans succès.

Le champ date est DECR au format jj/mm/aaaa

Comment s'y prendre ?
 

Discussions similaires

Statistiques des forums

Discussions
312 321
Messages
2 087 264
Membres
103 500
dernier inscrit
Suk Ram