Problème avec une ListBox: Mémoire insuffisante pour cette opération

Résolu
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013 - 25 avril 2012 à 17:22
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013 - 26 avril 2012 à 18:30
Bonjour, j'ai crée une ListBox qui va chercher ses données dans un fichier (que je choisis grace a une TextBox) qu'il ouvre, prend les données puis ferme.
La premiere fois que je l'utilise, tous va bien il me sort le bon tableau...
Mais si je souhaite actualiser (ou changer de fichier) il me met: "Mémoire insuffisante pour cette opération"

J'ai essayer de mettre un Me.ListBox1.clear lorsque je clique sur mon bouton qui lance la récupération de données, mais il me met une autre Run-Time erreur : Unspecified (alors que la 1er fois que je l'utilise il me dit rien du tout)

Pour avoir une meilleur visu je vous met le code que j'utilise:
Private Sub CommandButton5_Click()

Me.ListBox1.Clear
PathFeuil = ThisWorkbook.Path & "\DataFours\F" & Me.TextBox2.Value & "DataSheet.xls"
    
    If Dir(PathFeuil, vbNormal) = "" Then
        MsgBox "Les données n'existe pas!", vbExclamation, "Données introuvables"
        Exit Sub
    Else
        Workbooks.Open PathFeuil
        
        Set wbCible = GetObject(PathFeuil)
        wbCible.Sheets("Data").Activate
        With Me.ListBox1
            .RowSource = "B2:J22"
            .ListIndex = 0
        End With
        ActiveWorkbook.Close False
    End If
End Sub


Je n'arrive pas a trouver mes problèmes...
Je vous remercie d'avance pour les supers idées que les exceliens ont sur ce forum!

Florent

16 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 avril 2012 à 16:26
La ca marche par contre ca sert a rien parceque forcement aucune données ne reste dans la listbox.

Il n'y a pas de conservation de valeurs possibles une fois déchargé un userform.
Ta listbox étant liée, doivent forcément "vivre" ensemble (et non séparément) :
- tant la source des données (la feuille du rowsource)
que
- le userform

Si tu fermes le fichier contenant le rowsource, tu ne peux que provoquer une erreur !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
25 avril 2012 à 17:39
Bonjour,
Quelle est la ligne qui bloque ?

Pour ce qui est de ta listbox (puisque dans ton titre) :
Je ne vois aucune erreur.
Je suppose toutefois que :
- la feuille active est bien celle contenant la plage B2:J22
- la listbox est bien sur un userform


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013
26 avril 2012 à 10:27
Bonjour ucfoutu,

Merci de t'interresser a mon pb:

lorsque j'ouvre la feuille ou se trouve les données il me semble bine qu'elle passe active:
Workbooks.Open PathFeuil

en tous cas je n'ai pas d'erreur sur les données presente dans ma listBox.

En faite a la premiere execution (1er appuis sur le bouton) je n'ai pas d'erreur. Mais dès que je selectionne une ligne dans ma textBox, je ne peux plus rien faire: il me met l'erreur :
"Mémoire insuffisante pour cette opération"

Quand je dit que je ne peux plus rien faire, j'ai plusieurs onglet dans mon userform et lorsque je selectionne une ligne je ne peux meme plus changer d'onglet, et si je réappuis sur le bonton pour charger les données il me jete a la ligne :
Me.ListBox1.Clear 'avec une unspecified error...

Merci d'avance.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 avril 2012 à 10:32
Mais dès que je selectionne une ligne dans ma textBox ....

Que vient faire une textbox là-dedans ?
Explique !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PacifiqueW Messages postés 10 Date d'inscription mardi 24 avril 2012 Statut Membre Dernière intervention 3 mai 2012
26 avril 2012 à 10:40
Bonjour FloVba, uffoutu,

Ne faudrait-il pas vider ta variable wbCible aprés usage avec un Set wbCible = Nothing ? Car n'étant pas déclarer dans ta procédure, j'en déduis que tu l'as déclaré publiquement, elle n'est donc pas détruite automatiquement à la fin de ta procédure. Ton problème de mémoire peut provenir de là.
PacifiqueW

Heureux les pauvres en esprit, car le royaume de la Paix est à eux.
0
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013
26 avril 2012 à 10:54
Lorsque j'enleve le
Me.listbox.clear
qui me fait une erreur, si je souhaite regarder d'autre data il me met une autre erreur:
"could not set the RowSource proprety, mémoire insuffisante pour cette opération."

