MSGBOX combiner les résultats de for each
Bonjour à tous, la solution est certainement évidente, mais à cette heure j'ai du mal.
Je teste si les valeurs d'une plage sont d'une certaine couleur, et si c'est oui je met la valeur dans une msgbox (avec une autre de la même ligne en colonne B).
Tout cela fonctionne bien, mais j'aimerais avoir tous les résultats de chaque msgbox, qui est le résultat de "for each", dans une seule, est ce possible?
Avec i = i+1? mais je ne reussi pas à le placer correctement. voici le code qui fonctionne mais répète les msgbox:
Private Sub Image1_Click()
Dim resu
' Definition dernière ligne
Dim derniereLigne, SN, col As Long
derniereLigne = Range("AD" & Rows.Count).End(xlUp).Row 'n° de la dernière ligne non vide de la colonne B
' Definition plage commentaires non vides
Dim plagestructure As Range
Set plagestructure = ActiveSheet.Range("AD4", "AD" & derniereLigne)
' Pour chaque cellules présentes dans la plage
For Each cell In plagestructure
If cell.Font.Color = 255 Then
col = cell.Row
SN = Range("B" & col).Value
resu = "Il y a des structures à commander:" & (SN) & " " & "n° " & cell.Value
MsgBox resu
End If
Next
End SubBonjour,
Tout d'abord quelques questions sur ton programme parce qu'il n'est pas clair...
derniereLigne = Range("AD" & Rows.Count).End(xlUp).Row 'n° de la dernière ligne non vide de la colonne B
Tu dis que tu vas chercher la dernière ligne non vide de la colonne B, alors que tu renseignes la colonne AD, c'est normal?
col = cell.Row
la variable col qui se traduit colonne contient la ligne de la cellule, c'est normal?
Pour ton soucis le mieux serait pour moi de faire ça :
For Each cell In plagestructure
If cell.Font.Color = 255 Then
lig = cell.Row
if SN = "" then
SN = Range("B" & col).Value & " n° " & cell.Value
else
SN = SN & chr(10) & SN = Range("B" & col).Value & " n° " & cell.Value
end if
end if
next cell
if SN = "" then
msgbox("Il n'y a pas de structure à commander.")
else
msgbox("Il y a des structures à commander:" & chr(10) & SN)
end if
end SubBonjour,
Teste comme ceci
Private Sub Image1_Click()
Dim resu
' Definition dernière ligne
Dim derniereLigne, SN, col As Long
derniereLigne = Range("AD" & Rows.Count).End(xlUp).Row 'n° de la dernière ligne non vide de la colonne B
' Definition plage commentaires non vides
Dim plagestructure As Range
Set plagestructure = ActiveSheet.Range("AD4", "AD" & derniereLigne)
' Pour chaque cellules présentes dans la plage
For Each cell In plagestructure
If cell.Font.Color = 255 Then
col = cell.Row
SN = Range("B" & col).Value
resu = resu & "Il y a des structures à commander:" & (SN) & " " & "n° " & cell.Value & Chr(10)
End If
Next
MsgBox resu
End SubBonjour,
Teste comme ceci
Private Sub Image1_Click() Dim resu ' Definition dernière ligne Dim derniereLigne, SN, col As Long derniereLigne = Range("AD" & Rows.Count).End(xlUp).Row 'n° de la dernière ligne non vide de la colonne B ' Definition plage commentaires non vides Dim plagestructure As Range Set plagestructure = ActiveSheet.Range("AD4", "AD" & derniereLigne) ' Pour chaque cellules présentes dans la plage For Each cell In plagestructure If cell.Font.Color = 255 Then col = cell.Row SN = Range("B" & col).Value resu = resu & "Il y a des structures à commander:" & (SN) & " " & "n° " & cell.Value & Chr(10) End If Next MsgBox resu End Sub
Bonjour M12, seul inconvénient de la solution :
ça va te faire le résultat :
Il y a des structures à commander: SN1 n° cell.Value
Il y a des structures à commander: SN2 n° cell.Value
Il y a des structures à commander: SN3 n° cell.Value
[...]
Car tu répètes le texte "Il y a des structures à commander:" dans ta boucle
Pour ne pas le répéter tu peux modifier un tout petit peu le code en sortant ce texte pour le mettre en resultat final :
msgbox("Il y a des structures à commander:" & resu)
Bonjour,
Avant de faire une proposition, quelques remarques sur ton code :
Dim derniereLigne, SN, col As Long
'équivaut à :
Dim derniereLigne As Variant, SN As Variant, col As Long
'Pour déclarer tout en type "Long" :
Dim derniereLigne As Long, SN As Long, col As Long" " & "n° "
'équivaut à :
" n° "Aussi, le nombre de cellules dans la plage étant déterminé, j'ai préféré une boucle "Next" classique, ce qui t'évite de récupérer l'indice de ligne (étonnant d'ailleurs d'utiliser une variable "Col" pour un indice de ligne !).
Voilà ma proposition :
Private Sub Test()
Dim resu As String, DerLig As Long, Lig As Long
resu = "Structures à commander :"
With Sheets("MaFeuille") 'Toute instruction débutant par "." se rattache à cette objet (à adapter à la feuille d'intérêt)
'Definition dernière ligne
DerLig = .Range("AD" & .Rows.Count).End(xlUp).Row 'n° de la dernière ligne non vide de la colonne AD
'Pour chaque cellules présente dans la plage
For Lig = 4 To DerLig
If .Range("AD" & Lig).Font.Color = 255 Then resu = resu & Chr(10) & .Range("B" & Lig).Value & " n° " & .Range("AD" & Lig).Value
Next Lig
'Renvoi du résultat
If Not resu = "Structures à commander :" Then MsgBox resu
End With
End SubUn grand merci à tous ! Oui en effet la variable col, j'ai mal choisi le nom ! Et je me suis mélangé les pinceaux en renseignant les commentaires
Résultat d'écriture de code à 6h du mat sans avoir pris son café de starter...
Je vous remercie pour toutes les remarques car en effet je me complique la vie ou oublie certaines choses, j'en découvre grâce à vous !
L'énorme avantage est que je comprend mes erreurs et en plus je vois plusieurs façon de faire, pour tout dire je serais peut être arrivé à la première solution, mais celle de Pedro ne m'aurait pas traversé l'esprit.
Ce forum est genial ! Merci à tous !
Edit : le code fonctionne à la perfection sur mon excel 2013, mais plante sur la ligne avec :
DerLig = .Range("AD" & .Rows.Count).End(xlUp).Row 'n° de la dernière ligne non vide de la colonne ADSur un pc utilisateur avec excel 2010...je trouve ça plutôt bizar, ce genre de chose vous arrive souvent?
RE-EDIT : Problème réglé : excel2010 n'aime pas sheets et prefere worksheets, tout simplement !