[Catégorie modifiée VB6 -> VBA] VBA problème affichage UserFrom

Résolu
wiidle Messages postés 16 Date d'inscription mardi 3 mai 2011 Statut Membre Dernière intervention 5 octobre 2011 - 12 mai 2011 à 09:03
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 12 mai 2011 à 11:37
Bonjour à tous,

J'ai un petit soucis sur VBA. J'ai créé une macro qui fait appel à un Userform. Hier, j'ai eu un bug d'excel (le bug classique, la macro à plantée, j'ai redémarré excel).

Depuis, lorsque je lance ma macro, un problème survient lors de l'ouverture de l'userform et fait planter la macro.

ci dessous mes codes.
*******************************************
CODE D'OUVERTURE DE LA MACRO (dans un module)
********************************************

Sub UserFormContacts()

MaBoite.Show 'C'EST ICI QUE LA LIGNE JAUNE APPARAIT SANS MESSAGE D'ERREUR !!

End Sub


*************************
CODE DU USERFORM
*************************

Private Sub CommandButton_Valider_Click()

Dim listdest, listcop As String
Dim i As Integer
Dim selection, selection2, selection3 As Boolean

nb = ListBox1.ListCount - 1



For i = 0 To nb

'on contrôle qu'un destinataire à bien été sélectionné
If ListBox1.Selected(i) = True Then
selection = True
End If

'on contrôle qu'un copie à bien été sélectionné
If ListBox2.Selected(i) = True Then
selection2 = True
End If

'on contrôle qu'un mail à bien été sélectionné
If ListBox3.Selected(i) = True Then
selection3 = True
End If

Next i

'on réalise l'action si pas sélectionné
If selection = False Then
MsgBox "Veuillez sélectionner un destinataire !", vbExclamation, "Destinataire manquant"
Exit Sub
End If

If selection2 = False Then
Select Case MsgBox("Vous n'avez pas sélectionné de copie (CC)" & Chr(10) & _
"Voulez-vous continuer ?", vbYesNo + vbQuestion, "Personne en copie")
Case vbNo
Exit Sub
End Select
End If

If selection3 = False Then
MsgBox "Veuillez sélectionner un mail !", vbExclamation, "Faites une sélection"
Exit Sub
End If

'*********************************************************
'on contrôle qu'un copie est bien sélectionné
'If ListBox2.Selected(i) = False Then
'Select Case MsgBox("Vous n'avez pas sélectionné de copie (CC)" & Chr(10) & _
'"Voulez-vous continuer ?", vbYesNo + vbQuestion, "Personne en copie")
'Case vbNo
'Exit Sub
'End Select
'End If

'Next j
'*********************************************************

For i = 0 To nb

If ListBox1.Selected(i) Then
'apparement la 1ere colonne est 0
'd'ou column(2,i) pour chercher la valeur de la 3eme colonne
listdest = listdest & ";" & ListBox1.Column(2, i)
End If

If ListBox2.Selected(i) Then
listcop = listcop & ";" & ListBox2.Column(2, i)
End If

Next i

'on retire le premier ; de la ligne si il contient qqchose
If listdest <> "" Then
listdest = Right(listdest, Len(listdest) - 1)
End If

If listcop <> "" Then
listcop = Right(listcop, Len(listcop) - 1)
End If

nb2 = ListBox3.ListCount - 1
For i = 0 To nb2
If ListBox3.Selected(i) Then
Sheets("feuil1").Range("c" & i + 4) = listdest
Sheets("feuil1").Range("d" & i + 4) = listcop
End If

'*********************************************************
'on contrôle qu'un mail à bien été selectionné
'If ListBox3.Selected(i) = False Then
'MsgBox "Veuillez sélectionner un mail !", vbCritical, "Faites une sélection"
'Exit Sub
'End If
'*********************************************************

Next i

'*********************************************************
'on choisit notre cellule de destination
'on définit la cellule en fonction de la selection
'de la listbox 3
'r = ListBox3.ListIndex
'Sheets("feuil1").Range("c" & r + 4) = listdest
'Sheets("feuil1").Range("d" & r + 4) = listcop

'si on choisit une cellule précise on fait simplement
'Sheets("feuil1").Range("c4") = listdest
'Sheets("feuil1").Range("d4") = listcop

'on peut effacer les données des liste box comme ci-dessous
'MaBoite.ListBox1.Clear
'*********************************************************


Unload MaBoite
End Sub


Private Sub CommandButton1_Click()


Private Sub CommandButton_Annuler_Click()
Unload MaBoite
End Sub


Private Sub ToggleButton1_Click()

Dim i, nb As Integer
nb = ListBox1.ListCount - 1

For i = 0 To nb 'a la place de nb on pourrait mettre directement ListBox1.ListCount - 1
If ToggleButton1 = True Then
ListBox1.Selected(i) = True
Else: ListBox1.Selected(i) = False
End If
Next i

End Sub

Private Sub ToggleButton2_Click()

Dim i, nb As Integer
nb = ListBox2.ListCount - 1

For i = 0 To nb 'a la place de nb on pourrait mettre directement ListBox2.ListCount - 1
If ToggleButton2 = True Then
ListBox2.Selected(i) = True
Else: ListBox2.Selected(i) = False
End If
Next i

End Sub


Private Sub userform_initialize()

Dim TabTemp, donnee As Variant
Dim x, y As Integer

y = Range("A4").End(xlDown).Row
donnee = Range("A4:E" & y).Value

ListBox3.ColumnCount = 5
ListBox3.List() = donnee

x = Sheets("mail").Cells(2, 1).End(xlDown).Row

'Chargement d'une plage de cellules dans la variable TabTemp
'si on est sur l'autre feuille
'TabTemp = Range("A1:C" & x).Value

TabTemp = Sheets("mail").Range("A2:C" & x).Value

ListBox1.ColumnCount = 3
ListBox1.List() = TabTemp

ListBox2.ColumnCount = 3
ListBox2.List() = TabTemp

End Sub

Merci à tous pour vos réponses.

/!\ rrrrrrrrrrrrr /!\

1 réponse

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
12 mai 2011 à 11:37
Salut

Prends l'habitude de bien choisir la catégorie de ta question, stp.

Tout ce code ... penses-tu que qqun ait le courage de le lire ?
Autre habitude à prendre : Utilise le coloriage syntaxique (3eme icone à droite) pour coller du code = plus facile à lire.

MaBoite.Show
Comment est déclaré 'MaBoite' ?
On suppose qu'il s'agit d'une forme ?

Utilisation propre des formes (instanciation) :
Dim maForme As MaBoite
Set maForme = New MaBoite
maForme.Show
Set maForme = Nothing

Lorsqu'une erreur de compilation arrive dans le code d'une forme ET que cette erreur n'est pas gérée, l'erreur est signalée sur la ligne d'appel, ici, le .Show
Il te faut demander une compilation de ton programme (menu Débogage) pour découvrir et corriger le problème. C'est une habitude à prendre avant chaque lancement.

Toujours parmi les règles de base :
Dim selection, selection2, selection3 As Boolean
ne signifie pas que chaque variable sera de type Boolean. Seule 'selection3' le sera, les deux premières seront de type Variant.
Ça marchera quand même, mais tu obliges le compilateur à faire les conversions à ta place et, un jour ou l'autre, tu auras un bug que tu auras du mal à trouver.
Il faut déclarer chaque type sur chaque variable
Dim selection As Boolean, selection2 As Boolean, selection3 As Boolean


Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
[img]http://allproj
3
Rejoignez-nous