XL 2016 If et Else dans boucle For et Next ERREUR

Victor42

XLDnaute Nouveau
Bonjour,
Je suis débutant en vba et je cherche à réaliser un test de condition, j'explique brièvement la partie ou j'ai besoin de votre aide:
Si NumLot.value est égale à une des cellules de la plage alors le background de Numlot devient rouge et un Msgbox apparaît, si non Numlot background devient vert et le label "verif" apparaît.
Mon problème c'est que j'ai beau écrire correctement tout ceci je fais toujours une erreur, il y a également une boucle For et Next, et je ne sais pas si c'est sa qui cause mon souci car la comparaison de numlot avec les cellules de la plage se fait dans le For et Next. La comparaison marche mais je ne sais pas pourquoi le msgbox apparaît quand c'est pas bon et vérif aussi...
Voici la partie de mon code qui me pose soucis:
VB:
Private Sub Doublon_Click()
Dim plage As Range
Dim cel
Dim a As String, b As Byte
Set plage = Range("A2:A500")
For Each cel In plage
   If cel.Value = NumLot.Value Then
   MsgBox "Cette OF à déja été contrôlé" & vbCrLf & "Changer d'OF"
   NumLot.BackColor = RGB(255, 0, 0)
   Else
   NumLot.BackColor = RGB(100, 255, 100)
   Verif.Visible = True
   End If
   Next cel
End Sub

Pourriez-vous m'expliquer en détail chaque étape de votre correction pour que je ne refasse plus cette erreur svp, je vous remercie par avance de votre contribution.
 

youky(BJ)

XLDnaute Barbatruc
Bienvenu Victor,
La boucle et le If sont corrects...
Je suppose que NumLot est un textbox et un textbox renvoie du texte même si c'est des chiffres.
Il faut donc convertir ce texte.
Voici une méthode simple si pas de décimale, remplace NumLot.value par Val(NumLot)
Si décimale Cdbl(NumLot) ici il faut gérer les erreurs si NumLot="" ou ne peut être converti.
Bruno
 

Victor42

XLDnaute Nouveau
Merci de ta réponse j'ai donc modifié en ceci (ajout de quelque fonction visible au passage):
VB:
Private Sub Doublon_Click()
Dim plage As Range
Dim cel
Dim a As String, b As Byte
Set plage = Range("A2:A500")
For Each cel In plage
  If cel.Value = Val(NumLot) Then
  MsgBox "Cette OF à déja été contrôlé" & vbCrLf & "Changer d'OF"
  NumLot.BackColor = RGB(255, 0, 0)
  Else
  NumLot.BackColor = RGB(100, 255, 100)
  Verif.Visible = True
  End If
  Next cel
End Sub
Le problème maintenant peut importe condition rempli ou non verif apparaît. En échangeant les effets du if et du else c'est exactement pareil mais un msgBox qui apparait à l'infini..
Je ne comprend plus rien :/

En gros mon If et mon else ne marche plus et la comparaison ne fait plus la différence entre condition rempli et non :/
 

youky(BJ)

XLDnaute Barbatruc
Bonjour tous,
En effet c'est mieux d'éviter Cjoint, ici il y a tout ce qu'il faut pour mettre un fichier.
dans le fichier on ne peut pas ouvrir l'userform j'ai fait comme j'ai compris
Voici pour ta macro
VB:
Private Sub Doublon_Click()
Dim lig
NumLot.BackColor = RGB(100, 255, 100)
   Verif.Visible = True
lig = Application.Match(NumLot, [A1:A500], 0)
If IsNumeric(lig) Then
MsgBox "Cette OF à déja été contrôlé" & vbCrLf & "Changer d'OF"
NumLot.BackColor = RGB(255, 0, 0)
End If
End Sub
Bruno
 

vgendron

XLDnaute Barbatruc
Bon.. déjà. le Lot Produit n'est pas un nombre. puisqu'il y a des lettres..
ensuite.. dans l'exemple fourni. il n'y a PAS de doublons.. donc forcément.. le résultat ne peut etre QUE OK

j'ai donc ajouté un doublon
et bien sur.. je suppose que tu saisis sans activer les majuscules..
donc.. f n'est pas égal à F

