Problème sur une boucle For Each

Fermé
Jvlien - 8 avril 2014 à 18:22
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 - 9 avril 2014 à 12:05
Bonjour,

J'ai une soucis avec une fonction VBA pour excel (ci-dessous)

Dim cellrange
Dim CellMax
Dim cellcount
Dim MaxLocal
Dim ligne
Dim Workcol
Dim Cellcount
Dim AED

Ligne = 3
WorkCol = 4
cellcount = 0
AED = 2

Do Until Rows(Ligne).Columns(1) = Empty
For Each cellrange In Range(Rows(Ligne).Columns(WorkCol), Rows(Ligne).Columns(WorkCol + 5))
' Compteur de cellule non-vide
If cellrange.Value <> Empty Then
cellcount = cellcount + 1
End If
Next cellrange
' Fin du compteur
If cellcount <> 0 Then
MaxLocal = WorksheetFunction.Max(Rows(Ligne + 2).Columns(AED), Rows(Ligne + 1).Columns(AED), Rows(Ligne).Columns(AED), Rows(Ligne - 1).Columns(AED), Rows(Ligne - 2).Columns(AED))
'Detection du maximun
For Each CellMax In Range(Rows(Ligne - 2).Columns(AED), Rows(Ligne + 2).Columns(AED))
If CellMax.Value = MaxLocal Then
MsgBox "Here your max"
CellMax.Activate
Next CellMax

Else
End If

cellcount = 0
Ligne = Ligne + 1
Loop

End Sub

En gros, dans cette fonction, j'ai une première partie qui me détecte la présence d'au moins un marqueur dans une portion de ligne; puis suite à cette détection, le repérage d'un maximun...
Or, le repérage du maximun me renvoit une erreur pour "Cellmax.value"...
Pourtant, la syntaxe de ma boucle "for each" est la même dans les deux parties, la seul différence est qu'à un moment il doit chercher sur la même ligne de différentes colonnes, et ensuite sur différentes lignes de la même colonne...
Cependant, je ne vois pas où se trouve l'erreur... des idées?

MErci d'avance !
A voir également:

1 réponse

f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 702
Modifié par f894009 le 8/04/2014 à 19:42
Bonjour,

Ai pas trouve le pourquoi, mais essayez ceci, cela evite les boucles:

Sub test()
Dim Cellmax As Variant
Dim Cellcount
Dim MaxLocal
Dim Ligne
Dim Workcol
Dim AED

Ligne = 3
Workcol = 4
Cellcount = 0
AED = 2

Do Until Rows(Ligne).Columns(1) = Empty
Cellcount = WorksheetFunction.CountA(Range(Rows(Ligne).Columns(Workcol), Rows(Ligne).Columns(Workcol + 5)))
' Fin du compteur
If Cellcount <> 0 Then
MaxLocal = WorksheetFunction.Max(Rows(Ligne + 2).Columns(AED), Rows(Ligne + 1).Columns(AED), Rows(Ligne).Columns(AED), Rows(Ligne - 1).Columns(AED), Rows(Ligne - 2).Columns(AED))
'Detection du maximun
Set Cellmax = Range(Rows(Ligne - 2).Columns(AED), Rows(Ligne + 2).Columns(AED)).Find(MaxLocal, lookat:=xlWhole)
If Not Cellmax Is Nothing Then
MsgBox "Here your max"
Cellmax.Activate
End If
End If
Ligne = Ligne + 1
Loop
End Sub
0
Merci pour cette proposition qui a d'ailleurs l'air plus "efficace" que mon idée de base!
Toutefois, je ne connais pas le code pour cette partie :
Set Cellmax = Range(Rows(Ligne - 2).Columns(AED), Rows(Ligne + 2).Columns(AED)).Find(MaxLocal, lookat:=xlWhole)
If Not Cellmax Is Nothing Then
Notamment la partie "If Not Cellmax is Nothing", Set Cellmax pour définir la case à partir d'une recherche, ça je comprend l'idée, mais pour définir l'action, pourriez-vous m'expliquer la syntaxe svp ?
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 702
Modifié par f894009 le 9/04/2014 à 12:07
Bonjour,

If Not Cellmax Is Nothing Then: c'est un test au cas ou ce que vous cherchez n'est pas dans la plage de cellules. Definir la variable en variant, si la recherche .find n'est pas ok, la variable prend la valeur nothing et si c'est ok la variable prend les caracteristiques de le cellule trouvee(valeur,adresse......).
0