Erreur Rowsource de listbox après plusieurs executions
Bonjour à tous!
C'est mon premier post donc j'espère respecter toutes les règles.
Voilà mon problème: j'ai un fichier excel, dans l'un des onglets j'ai plusieurs colonnes (actuellement 18, mais le nombre peut importer, c'est généré).
Chacune de ces colonnes vont être les données qui vont s'inscrire dans des listbox générés dans un userform.
Tout fonctionne parfaitement. je libère la mémoire au maximum.
Mais pour je ne sais quelle raison, si j'exécute un certain nombre de fois ce code (7 ou 8 fois), Excel me sort l'erreur suivante:
erreur d’exécution '-2147467259(80004005)' impossible de définir la propriété Rowsource. Erreur non répertoriée.
J'en déduis qu'il s'agis d'un problème de mémoire mais je ne comprends pas pourquoi ni comment palier à ce problème
Si quelqu'un a la solution.. ca m'aiderait, car là pour moi c'est un vrai mystère!
voici mon code:
Private Sub ChargerCritere_Click()
Dim Col As Integer
Dim LastCol As Integer
Dim LastLigne As Integer
Dim WkSource As Worksheet
Dim listBx As Control
Dim Leftpoint As Integer
Dim Toppoint As Integer
Set WkSource = ThisWorkbook.Worksheets("liste Criteres")
LastCol = WkSource.UsedRange.Columns.Count
Leftpoint = 5
Toppoint = 85
For Col = 1 To LastCol
If WkSource.Cells(2, Col).Value > 0 Then
LastLigne = WkSource.Columns(Col).End(xlDown).Row
Set listBx = CritForm.Controls.Add("Forms.listbox.1", "List" & WkSource.Cells(1, Col).Value, True)
With listBx
If (Leftpoint + 90) < CritForm.Width Then
.Left = Leftpoint
Leftpoint = Leftpoint + 95
Else
Leftpoint = 5
.Left = Leftpoint
Toppoint = Toppoint + 180
End If
.Top = Toppoint
.Width = 80
.Height = 160
.ColumnHeads = True
.RowSource = WkSource.Range(WkSource.Cells(2, Col), WkSource.Cells(LastLigne, Col)).Address(external:=True)
.MultiSelect = 2
End With
Set listBx = Nothing
End If
Next Col
Set WkSource = Nothing
End Sub
Bonjour,
Sans fichier c'est compliqué, mais pourquoi créer ton control Listbox à chaque fois
Set listBx = CritForm.Controls.Add("Forms.listbox.1", "List" & WkSource.Cells(1, Col).Value, True)
Je pense qu'en l'intégrant au Userform tu n'auras plus de problème
A+
Bonjour!
Merci pour ta réponse, mais que veux tu dire par l'intégrer au userform?
Car ce sont des listbox générées. on ne connait pas le nombre de listbox qui va être créé. c'est pourquoi je les ajoute au fur et a mesure qu'il y a de colonnes dans un onglet.
Bonjour
Juste par curiosité (et pas de solution en l'état)
sebien0077 a écrit :si j'exécute un certain nombre de fois ce code (7 ou 8 fois),
Expliques un peu
C'est la création de 7 ou 8 ListBox ?
C'est au 7 ou 8ème lancement de la macro ChargerCritere_Click ?
C'est à la 7 ou 8ème fois que tu utilises le fichier ?
Il faudrait (pour essayer de comprendre - mais pas sur) ton fichier et surtout la démarche que tu fais pour arriver à l'erreur
bonjour!
non non c'est au 7/ 8 ème lancement de la macro que ca fait cette erreur. la première listbox, lors de ce 7/8 eme lancement est bien créé mais n'est pas remplie.
Après je dois quitter le fichier et le ré-ouvrir pour que cela refonctionne.
Evidemment, il y a normalement, aucun intérêt a lancer cette macro autant de fois de suite, car il sera extrêmement rare que l'onglet sur lequel s'appuie cette macro pour créer un nombre X de listbox (correspondant au nombre de colonne remplie dans l'onglet) change à ce point.
Re,
Peut-être en effaçant le contenu de la Listbox avant de mettre les valeurs
...
With listBx
.Clear
...
A+
J'y ai également pensé, j'avais meme ajouté ce bout de code au début (qui supprime tous les controls, donc les listbox, sauf le bouton)
mais là c'est encore plus incompréhensible, car je ne peux pas appuyer 4 fois sur le bouton qui appelle l'ensemble de cette macro !!! alors que au contraire je libère à coup sur la mémoire!
Je ne comprends pas, j'ai l'impression qu'il y a des fuites de libération de mémoire lors de la génération successive de control ( listbox)
Dim ctl As Control
If CritForm.Controls.Count > 1 Then
For Each ctl In CritForm.Controls
If ctl.Name <> "ChargerCritere" Then
ctl.RowSource = ""
ctl.Object.Clear
CritForm.Controls.Remove (ctl.Name)
End If
Next
End If
Re,
Comme la si bien dit Banzai64, il nous faudrait ton fichier anonymisé
A+
Bonsoir!
Désolé de répondre tardivement, je vous ai fait ce fichier. Pour le coup c'est à la 9ème fois qu'il plante.
Il n'y a que 2 onglets. Les cellules en rouges sont les éléments qui seront sélectionnés dans les listes.
Pour moi c'est un mystère...
Bonjour
Pas d'explication trouvée
J'ai essayé avec la propriété List mais le résultat est le même
Une alternative : Passer par AddItem
J'ai testé plus de 20 fois et pas de plantage
End If
.Top = Toppoint
.Width = 80
.Height = 160
.ColumnHeads = True
'.RowSource = wksource.Range(wksource.Cells(2, col), wksource.Cells(LastLigne, col)).Address(external:=True)
.MultiSelect = 2
For line = 2 To LastLigne
.AddItem wksource.Cells(line, col)
Next line
End With
A toute fin utile
Oui j'ai remarqué que par cette solution ca fonctionnait... mais ca m'enlève le titre de la liste (ok ok je peux faire un autre code pour ajouter un textbox...)
Mais je pense sincèrement qu'il y a un problème de fuite de mémoire de chez Microsoft pour le coup
Merci pour ton aide
Bonsoir,
TROUVÉ
Le problème vient de l'instruction ".MultiSelect = 2" placé après le chargement du contenu
S'il est placé avant, plus de souci
Private Sub Btn_Charger_Click()
Dim Col As Integer
Dim LastCol As Integer
Dim LastLigne As Integer
Dim wksource As Worksheet
Dim Listbx As Control
Dim Leftpoint As Integer
Dim Toppoint As Integer
Dim Line As Long
Unload CritForm
Set wksource = ThisWorkbook.Worksheets("liste Criteres")
LastCol = wksource.UsedRange.Columns.Count
Leftpoint = 20
Toppoint = 85
For Col = 1 To LastCol
If wksource.Cells(2, Col).Value > 0 Then
LastLigne = wksource.Columns(Col).End(xlDown).Row
Set Listbx = CritForm.Controls.Add("Forms.listbox.1", "List" & wksource.Cells(1, Col).Value, True)
With Listbx
If (Leftpoint + 90) < CritForm.Width Then
.Left = Leftpoint
Leftpoint = Leftpoint + 95
Else
Leftpoint = 20
.Left = Leftpoint
Toppoint = Toppoint + 180
End If
.Top = Toppoint
.Width = 80
.Height = 160
.ColumnHeads = True
.MultiSelect = 2 ' Doit être placé ICI
.Clear
.RowSource = wksource.Range(wksource.Cells(2, Col), wksource.Cells(LastLigne, Col)).Address(external:=True)
End With
For Line = 2 To LastLigne
If wksource.Cells(Line, Col).Interior.Color = 255 Then
Listbx.Selected(Line - 2) = True
End If
Next Line
Set Listbx = Nothing
End If
Next Col
Set wksource = Nothing
CritForm.Show
End Sub
Nota : Attention tout de même...
Je viens de constater qu'après utilisation, si on ajoute une listebox sur l'Userform et qu'on veut la supprimer,
Paf... erreur non répertoriée
A+
alors là je dis MERCIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
Mais pourquoi ce changement y fait qqch sérieux?
J'ai vue que tu y avais aussi ajouté un .clear mais ca ne change rien j'ai testé sans.
La question c'est pourquoi il faut le placer avant? et l'autre c'est comment tu as trouvé ça? :p
Mais vraiment merci !
Bonjour
@ BrunoM45
Re,
Je vois qu'il y en a certains qui ne sont pas couchés
sebien0077 a écrit :alors là je dis MERCIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
Mais de riiiieeeennnnnnnnn
sebien0077 a écrit :Mais pourquoi ce changement y fait qqch sérieux?
La question c'est pourquoi il faut le placer avant? et l'autre c'est comment tu as trouvé ça? :p
Pourquoi le placer avant :
Perso, pour moi c'est une propriété fixe qui doit être mise à l'initialisation de l'USF (au début)
Ensuite seulement, tu viens alimenter ta ListeBox
Comment j'ai trouvé ça :
C'est comme ça que je développe et je me suis apperçu que je n'avait pas le problème
Au plaisir
Merci l'ami Banzai64,
Banzai64 a écrit :Bonjour
@ BrunoM45
venant de toi je suis touché
Re
Propriété fixe ou pas, le placer avant ou après ne devrait pas impacter de cette façon le comportement de la macro (mémoire)
Quoi qu'il en soit, ton habitude de programmé en VBA à permis d'élucider ce problème!
Comme quoi, j'ai bien fait de m'inscrire pour poster mon problème, car je dois avouer que j'avais un doute, vu la bizarrerie de la chose, sur la possibilité de trouver une solution
Bonne nuit et merciiiiiiiiiiiiiiiiii