Erreur d'execution 13 sur une ListBox [Résolu]

- - Dernière réponse : ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
- 23 avril 2013 à 08:30
Bonjour à tous,

Je suis actuellement en train de travailler sur un programme permettant d'afficher tous les appareils disponibles de mon entreprise ( répertoriés sur une feuille excel) dans une Listbox, d'en ajouter et même d'en supprimer.

Voici donc mon problème : Tout interfonctionne jusqu'au moment ou je souhaite supprimer un de mes appareils répertoriés. A ce moment la l'erreur d’exécution 13 bloque l’exécution de ma macro.

Je ne penses pas avoir fais d'erreur majeur et j'ai bien vérifié mes sources d'aide.

En espérant que vous pourrez me dépanner. Je vous remercie d'avance.



Voici mes Codes macros. ( Pour certaines raisons je ne peux pas tout vous mettre. Merci de votre compréhension)




Private Sub B_supprimer_Click() ' supression et mise à jour de la liste supprimée
Dim rep, memo$
If ListBox1.ListIndex = -1 Then Exit Sub
rep = MsgBox("Attention Voulez vous rééllement supprimer " & "" & T2, vbYesNo, "Suppression de ligne")
If rep = vbNo Then Exit Sub
memo = T1


Feuil1.Rows(ListBox1.List(ListBox1.ListIndex, 4)).Delete ( le probleme est ici d'après Excel)


Unload Resultat
Resultat.T1 = memo
Resultat.Show

ActiveWorkbook.Save
End Sub



Private Sub ListBox1_Click() ' affichage sur la liste box des caractéristiques matérielles
Dim i&, lig&
If ListBox1.ListIndex = -1 Then Exit Sub
For i = 1 To 4 ' il y a 4 champs donc i de 1 a 4, donc 4 colones
memoire = 1
Controls("T" & i + 1) = ListBox1.List(ListBox1.ListIndex, i - 1)

'boucle selectionnant les éléments des colonnes

Next i
B_supprimer.Visible = True
memoire = 0
End Sub




Private Sub T1_Change() ' fonction de chercher et d'affichage lors d'une saisie de texte

Dim i&, fin&, y&, a&, mem As Boolean
Application.ScreenUpdating = 0
If memoire Then Exit Sub
If T1 "" Then ListBox1.Clear: T2 "": T3 = "": T4 = "": T5 = "": B_supprimer.Visible = 0: Exit Sub
ListBox1.Clear

With Feuil1
y = 1
fin = .Range("A" & Rows.Count).End(xlUp).Row
aa = .Range("A2:F" & fin)
End With
For i = 1 To UBound(aa)
aa(i, 5) = i + 1
Next i
For i = 1 To UBound(aa)
For a = 1 To UBound(aa, 2)
If aa(i, a) Like "*" & T1 & "*" Then aa(i, 6) "oui": y y + 1: Exit For
Next a
Next i
If y = 1 Then Exit Sub
If y = 2 Then
For i = 1 To UBound(aa)
If aa(i, 6) = "oui" Then


[............]


With ListBox1
.ColumnCount = 5
.ColumnWidths = "80;200;50;80;0"
If mem Then Exit Sub
.List = bb
End With
End Sub



Merci pour votre attention
Afficher la suite 

Votre réponse

20 réponses

Meilleure réponse
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
3
Merci
Hé bien moi, je vais t'en parler, de cette fameuse erreur 13, et très crument :;
1) elle pourrait surgir si Listbox1.listindex était = -1 (car alors incompatibilité de type)
Or, tu as mis cette dans ton code :
If ListBox1.ListIndex = -1 Then Exit Sub