essaie ce code
VB:
Private Sub Doublon_Click()
Dim plage As Range
Dim cel
Dim a As String, b As Byte
Set plage = Range("A2:A500")
For Each cel In plage
    If cel.Value =ucase( NumLot )Then
        MsgBox "Cette OF à déja été contrôlé" & vbCrLf & "Changer d'OF"
        NumLot.BackColor = RGB(255, 0, 0)
        Exit Sub
    End If
Next cel
NumLot.BackColor = RGB(100, 255, 100)
Verif.Visible = True
End Sub
 

vgendron

XLDnaute Barbatruc
VB:
Private Sub Doublon_Click()
Dim plage As Range
Dim cel
Dim a As String, b As Byte
Set plage = Range("A2:A500") 'à revoir....voir proposition après
For Each cel In plage 'pour chaque cellule de la plage
   If cel.Value =ucase( NumLot )Then 'si la cellule contient le textbox Numlot MIS en MAJUSCULE
        MsgBox "Cette OF à déja été contrôlé" & vbCrLf & "Changer d'OF" 'messsage
        NumLot.BackColor = RGB(255, 0, 0) 'tu mets en rouge
       Exit Sub 'et tu quittes la macro.. pas la peine d'aller plus loin puisque tu as déjà trouvé un doublon
   End If
Next cel
NumLot.BackColor = RGB(100, 255, 100) 'si tu arrives ici.. c'est que tu as parcourur TOUTE la plage SANS avoir trouvé de doublon
Verif.Visible = True 'tu peux donc afficher le Vérif
End Sub

pour trouve la fin de ton tableau : ce que tu fais dans un autre code
VB:
'Recherche Fin Tableau OF
For J = 2 To 800
        If Cells(J, 1) = "Total Conforme" Then
            v_DerniereLigne = J - 1
            Exit For
        End If
    Next

peut etre remplacé par
VB:
'Recherche Fin Tableau OF
    With Sheets("Feuil1")
        v_DerniereLigne = .Range("A" & .Rows.Count).End(xlUp).Row - 4 '-4 pour les lignes de total
    End With
 

Victor42

XLDnaute Nouveau
Voici le code complet qui fonctionne si jamais quelqu'un souhaite la même chose que moi (Obligation remplissage, 10 caractères obligatoire avec msgbox contenant le nombre de caractère actuel, recherche de doublons si oui changer si non affichage du reste du formulaire)
VB:
Private Sub Doublon_Click()
Dim plage As Range
Dim cel
Dim a As String, b As Byte
If NumLot = "" Then
    MsgBox "Veuillez renseigner le numéro de lot du produit"
ElseIf Len(NumLot) <> 10 Then
    MsgBox "Le numéro de lot que vous avez rentré fait " & Len(NumLot) & " caractères." & Chr(13) & _
            "Il en faut 10 !" & vbCrLf & "Exemple : 17F4613800" & Chr(13) & "Recommencer...", 16
    Exit Sub
Else
End If
Set plage = Range("A2:A" & v_DerniereLigne)
For Each cel In plage
     If cel.Value = UCase(NumLot) Then
        NumLot.BackColor = RGB(255, 0, 0)
        MsgBox "Cette OF à déja été contrôlé" & vbCrLf & "Changer d'OF"
         Exit Sub
     End If
Next cel
NumLot.BackColor = RGB(100, 255, 100)
Verif.Visible = True
MultiPage1.Visible = True
CommandButton1.Visible = True
Confirmer.Visible = True
Conformite.Visible = True
Label10.Visible = True
Label11.Visible = True
Label12.Visible = True
Label13.Visible = True
Label14.Visible = True
End Sub

Merci beaucoup à tous pour votre participation
 

youky(BJ)

XLDnaute Barbatruc
Re,
J'ai procédé de cette façon pour éviter les boucles
Pour le verif il suffit d'ajouter une ligne de code
VB:
Private Sub Doublon_Click()
Dim lig
NumLot.BackColor = RGB(100, 255, 100)
   Verif.Visible = True
lig = Application.Match(NumLot, [A1:A500], 0)
If IsNumeric(lig) Then
MsgBox "Cette OF à déja été contrôlé" & vbCrLf & "Changer d'OF"
NumLot.BackColor = RGB(255, 0, 0)
Verif.Visible = False
End If
End Sub
Bruno
 

Discussions similaires

Réponses
2
Affichages
140

Statistiques des forums

Discussions
312 108
Messages
2 085 361
Membres
102 874
dernier inscrit
Petro2611