Je pense que le pb vient de la mais je n'y arrive pas, il me met toujours l'erreur memoire des que je veux retoucher au RowSource.
0
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013
26 avril 2012 à 10:56
Que vient faire une textbox là-dedans ?
Explique !


Hop désoler une erreur s'est glisser rien a voir avec ma textbox je voulais dire listbox

Bonjour PacifiqueW,

je test ca tout de suite!

merci
0
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013
26 avril 2012 à 11:21
Ce n'est pas la solution. Je pense que l'erreur vient du faite que je remet le meme rowsource plusieurs fois de suite mais si je fait un truc dans le genre:

 If Me.DataView.RowSource = "" Then
            .RowSource = "B2:J19"
        End If

ca ne fait plus l'erreur (forcement on rechange pas les propriétés) mais par contre plus moyen de l'acualiser...

quelqun sait pourquoi le .clear ne marche pas chez moi?


merci d'avance
0
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013
26 avril 2012 à 11:28
Je vous met mon code si vous vous sentez inspirés

Private Sub ChargerData_Click()
'réinitialiser la listbox
'Me.DataView.Clear ' ne fonctionne pas : crée une erreur au 2eme appuis sur le bouton

'endroit ou chercher les datas
PathFeuil = ThisWorkbook.Path & "\DataFours\F" & Me.TextBox2.Value & "DataSheet.xls"
' verifier que les données existent
    If Dir(PathFeuil, vbNormal) = "" Then
        MsgBox "Les données n'existent pas", vbExclamation, "Données introuvables"
        Exit Sub
    Else
'ouvre le wb contenant les datas
        Workbooks.Open PathFeuil
        
        Set wbCible = GetObject(PathFeuil)
        wbCible.Sheets("Data").Activate
' definit les datas pour la listbox (= DataView)
        With Me.DataView
        'If Me.DataView.RowSource = "" Then ' si je le met: n'actualise plus la listbox et toujours erreur quand je clique sur ma listbox
            .RowSource = "B2:J19"
        'End If
            .ListIndex = 0
        End With
'ferme le wb
        ActiveWorkbook.Close False
    End If

    Set wbCible = Nothing
        
End Sub
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 avril 2012 à 11:34
Le clear ne saurait s'appliquer, par définition, à un contrôle "lié" !
Ce n'est pas la listbox, dont il faut effacer le contenu, mais en modifier la source ou délier puis relier.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
4u4me4us Messages postés 780 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
26 avril 2012 à 11:50
Peut être que je suis à coté de la plaque.

Le problème ne peut-il pas être le fait que le cellule "B2:J22" ne sont pas remplies sur toutes les feuilles?

Si tu changes la plage par B2:B3 le problème est-il tjs là?

Je voudrais te/vous rappeler que je suis conscient de peut-être être à coté de la plaque. Donc faute avouée, faute à moitié pardonnée
0
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013
26 avril 2012 à 12:33
Le clear ne saurait s'appliquer, par définition, à un contrôle "lié" !
Ce n'est pas la listbox, dont il faut effacer le contenu, mais en modifier la source ou délier puis relier.

Ca c'est la classe!!
Au début jme suis dit: "mais il parle chinois celui la??"
et en relisant 2, 3 fois je pense que j'ai a peu près compris.
En gros, lorsque j'attribus le .RowSource a ma feuille, je lie la listbox a ma feuille.
Et si je veux changer les valeurs présentent dans ma listbox, il faut que je la délie de la 1er feuille et que je la relie a une autre feuille, c'est bien ca??

heu... on fait comment ca?? x)

Sinon pour répondre a 4u4me4us, la listbox affiche les données meme si les cellules sont vide, si il y a des trous dans ton tableau elle affichera pareil: des trous.
Je ne pense pas que réduire la plage de données change quoique ce soit.

