Contrôle de colonne au lieu de cellule par cellule

Arnaud dit Citro

XLDnaute Junior
Bonjour à tous,

Sur l'une de mes feuilles, je souhaite contrôler que si les cellules de la colonne A à partir de A4 sont différentes de "" et que celles correspondantes de la colonne J à partir de J4 sont différentes de "Inexistant", cela lance un userform sinon un message d'erreur.

Dans cet optique, j'ai créé un code :
VB:
Sub Inv_Cde_Barre()

Dim cola As Range
Dim colj As Range

Sheets("Stock").Select

Set cola = Range("A4:A15")

For Each colj In cola
    If colj.Value <> "" Then
        If colj.Offset(0, 9).Value <> "Inexistant" Then 'userform10.show
        MsgBox "Ok"
        Else: MsgBox "Certains codes sont inexistants."
        End If
    End If
    
Next colj


End Sub

Pour le moment, j'ai demandé cela sur la plage A4:A15 et j'ai mis en stand by le lancement de l'userform (remplacé par un message ok).

Le problème vient que le contrôle s'effectue cellule par cellule, et donc un message Ok ou d'erreur à chaque cellule contrôlée. Or je voudrais que cela se fasse en un coup : cela contrôle toutes les plages, si c'est bon ok sinon erreur.

Une petite idée serait la bienvenue.

Bonne journée

Arnaud
 

pierrejean

XLDnaute Barbatruc
Bonjour Arnaud

A tester:
VB:
For Each colj In cola
    If colj.Value <> "" Then
        If colj.Offset(0, 9).Value <> "Inexistant" Then 'userform10.show
            Avertissement = True
        End If
    End If
Next colj
If Avertissement Then
    MsgBox "Ok"
        Else: MsgBox "Certains codes sont inexistants."
End If
 

Arnaud dit Citro

XLDnaute Junior
Bonjour Pierre Jean,

Merci de ta réponse.

J'ai fait un essai, cela ne contrôle pas toute la plage. Je crois qu'il ne contrôle que la 1ère cellule (je ne suis pas sur de cela du tout). Lorsque je met le code que j'avais fait, il me trouve bien des cellules en erreur.

Arnaud
 

pierrejean

XLDnaute Barbatruc
Re

Effectivement je n'avais pas testé
Toutes mes excuses

VB:
Sub Inv_Cde_Barre_b()

Dim cola As Range
Dim colj As Range

Sheets("Stock").Select

Set cola = Range("A4:A15")

For Each colj In cola
    If colj.Value <> "" Then
        If colj.Offset(0, 9).Value = "Inexistant" Then 'userform10.show
          Avertissement = True
        End If
    End If
    
Next colj
If Avertissement Then
    MsgBox "Certains codes sont inexistants."
  Else
   MsgBox "Ok"
End If
End Sub
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonsoir,

Test sans boucle:

VB:
Sub Inv_Cde_Barre_b()
    Dim cnt As Integer

    cnt = Application.CountIf(Sheets("Stock").Range("A4:A15"), "Inexistant")
    If cnt > 0 Then
        MsgBox "vous avez " & cnt & " code(s) manquant(s)"
    End If
End Sub

A bientôt
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

En faisant un IMMENSE effort de réflexion .....
VB:
Sub Inv_Cde_Barre_b()
    Dim cnt As Integer
    With Sheets("Stock")
    cnt = Application.CountIfs(.Range("A4:A15"), "><", .Range("J4:J15"), "Inexistant")
    End With
    If cnt > 0 Then
        MsgBox "vous avez " & cnt & " code(s) manquant(s)"
    End If
End Sub

Bonne journée
 

Arnaud dit Citro

XLDnaute Junior
Bonjour Roblochon,

J'ai testé en l'adaptant au nombre de lignes qui seront utilisées , il doit y avoir un petit défaut de comparaison, il trouve 948 manquants alors qu'au pire il en manque 150 (et au mieux 130).

Du coup, j'ai essayé d'adapter le code de Pierre Jean en faisant la comparaison de la colonne A avec la J :

VB:
Sub Inv_Cde_Barre_b()

Dim cnt As Integer
Dim cola As Range
Dim colj As Range

Sheets("Stock").Select

Set cola = Range("A4:A961")

For Each colj In cola
    If colj.Value <> "" Then
        If colj.Offset(0, 9).Value = "Inexistant" Then
        With Sheets("Stock")
        cnt = Application.CountIfs(colj.Offset(0, 9), "Inexistant")
        End With
        End If
    End If
Next colj
    If cnt > 0 Then
        MsgBox "vous avez " & cnt & " code(s) manquant(s)"
    End If
End Sub

Mais là, il n'en compte qu'un... je pense qu'il s'arrête de compter dès le premier "Inexistant" trouvé.

C'est dans ces moments là que je me dis que je suis une grosse bille en VBA..... :(
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Sur la base du classeur du post #12 ceci donne 142.
VB:
Sub Inv_Cde_Barre_b()
    Dim cnt As Integer
    With Sheets("Stock")
    cnt = Application.CountIfs(.Range("A4:A961"), ">0", .Range("J4:J961"), "Inexistant")
    End With
    If cnt > 0 Then
        MsgBox "vous avez " & cnt & " code(s) manquant(s)"
    End If
End Sub

Application.Countifs est l'équivalent VBA de Somme.Si.Ens

A bientôt
 

Hasco

XLDnaute Barbatruc
Repose en paix
RE,

Mille excuses, c'est Nb.Si.Ens et non somme.si.ens comme je l'ai dit précédement

Pour la prochaine question, n'hésitez pas à joindre un fichier exemple, nous irons plus directement au but.

Bon fin de matinée.
 

Discussions similaires

Statistiques des forums

Discussions
312 112
Messages
2 085 411
Membres
102 885
dernier inscrit
AISSOU