Affecter une valeur texte dans un contrôle listbox

Bougalix

XLDnaute Nouveau
:) Bonjour,
C'est mon premier message alors j'en profite pour tirer mon chapeau à tous ceux qui contribuent en particulier à la Wiki XLD,
Vraiment merci je progresse grâce à vous!

Venons en à mon pb (il est probablement simple à résoudre mais je n'ai rien trouvé sur le forum malgré mes recherches) :

J'ai une Listbox (12 colonnes) que j'alimente, ligne par ligne avec les valeurs d'un tableau (dates, valeurs et du texte) lui même alimenté par les recorsets d'une base access (instruction ADODB grâce à la très précieuse page 6 Wiki XLD).

Le pb est qu' après avoir accepté des dates, du texte et des valeurs, l'affectation de la 10ème qui est du texte plante avec une erreur 380 !

Voici précisement la partie du code qui plante:
...

Do While Not Rs.EOF
DetailJour.ListDetailJour.AddItem , N

ReDim Tbl(Rs.RecordCount - 1, Rs.Fields.Count - 1)
For i = 0 To Rs.Fields.Count - 1

If IsNull(Rs.Fields(i).Value) = True Then
Tbl(N, i) = ""
Else
Tbl(N, i) = CStr(Rs.Fields(i).Value)
End If

DetailJour.ListDetailJour.List(N, i) = Tbl(N, i) ' CA BUG ICI QUAND LA VALEUR EST DU TEXTE

Next i
N = N + 1

Rs.MoveNext
Loop

...

j'ai tout essayé (formater le texte, convertir en string!) mais rien ne marche

Je cherche surtout à ne pas pas extrire les données de la table access sur une feuille excel.

Au fait le pb est le même en utilsant :
DetailJour.ListDetailJour.List(N, i) = Rs.Fields(i).Value

Merci pour votre aide
 

JYLL

Nous a quitté
Repose en paix
Re : Affecter une valeur texte dans un contrôle listbox

Bonjour Bougalix et le Forum,


Je pense à un problème d'index avec un tableau qui comporte 10 cases de 0à 9 et 10 colonnes de 1 à 10. essaie de mettre un -1 dans un des index puis l'autre après pour voir si le problème perdure.Autrement ton tableau est-il décalaré en variant de façon à pouvoir prendre toutes sortes de types de données.

Ce ne sont que des pistes, tu testes et tu me dis si cela s'améliore.

Bonne journée.

Bonjour Spitnolan et CbernardT
 
Dernière édition:

Spitnolan08

XLDnaute Barbatruc
Re : Affecter une valeur texte dans un contrôle listbox

Bonjour,

A mon avis, ça n'a rien à voir avec le fait que ce soit du texte...
De mémoire c'est lié à la capacité de chargement des ListBox par cette méthode : maxi 10 ou 11 colonnes à moins que ce ne soit une question de dimensionnement de la listBox...

Car avec le bout de code joint, il manque beaucoup de choses...

Cordialement
 

Bougalix

XLDnaute Nouveau
Re : Affecter une valeur texte dans un contrôle listbox

Bonjour à Tous

Merci de votre intérêt pour mon post.
Voici l'intégralité de mon code:

Quelques infos sur le contexte:
Ma table access (AKM.mdb) contient deux tables : 'Recettes' et 'Depenses'

L'USF 'DetailJour' qui contient la ListBox 'ListDetailJour' contient aussi un control MonthView pour le choix de la date (critère de requête pour récupérer les données sur access).

Les propriétés de la ListBox sont des plus classiques et ColumnCount est initialisé à 12.

je ne vois pas ce qui bloque!

Merci encore pour votre aide


'Importer données jour dans liste DetailJour

Sub ImportTableAccess()

Dim cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim index As Integer, i As Integer, N As Integer, j As Integer
Dim Fichier As String, Table As String, Champ As String
Dim Tbl() As Variant


Fichier = ThisWorkbook.Path & "\AKM.mdb"


Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _
Fichier & ";"
Set Rs = New ADODB.Recordset

DetailJour.ListDetailJour.Visible = True
If DetailJour.BRD.Caption = "RECETTES" Then
Table = "Recettes"
Champ = "[Date Prestation]"
DetailJour.ListDetailJour.BackColor = &H80000003
DetailJour.ListDetailJour.ColumnWidths = "0;0;50;50;30;20;30;20;45;50;20;20"
End If
If DetailJour.BRD.Caption = "DEPENSES" Then
Table = "Depenses"
Champ = "[Date Dépense]"
DetailJour.ListDetailJour.BackColor = &H80C0FF
DetailJour.ListDetailJour.ColumnWidths = "50;50;100;50;50;50;50"
End If

With Rs
.ActiveConnection = cn

.Open "SELECT * FROM " & Table & _
" WHERE ((" & Table & "." & Champ & "=#" & Format(DetailJour.DateDetail.Caption, "mm/dd/yyyy") & "#))" _
, , adOpenStatic, adLockOptimistic, adCmdText

End With

DetailJour.ListDetailJour.Clear
DetailJour.ListDetailJour.ColumnCount = Rs.Fields.Count - 1
DetailJour.NB.Caption = Rs.RecordCount

If Rs.RecordCount = 0 Then
DetailJour.ListDetailJour.Visible = False
MsgBox "Pas de " & Table & " pour ce jour!", vbInformation + vbOKOnly
Exit Sub
End If

If DetailJour.BRD.Caption = "RECETTES" Then
DetailJour.ListDetailJour.BackColor = &H80000003
DetailJour.ListDetailJour.ColumnWidths = "50;50;50;50;30;20;30;20;45;50;20;20"
End If
If DetailJour.BRD.Caption = "DEPENSES" Then
DetailJour.ListDetailJour.BackColor = &H80C0FF
DetailJour.ListDetailJour.ColumnWidths = "50;50;100;50;50;50;50"
End If

'N = 0
Do While Not Rs.EOF
DetailJour.ListDetailJour.AddItem , N
If Table = "Recettes" Then
index = 1
Else
index = 0
End If

ReDim Tbl(Rs.RecordCount - 1, Rs.Fields.Count - 1)

For i = 0 To Rs.Fields.Count - 1

If IsNull(Rs.Fields(i).Value) = True Then
Tbl(N, i) = ""
Else
Tbl(N, i) = CStr(Rs.Fields(i).Value)
End If

DetailJour.ListDetailJour.List(N, i) = Tbl(N, i)

Next i
N = N + 1

Rs.MoveNext
Loop
Rs.Close
Set Rs = Nothing
cn.Close
Set cn = Nothing
End Sub
 

Bougalix

XLDnaute Nouveau
Re : Affecter une valeur texte dans un contrôle listbox

Bonsoir à tous

je reviens après d'autres tests

j'ai limité la propriété de ListDetailJour.ColumnCount à mois de 9 colonnes et c'est toujours le même bug.

Je me demande si le pb ne viendrait pas de la table recettes d'access ?

je vais décaler le champ qui contient du texte au début pour voir si ça s'améliore.

je vous tiens au courant.

Merci à tous encore une fois pour votre disponibilité.

Bougalix
 

Bougalix

XLDnaute Nouveau
Re : Affecter une valeur texte dans un contrôle listbox

Re Bonsoir à tous

J'aimerais me tromper, mais (après plusieurs tests) je crois que le pb viens d'une limitation à 10 colonnes pour la ListBox comme l'avait fait remarqué à juste titre Spitnolan08

Alors si vous avez des idées pour contourner cette limitation, je suis preneur!:eek:

Merci à tous

Bougalix
 

MichelXld

XLDnaute Barbatruc
Re : Affecter une valeur texte dans un contrôle listbox

bonsoir

Ton problème vient peut être de la lecture de ton Recordset dans le tableau Tbl() et dans la ListBox.
Voici une version, que tu pourras adapter, testée avec 15 champs dans une table Access qui s'affichent dans une ListBox;


Code:
Private Sub CommandButton1_Click()
Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim i As Integer, N As Integer
Dim Fichier As String
Dim Tbl() As Variant
 
Fichier = "C:\Documents and Settings\mimi\dossier\dataBase.mdb"
 
Set Cn = New ADODB.Connection
Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _
    Fichier & ";"
Set Rs = New ADODB.Recordset
 
With Rs
    .ActiveConnection = Cn
    .Open "SELECT * FROM MaNouvelleTable" _
        , , adOpenStatic, adLockOptimistic, adCmdText
End With
 
ListBox1.Clear
ListBox1.ColumnCount = Rs.Fields.Count
 
ReDim Tbl(Rs.RecordCount - 1, Rs.Fields.Count)
 
Do While Not Rs.EOF
    For i = 0 To Rs.Fields.Count - 1
        If IsNull(Rs.Fields(i).Value) = True Then
            Tbl(N, i) = ""
            Else
            Tbl(N, i) = CStr(Rs.Fields(i).Value)
        End If
    Next i
 
    N = N + 1
    Rs.MoveNext
Loop
 
ListBox1.List() = Tbl
 
 
Rs.Close
Set Rs = Nothing
Cn.Close
Set Cn = Nothing
End Sub



Bon week end
MichelXld
 
Dernière édition:

Bougalix

XLDnaute Nouveau
Re : Affecter une valeur texte dans un contrôle listbox

Bonjour Michel

je suis très content que tu me répondes.
Je te remercie (je pense que je ne suis ni le premier , ni le dernier ) pour tes nombreuses et excellentes réponses qui à chaque fois permettent de progresser quand on les consulte attentivement.

Merci pour ta réponse j'étais justement en train de chrecher le moyen d'affecter les valeurs de tout le tableau Tbl au controlsource d'un ListBox

Je m'empresse de tester ta solution.

Cordiales salutations
et merci à tous les autres pour le temps qu'ils m'ont consacré.

Bougalix
 

Bougalix

XLDnaute Nouveau
Re : Affecter une valeur texte dans un contrôle listbox

MichelXld à dit:
bonsoir

Ton problème vient peut être de la lecture de ton Recordset dans le tableau Tbl() et dans la ListBox.
Voici une version, que tu pourras adapter, testée avec 15 champs dans une table Access qui s'affichent dans une ListBox;


Code:
Private Sub CommandButton1_Click()
Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim i As Integer, N As Integer
Dim Fichier As String
Dim Tbl() As Variant
 
Fichier = "C:\Documents and Settings\mimi\dossier\dataBase.mdb"
 
Set Cn = New ADODB.Connection
Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _
    Fichier & ";"
Set Rs = New ADODB.Recordset
 
With Rs
    .ActiveConnection = Cn
    .Open "SELECT * FROM MaNouvelleTable" _
        , , adOpenStatic, adLockOptimistic, adCmdText
End With
 
ListBox1.Clear
ListBox1.ColumnCount = Rs.Fields.Count
 
ReDim Tbl(Rs.RecordCount - 1, Rs.Fields.Count)
 
Do While Not Rs.EOF
    For i = 0 To Rs.Fields.Count - 1
        If IsNull(Rs.Fields(i).Value) = True Then
            Tbl(N, i) = ""
            Else
            Tbl(N, i) = CStr(Rs.Fields(i).Value)
        End If
    Next i
 
    N = N + 1
    Rs.MoveNext
Loop
 
ListBox1.List() = Tbl
 
 
Rs.Close
Set Rs = Nothing
Cn.Close
Set Cn = Nothing
End Sub



Bon week end
MichelXld
Bonsoir MichelXLD

ça marche impeccablement

Merci infiniment

Bougalix
 

Spitnolan08

XLDnaute Barbatruc
Re : Affecter une valeur texte dans un contrôle listbox

Re,

en complément de mon 1er post et de ceux bien sûr toujours excellent de Michel et accessoirement après la bataille :

Le chargement d'une ListBox par ListBox1.List(N, i) = Tbl(N, i) est limité à 10 colonnes quel que soit le nombre de colonnes défini pour la ListBox.

Le code de Michel fonctionne car il contourne le problème en créant une liste sous la forme d'un tableau (Tbl) qu'il charge en une fois dans la ListBox ce qui évite la limitation à 10 colonnes des ListBox :
Code:
ListBox1.List() = Tbl
De même, il est possible de charger une listBox de plus de 10 colonnes à partir d'un Range de cette façon :
Code:
ListBox1.List() = Range("A1:AZ20").value
alors qu'une instruction du type :
Code:
for j= 0 to 14
    for i=0 to 19 
        ListBox1.List(i, j) = cells(j,i).value 
    next
Next
ne fonctionne pas à partir de j = 10...
Cordialement
 

Bougalix

XLDnaute Nouveau
Re : Affecter une valeur texte dans un contrôle listbox

Bonjour Spitnolan08,

merci pour le temps que tu as consacré à mon pb.

J'espère que mon post et les excellentes réponses seront utiles pour la communauté XLD.

Un résumé du pb pour les recherches:

Charger un contrôle ListBox de plus de 10 colonnes à partir d'une feuille Excel ou d'une table Access.
 

Discussions similaires

Statistiques des forums

Discussions
312 214
Messages
2 086 311
Membres
103 175
dernier inscrit
abcc