et donc : si tu ne l'as pas commenté (donc inhibée), tu ne passes pas par la ligne dénoncée !
2) elle pourrait également surgir (toujours pour les même raisons d'incompatibilité de type) si le contenu de la cinquième colonne de la ligne sélectionnée contenait un NULL, etc ... (donc pas une donnée du type attendu pour un N° de rang), hein ...
Dans tous les autres cas : ce serait l'erreur 1004 et non l'erreur 13
J'observe par Et c'est donc (j'insiste réinsiste et reréinsiste) en amont qu'il te faut chercher la faille.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.

Merci ucfoutu 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
3
Merci
Et (je viens de le contrôler) tu aurais la même erreur 13 si, dans la 5ème colonne de la plage qui a conduit (je le devine) au tableau bb, tu avais des lignes en erreur (à la suite, par exemple (mais pas uniquement) de l'application de formules excel.
Alors : on y vient, à ce bb ? Cela nous permettra de savoir quelle plage de ta feuille il va falloir regarder, hein ...


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.

Merci ucfoutu 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
3
Merci
Bon...
Je voudrais maintenant te montrer ce que peut être la différence entre :
- intervenir sur un truc mal ficelé (écrit par un autre)
et
- tout jeter à la poubelle et redévelopper proprement
Je ne vais pas réécrire toute ton appli. Je vais juste t'inviter à faire ce petit test, sur un classeur tout neuf
Un userfgorm avec un bouton remplir et un bouton rajouter et une listbox ListBox1
Et ce code tout bête, qui ne passe pas par un tableau bb (et je sais à ce propos - c'est mon petit doigt qui me l'a dit - qu'il s'appelait en fait aa à un moment donné, hein ...). Tableau construit sur une colonne de plus que nécessaire, laquelle a été modifiée ensuite pour y mettre ... des N°s de lignes (en commettant en plus une erreur), puis cachée (comme le chat avec sa crotte), pour "faire "pro" !
Allons allons ! ==>>
ce code, donc :
Dim coucou As Range
Private Sub remplir_Click()
  Set coucou Range("B3:D10") '>> ou n'importe quelle plage de ton choix
  With ListBox1
    .ColumnCount = coucou.Columns.Count
    .RowSource = "Feuil1!" & coucou.Address 
  End With
End Sub
Private Sub supprimer_Click()
  If ListBox1.ListIndex >= 0 Then Feuil1.Rows(ListBox1.ListIndex + coucou.Row).Delete
End Sub

Comme tu le verras : ni calculs d'apothicaire hasardeux, ni le moindre risque d'erreur puisque je ne vais pas aller chercher un "N° construit" dans une colonne ajoutée et cachée !!!
Et cerise sur le gâteau : la suppression se fait des deux côtés en même temps (sur la feuille et dans la listbox).
Voilà de quoi réfléchir sur l'opportunité et le caractère sain de jeter les usines à gaz et de se mettre à du sérieux.
Bonne étude

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.

Merci ucfoutu 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Bonjour,
La ligne en cause génèrera une erreur si :
- ta listbox contient moins de 5 colonnes
- sa colonne 4 (d'index 5) n'a pas été remplie
- sa colonne 4 ne contient pas un rang Excel valide

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
et cette ligne :
.List = bb

est incompréhensible. On ne sait même pas ce qu'est bb !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
0
Merci
Merci pour ta réponse rapide. Je viens de lire tes message donc je n'ai pas eu le temps de modifier mon code avec tes solution.

Concernant le .List = bb : J'ai repris les bases de code qu'un autre avait déjà commencé ( oui ce n'est pas facile ni très recommandé) mais on me l'a demandé. Cette ligne fait partie de la fonction de recherche de mes équipements sur la Listbox, qui fonctionne très bien au passage, et je ne suis pas sur qu'elle intervient dans ma macro de suppression car je veux supprimer la ligne du listbox et de ma feuille excel. J'ai donc écourté les lignes de programme dans le message pour ne pas surcharger visuellement. Cependant je peux l'envoyer en complet si nécessaire.

Petite précision : Ma fonction de suppression a déjà fonctionné correctement, c'est par la suite qu'elle a rencontré le problème d'exécution 13. Si ça peux aider
Commenter la réponse de BioGim
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Dernière intervention
24 juillet 2013
0
Merci
Salut
En outre il est d'usage que les lignes ou les colonnes commencent à 0 en informatique pour de nombreux contrôles !
en outre tu parles des colonnes 1 à 4 en début de code !

With ListBox1
.ColumnCount = 5 


et la cela fait 5 colonnes non

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
Commenter la réponse de cs_Galain
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Permets-moi de bondir lorsque je lis des choses telles celle-ci :
J'ai repris les bases de code qu'un autre avait déjà commencé ( oui ce n'est pas facile ni très recommandé) mais on me l'a demandé

qui démontrent à mes yeux une seule chose : tu interviens sans rien y connaître du tout !
Ou alors : explique-moi comment moi, qui ne vois pourtant rien du code écrit par "un autre", suis capable de "deviner" que, quelque part dans ce code écrit par "un autre", existe une ligne qui passe dans un tableau dynamique nommé bb les valeurs d'une plage ?
Je te laisse tout net là où tu es et mérites de rester, car tout le reste sera de même "nature", une "nature" que je n'accepte en aucun cas de la part d'un développeur (ce que tu es censé être, puisque tu as accepté de prendre en charge la suite d'un développeur).
M'enfin !!!!!!
Bonne chance.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
0
Merci
Ucfoutu,

Si je n'avais pas été au pied du mur je n'aurais jamais posté un message ici. J'ai précisé que je ne mettais pas tout le code pour raisons ergonomique, la place de cette ligne à une logique dans le code, seulement je peux comprendre que cela t'a échappé car je ne la jugeais pas nécessaire pour comprendre une erreur de sélection ambigüe.

Rien n’empêche de ne pas savoir quelque chose sans pour autant rien n'y connaitre
Ce que moi je n'accepte en aucun cas, c'est que tu te permette de critiquer mon post ainsi que mes compétences , tu es sans nul doute un très bon programmeur ( sans aucune ironie de ma part ) mais en aucun cas cela te donne le droit de me juger ainsi que mon travail. Je suis venu ici pour demander de l'aide pour un problème que je ne connais pas et en toute bonne fois, en l'exposant à des personnes qui souhaitaient m'aider. Si cela ne t’intéresse pas et que tu n'as pas envie envie de m'aider je l'accepte, mais ça s'arrête la.



Galain,

Je vais essayer de voir en changeant mes colonnes.
Merci de l'aide
Commenter la réponse de BioGim
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Désolé, mais tout ton blabla tombe à l'eau dès lors que je t'ai posé une question pourtant claire et que tu n'as même pas su (car le pire est que je n'envisage même pas que tu n'aies pas voulu) y répondre.
Tu es dans un brouillard et tu demandes qu'on t'en sorte sans même pouvoir définir l'endroit où tu es !
Je te souhaite bonne chance dans tes "approches".


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
0
Merci
Parler sans savoir est peu être considéré comme un tord, mais affirmer sans connaitre l'est tout autant. On clôturera sur ces mots
Commenter la réponse de BioGim
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
h bon ?
On va (tu vas le constater) vite en finir !
Je te propose ceci, qui va te démontrer que ton problème n'est pas là où tu le penses. Et nous allons le faire ainsi ===>>
Nous allons remplir une listbox de données diverses. En sa cinquième colonne, nous allons, pour chaque ligne de cette listbox, mettre un chiffre.
Puis nous allons appliquer ton code, tel qu'il est là :
If rep = vbNo Then Exit Sub
memo = T1
Feuil1.Rows(ListBox1.List(ListBox1.ListIndex, 4)).Delete 


C'est ce qui s'appelle savoir identifier et isoler le problème
Tu verras que tout fonctionne fort bien ! Te restera alors à admettre que tu as un fantôme dans ton brouillard et que tu ne sais pas où ! OK ?
Bref ...



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Et tu n'aurais même pas le réflexe de donner à cette cinquième colonne une largeur (autre que 0) pour pouvoir y lire ce qu'elle contient quand ça "plante" .... (car là est le début de la clarté, avant de crier "bobo"). Et si ce que je pense/devine, va bien falloir que tu cherches ailleurs dans ton brouillard pourquoi tu y as cela en colonne 5 (d'index 4, donc)... hein ...


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
0
Merci
Je pense que je n'ai pas été compris. Je suis venu ici car je ne comprends pas le code d'erreur 13 et cela me gène au moment de la suppression.
Je connais la fonction recherche F1 ainsi que l'aide intégré, et je suis assez grand pour savoir chercher sur les forum, si je demande c'est que je n'ai pas trouvé, cela ne sert donc à rien de vouloir me blâmer alors. De plus j'ai un programme imposé donc pas le choix. De plus j'ai précisé que mon programme ( code ) à déjà fonctionné tel qu'il est. Je ne demande pas une aide a rédiger mon code ( même si je suis ouvert aux remarques de modifications), ce que je demande c'est une aide pour comprendre pourquoi cela ne marche plus et que j'ai ce type d'erreur.

Ce que tu me demande de faire je l'ai déjà fait avant de poster ici. Et j'ai tout ce qui me convient. Si je demande de l'aide c'est que je ne comprends pas l'erreur. C'est tout, et je n'aimerais pas à avoir à poster des Imprime écran pour le prouver

De plus je demande pas grand chose hormis de discuter et de trouver un moyen pour régler mon problème.

( Accessoirement je ne suis plus en mesure de répondre après 16h30 jusqu'à 8h, donc si tu souhaites continuer cette conversation constructive )

Cordialement,
Commenter la réponse de BioGim
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
et en amont, c'est ta variable bb (que je devine être un tableau dynamique issu d'une plage, variable pour laquelle je t'ai demandé à deux reprises et en vain de nous dire ce qu'elle contenait; comment elle avait été déclarée et initialisée)
Voilà !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
0
Merci
Bonjour,

Et bien ce n’était pas si difficile de répondre à mon message initial et de discuter pour me diriger vers une solution.

Oui la variable bb est en association avec une variable aa ( comme de part magie). Si tu voulais voir le code complet tu avais juste à demander comme je l'ai précisé.

Si tu crois que ça m'amuse d’être obligé de reprendre les bases d'un autre tu te trompes, je préférerais recommencer. Mais ce n'est pas une option pour le moment.
De plus je suis loin d'être un pro, mais pour atteindre un niveau ( que toi même tu sembles avoir atteints) il faut faire des erreusr et apprendre de celles ci. La connaissance de la programmation n'est pas innée. C'est pour ça que des forum existes.

Merci pour les renseignements
Commenter la réponse de BioGim
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Bon. Moi, j'en ai, je pense, terminé, hein ...
Tu remplace par ce que je t'ai montré tout le saint-fruquin actuel pour remplir la listbox.
Si ainsi résolu ===>> un clic sur le tag "réponse acceptée" pour libérer ce sujet.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
0
Merci
Private Sub T1_Change() ' fonction de chercher et d'affichage lors d'une saisie de texte

Dim i&, fin&, y&, a&, mem As Boolean
Application.ScreenUpdating = 0
If memoire Then Exit Sub
If T1 "" Then ListBox1.Clear: T2 "": T3 = "": T4 = "": T5 = "": B_supprimer.Visible = 0: Exit Sub
ListBox1.Clear

With Feuil1
y = 1
fin = .Range("A" & Rows.Count).End(xlUp).Row
aa = .Range("A2:F" & fin)
End With
For i = 1 To UBound(aa)
aa(i, 5) = i + 1
Next i
For i = 1 To UBound(aa)
For a = 1 To UBound(aa, 2)
If aa(i, a) Like "*" & T1 & "*" Then aa(i, 6) "oui": y y + 1: Exit For
Next a
Next i
If y = 1 Then Exit Sub
If y = 2 Then
For i = 1 To UBound(aa)
If aa(i, 6) = "oui" Then
ListBox1.AddItem aa(i, 1)
For a = 1 To UBound(aa, 2) - 2
ListBox1.List(ListBox1.ListCount - 1, a - 1) = aa(i, a)
Controls("T" & a + 1) = aa(i, a)
Next a
mem = 1: Exit For
End If
Next i
Else
ReDim bb(y - 1, UBound(aa, 2) - 1)
y = 1
For i = 1 To UBound(aa)
If aa(i, 6) = "oui" Then
For a = 1 To UBound(aa, 2) - 1
bb(y, a) = aa(i, a)
Next a
y = y + 1
End If
Next i
End If
With ListBox1
.ColumnCount = 5
.ColumnWidths = "200;80;50;80;80"
If mem Then Exit Sub
.List = bb
End With
End Sub



Voila le développement pour le bb que j'avais de déjà programmé. ( si c'est bien ça que tu voulais )
Il n'y a qu'une seule feuille dans le document Excel.
Commenter la réponse de BioGim
0
Merci
Je te remercie ( oui je suis pas rancunier non plus ) pour l'aide apportée même si il a fallut jouter pour l'obtenir.
Commenter la réponse de BioGim
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Elle vient bien tardivement, cette réponse à une question posée jusqu'à présent en vain.
Et ce n'est donc qu'à la santé de ma boule de cristal qu'il a donc fallu m'en remettre !
Bon. Je t'ai donné une solution orthodoxe. Je m'en riens là !



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.