wiidle
Messages postés16Date d'inscriptionmardi 3 mai 2011StatutMembreDernière intervention 5 octobre 2011
-
12 mai 2011 à 09:03
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 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
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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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