Affichage multiple dans un MsgBox

Résolu
bassmart Messages postés 281 Date d'inscription   Statut Membre Dernière intervention   -  
bassmart Messages postés 281 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous!

J'ai créer un code qui fait certaine validation sur la date et me renvoie un message à chaque fois qu'il trouve une correspondance au test. J'ai réussi à faire afficher mes résultats dans un MsgBox mais il m'affiche tout le temps le premier résultats seul dans un MsgBox pour ensuite me mettre tout les résultats dans un autres MsgBox.

Voici mon code:

Private Sub Worksheet_Activate()

Dim cell As Variant
Dim Msg As String, Msg2 As String

For Each cell In Range("B10:D10")
    If cell.Value + 365 < Range("B12") Or cell.Value + 365 = Range("B12") Then
    c = cell.Column
    l = cell.Row - 6
    Msg = Msg & "Appareil à Calibrer: " & Cells(l, c).Value & Chr(10)
    cell.Interior.ColorIndex = 3
    MsgBox Msg, vbCritical, "Attention!!!"
    
    ElseIf cell.Value < Range("B12") - 305 Then
    c = cell.Column
    l = cell.Row - 6
    Msg2 = Msg2 & "Calibration de l'appareil " & Cells(l, c).Value & " à planifier prochainement!" & Chr(10)
    cell.Interior.ColorIndex = 6
    MsgBox Msg2, vbExclamation, "Calibration arrive à échéance!"

    ElseIf cell.Value > Range("B12") - 305 Then
    c = cell.Column
    l = cell.Row - 6
    cell.Interior.ColorIndex = 2
    End If
    
Next

End Sub



J'ai besoin d'un petit coup de main sur celui-là!

Merci!

1 réponse

PlacageGranby Messages postés 393 Date d'inscription   Statut Membre Dernière intervention   26
 
Bonjour,

Je te recommende fortement une trace pas à pas lors de l'exécution de ta macro.
Dans la marge de gauche, tu clique pour mettre un point d'arrêt.
(préférablement sur ton premier if).
Ensuite tu lances la macro et tu fais F8 à répétition et tu regardes ce que Excel fait et comment il calcule chacune de tes conditions.

C'est peut-être moi qui est parano de nature, mais je ne fais pas confiance à Excel pour la priorité des opérateurs.
Exemple : cell.Value + 365 < Range("B12")
Il compare 365 avec B12, ou il va additionner avant ?
Je préfère mettre des parenthèses personnellement.
Encore la, si Excel ne calcule pas comme tu avais prévu, c'est avec une trace pas à pas qu'on s'en rend compte.
La trace pas à pas est ton meilleur outil de débuggage.

Selon ma compréhension, tu veux accumuler l'information dans les variable msg et msg2 et seulement à la fin, afficher deux msgbox.

Dans ton code, les msgbox sont a l'intérieur de ton For each, donc pour chaque cellule, un MSG est affiché.
Et si For Each parcours 1000 cellules, tu devrais avoir 1000 msgbox toujours de plus en plus gros car la variable msg se concatène à elle même pour chaque cellule.

Private Sub Worksheet_Activate()

Dim cell As Variant
Dim Msg As String, Msg2 As String

'Initialisation
Msg = ""
Msg2 = ""


For Each cell In Range("B10:D10")
    'Assigner les variable
    c = cell.Column
    l = cell.Row - 6

    'Validation du contenu de cell
    If ((cell.Value + 365) < Range("B12")) Or ((cell.Value + 365) = Range("B12")) Then
        Msg = Msg & "Appareil à Calibrer: " & Cells(l, c).Value & Chr(10)
        cell.Interior.ColorIndex = 3
    ElseIf (cell.Value < (Range("B12") - 305) Then
        Msg2 = Msg2 & "Calibration de l'appareil " & Cells(l, c).Value & " à planifier prochainement!" & Chr(10)
        cell.Interior.ColorIndex = 6
    ElseIf cell.Value > (Range("B12") - 305) Then
        cell.Interior.ColorIndex = 2
    End If  
Next

'Affichage des msgbox
MsgBox Msg, vbCritical, "Attention!!!"
MsgBox Msg2, vbExclamation, "Calibration arrive à échéance!"

End Sub
0
bassmart Messages postés 281 Date d'inscription   Statut Membre Dernière intervention   1
 
Bonjour PlacageGranby!

Merci pour ton aide, ton code fonctionne très bien! J'ai utilisé la trace pas à pas mais pas tout au long de mon code. Jusqu'à là, ça fonctionnais bien , je commence à me débrouiller un peu en vba, mais encore beaucoup de croûte à manger!

Merci pour les conseils!
0
bassmart Messages postés 281 Date d'inscription   Statut Membre Dernière intervention   1 > bassmart Messages postés 281 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour à tous!

J'ai apporté une petite amélioration à mon code. Lorsqu'il n'y avais aucunes données qui correspondaient à mes 2 premières conditions, les MsgBox s'affichaient quand même.

J'ai donc ajouté, une fonction "if". Voici:

Private Sub Worksheet_Activate()

Dim cell As Variant
Dim Msg As String, Msg2 As String

'Initialisation
Msg = ""
Msg2 = ""


For Each cell In Range("B10:D10")
    'Assigner les variable
    c = cell.Column
    l = cell.Row - 6

    'Validation du contenu de cell
    If ((cell.Value + 365) < Range("B12")) Or ((cell.Value + 365) = Range("B12")) Then
        Msg = Msg & "Appareil à Calibrer: " & Cells(l, c).Value & Chr(10)
        cell.Interior.ColorIndex = 3
    ElseIf (cell.Value < (Range("B12") - 305)) Then
        Msg2 = Msg2 & "Calibration de l'appareil " & Cells(l, c).Value & " à planifier prochainement!" & Chr(10)
        cell.Interior.ColorIndex = 6
    ElseIf cell.Value > (Range("B12") - 305) Then
        cell.Interior.ColorIndex = 2
    End If
Next

'Affichage des msgbox
If Msg <> "" Then
MsgBox Msg, vbCritical, "Attention!!!"
End If
If Msg2 <> "" Then
MsgBox Msg2, vbExclamation, "Calibration arrive à échéance!"
End If
End Sub
0