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...

36test.xlsm (29.94 Ko)

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

Rechercher des sujets similaires à "erreur rowsource listbox executions"