Merci à vous deux pour les idées.
Je cherche de mon coté comment lié et délié une listbox (meme si je pensais que le .clear réglait pas mal de soucis XD)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 avril 2012 à 14:27
où est le problème ?
Petite expérience :
With Me.ListBox1
     .RowSource = "A1:B2"
     .ColumnCount = 2
      .ListIndex = 0
   End With
   MsgBox ListBox1.ListCount
   With Me.ListBox1
       .RowSource = ""
       .ColumnCount = 1
   End With
   MsgBox ListBox1.ListCount
   With Me.ListBox1
       .RowSource = "A5:c6"
       .ColumnCount = 3
       .ListIndex = 0
   End With
  MsgBox ListBox1.ListCount

Il est par ailleurs clair que tu auras un problème si le nombre d'articles est plus grand que la limite d'un entier, que la listbox soit ou non liée.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013
26 avril 2012 à 15:49
Effectivement, d'après microsoft, pour effacer une listbox non liée il faut utiliser
Me.listbox1.RowSource = ""

et ton code fonctionne parfaitement.

Ok maintenant je vous expose plus précisement mon problème:(non pas qu'avant je voulais pas mais je le découvre au fil du temps)

Grace à vos idées j'ai fait plusieurs essais et voila ce qui en ressort:

Si:
- J'ouvre le fichier de data,
- Je remplis ma listbox avec un rowsource
- Je ferme mon fichier
La j'ai le temps de regarder mes données
- Je fais un Me.listbox1.RowSource "" ou la meme procédure mais avec un autre fichier > Erreur mémoire

Par contre si je fais:
- J'ouvre le fichier de data,
- Je remplis ma listbox avec un rowsource
- Je fais un Me.listbox1.RowSource = ""
- Je ferme mon fichier

La ca marche par contre ca sert a rien parceque forcement aucune données ne reste dans la listbox.


...Help!
0
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013
26 avril 2012 à 17:06
Ya pas une solution?? genre connection ADO ou quand on copie une cellule dans un autre fichier il propose de copier le liens des cellules (automatique update of link)

A la limite il faudrait qu'à chaque fois que le fichier "source" soit ouvert il actualise toutes les données (si ya 100 fichiers dans lesquels il va chercher ses données sa peut etre long )

Dans ce cas, les données les plus recentes seraient dans le fichiers sources, et le .RowSource utiliserait les données situées dans le même classeur que la listBox. CQFD?

Est ce que ca pose un pb si plusieurs personnes utilisent ce fichier?
Il est ouvert sur un pc, un autre pc l'ouvre (donc en écriture) est ce qu'il va actualiser les données avec les fichiers annexes?

dsl si ce n'est pas très clair j'écrit en meme temps que je réfléchit.
0
FloVba Messages postés 27 Date d'inscription jeudi 19 avril 2012 Statut Membre Dernière intervention 8 août 2013
26 avril 2012 à 18:30
Voila je suis partit sur une autre piste: aller chercher les data de la feuille cible, les copier dans mon classeur source et utiliser ma listBox uniquement avec le RowSource ciblé sur mon classeur source!

Voila mon code si ca interresse du monde.

Par contre je ne sais pas encore si l'utilisation de plusieurs personne en meme temps ne fait pas plein d'erreur de partout...
je test demain.

Private Sub ChargerData_Click()
'réinitialiser la listbox
Me.DataView.RowSource = ""
Set MyBook = GetObject(ThisWorkbook.Path & "" & ThisWorkbook.Name)
'endroit ou chercher les datas
PathFeuil = ThisWorkbook.Path & "\DataFours\F" & Me.TextBox2.Value & "DataSheet.xls"
' verifier que les données existent
    If Dir(PathFeuil, vbNormal) = "" Then
        MsgBox "Les données n'existent pas, ", vbExclamation, "Données introuvables"
        Exit Sub
    Else
'ouvre le wb contenant les datas
        Workbooks.Open PathFeuil
        
        Set wbCible = GetObject(PathFeuil)
        wbCible.Sheets("Data").Activate
        Range("B2:N19").Select
        Selection.Copy
        MyBook.Sheets("Temporaire").Activate
        Range("B2").Select
        ActiveSheet.Paste
' definit les datas pour la listbox (= DataView)
        With Me.DataView
               .RowSource = "Nitrure!B2:J19"
               .ListIndex = 0
        End With
'permet de vider le presspapier
       Application.CutCopyMode = False
'ferme le wb
        wbCible.Close False
    End If

    Set wbCible = Nothing
        
End Sub


merci pour l'aide je vous tiens au jus pour la compatibilité a plusieurs.

Flo
0
Rejoignez-nous