XL 2010 VBA contrôle cohérence données < exit sub

spike29

XLDnaute Occasionnel
Bonjour,

Débutant en VBA je bloque sur une partie de mon code consistant à faire cesser la macro si certaines conditions ne sont pas respectées.

J’ai un tableau ou des données doivent être saisies dans différentes colonnes.

Dès lors qu’une série de 6 chiffres chiffres apparaît en colonne M, il faut aussitôt que l’utilisateur saisisse des informations pour les colonnes I,J,K et L de la même ligne.

Si ça n’est pas le cas je souhaite bloquer le reste de ma macro (exit sub) et faire apparaître un MsgBox invitant l’utilisateur à procéder aux saisies nécessaires.



Un début de code qui ne fonctionne pas chez moi, ça me met, la méthode Range de l'objet a échoué.



VB:
For y = 28 To Range("M" & Rows.Count).End(xlUp).Row



If IsNumeric(Range("M" & y).Value) And Len(Range("M" & y).Value) = 6 And (Range("I:L" & y).Value) = "" Then _



MsgBox "vous avez oublié une saisie", vbCritical



Exit Sub



Next



Merci d’avance pour votre aide et bonne fin de journée.

Cdt,
 
Solution
Ah oui, tu avais dû l'évoquer à moment donné mais j'ai zappé.
Il suffit de modifier l'ordre des opérations.

Un pb ?
Je suis resté sur le tableau I28:M74 mais tu l'as divisé en 2 tableaux ?!?
Je ne sais pas ce que tu fabriques... Si c'est vraiment 2, il va falloir adapter.
eric

EDIT : ajout surlignage des cellules en anomalie

Iznogood1

XLDnaute Impliqué
Bonjour,

mets le exit sub dans ton if :
VB:
If IsNumeric(Range("M" & y).Value) And Len(Range("M" & y).Value) = 6 And (Range("I:L" & y).Value) = "" Then
    MsgBox "vous avez oublié une saisie", vbCritical
    Exit Sub
End If

(n'oublie pas de supprimer "_" au bout de la ligne if)
 

spike29

XLDnaute Occasionnel
Bonsoir Iznogood,

Merci pour ton aide. Malheureusement j'ai toujours le même message d'erreur :

" La méthode range de l'objet global a échoué".

Le code que j'utilise.

J'ai bien déclarer y comme une variable integer.

VB:
Dim y As Integer

For y = 28 To Range("M" & Rows.Count).End(xlUp).Row

If IsNumeric(Range("M" & y).Value) And Len(Range("M" & y).Value) = 6 And (Range("I:L" & y).Value) = "" Then
    MsgBox "vous avez oublié une saisie", vbCritical
    Exit Sub
End If

Next

L'erreur se situe sur la ligne du IF.

Je ne vous transfert pas mon fichier car il est truffé de données sensibles.

Merci d'avance pour votre aide.

Bonne fin de journée
 

eriiic

XLDnaute Barbatruc
Bonjour à tous,

2 fautes ici :
VB:
(Range("I:L" & y).Value) = ""
- le range doit être "I" & y & ":L" & y)
- un range de plusieurs cellules ne peut être = ""
il faut compter les valeurs dans la plage avec Application.CountA(ta_plage) (alpha ou numériques), ou Count (numériques uniquement)
eric

PS : une suggestion. Plutôt que de quitter tu pourrais afficher un userform non modal qui permet à l'utilisateur d'éditer la feuille.
Avec un bouton pour dire 'Corrigé', un autre pour pouvoir abandonner.
Il faut tester en boucle pour t'assurer qu'il a bien tout rempli
 
Dernière édition:

spike29

XLDnaute Occasionnel
Bonsoir Eriiic,

Merci pour ton retour.
Etant relativement débutant en VBA je suis pas certain de comprendre.

De quel manière faudrait-il transformer mon code pour que cela fonctionne ?

Je précise que le type de données de doivent contenir les cellule I à L sont des heures au format hh:mm.
L'idée est de s'assurer également que l'utilisateur saisisse bien des heures dans ces colonnes lorsque nécessaire et non des chiffres aux hasard.

VB:
Sub contrôle()

Dim y As Integer


For y = 28 To Range("M" & Rows.Count).End(xlUp).Row

'
If IsNumeric(Range("M" & y).Value) And Len(Range("M" & y).Value) = 6 And (Range("I" & y & ":L" & y).Value) = "" Then
    MsgBox "vous avez oublié une saisie", vbCritical
    Exit Sub
End If


Next


End Sub

En PJ un fichier exemple pour faciliter la compréhension.

Merci d'avance pour vos réponses et bonne fin de journée

Cdt,
 

Pièces jointes

  • TEST1 (1).xlsm
    17.4 KB · Affichages: 23

spike29

XLDnaute Occasionnel
Bonjour,

En M, il s'agit bien d'une saisie et non d'une formule.

Les heures saisies doivent être comprises entre 00:00 et 23:59.

le format : hh:mm

Bonne idée pour le userform mais pour le type de fichier ça serait de la surqualité :)

Je préfère rester plus basique.

Merci d'avance pour ton aide

Bonne journée

Cdt,
 

eriiic

XLDnaute Barbatruc
Dans ce cas pas besoin de vba, des validations de données sont suffisantes.
A noter que les nombres décimaux <1 (représentation des heures sous excel) sont acceptés, c'est le format de cellule qui fait l'affichage en 10:10
eric
 

Pièces jointes

  • test1.xlsm
    66.8 KB · Affichages: 2

spike29

XLDnaute Occasionnel
Bonsoir Eric et merci pour ton retour,

Seul hic de fonctionner comme cela, c'est que ça n'empêche pas l'utilisateur de déclencher la macro et ainsi d'envoyer des données erronées (en effet ma macro déclenche l'envoi d'un mail avec les données présentes dans la Feuil de calcul).


C'est pour cela que je souhaite avoir directement cela intégré dans mon code VBA (dans l'esprit de celui que j'ai proposé bien qu'il ne soit pas fonctionnel).

Merci d'avance pour ton coup de pouce :)

Bonne fin de journée
 

eriiic

XLDnaute Barbatruc
Je ne vois pas le rapport entre le contrôle et la possibilité d'envoyer un mail (?!?)
L'un n'empêche pas l'autre, que le contrôle soit fait par les fonctionnalités d'excel ou plus tard dans la macro.
Si ça peut être fait facilement sur la feuille je ne vois pas l'intérêt de le différer. C'est plus ergonomique de bloquer une saisie incorrecte que de dire plus tard "tu t'es gouré quelque part".
Maintenant si tu veux panacher ou tout faire en macro tu peux, c'est toi le chef...
 

spike29

XLDnaute Occasionnel
Bonsoir eriiiic,

Dans le fonctionnement de ma macro et surtout l'utilisation qui est fait du fichier je préfère que ce contrôle soit intégré à la macro.
Je ne me perdrai pas dans de longues explications, mais j'ai d'autres fichiers du même type ou cette fois ci mon code fournis lors de mon premier message fonctionne parfaitement pour contrôler la saisie dans une cellule spécifique.
Ce que je n'arrive pas et dont j'aurai besoin c'est de l'adapter pour contrôler un groupe de cellule via une boucle For très certainement.

Merci pour ta compréhension

Bonne fin de journée
 

spike29

XLDnaute Occasionnel
Bonjour,

De une il n'y aura jamais 40 MsgBox car les oublis sont heureusement assez rares.
Et comme je te l'expliquais ta méthode de passer directement par un contrôle des cellules me paraît trop invasive. Car a chaque fois que l'on va faire une saisie dans la colonne M ça va systématiquement "polluer" l'utilisateur en lui rappelant qu'il doit saisir des données dans les colonnes I,J,K,L correspondantes.

Je sais comment fonctionne mon fichier et j'ai bien étudié le besoin.

De plus, et comme je te l'ai expliqué cette méthode n'empêche pas l'utilisateur de faire abstraction du message qu'Excel lui remonte et de déclencher la macro (qui je rappel brièvement son fonctionnement, envoi une copie de la Feuil par mail à une liste de diffusion définie et tout cela en un clic....).
Le risque d'envoyer des données erronées n'est donc pas totalement bloqué.

D'où ma demande...

C'est un fonctionnement que j'ai mis en place dans d'autres fichiers et qui au vu de leurs utilisation (élément que tu n'as pas en ta possession) est largement adapté.

N'ayant pas le dit fichier entre tes mains et ne connaissant pas la globalité de son fonctionnement je trouve dommage d'avoir ta réaction sur un forum d'entre aide justement.

Merci quand même d'avoir prêté attention à mon sujet et bonne journée

Cdt,
 

eriiic

XLDnaute Barbatruc
Bonjour,

Comprend que parfois on estime nécessaire de partager son expérience et avoir des réticences sur certains choix.
Comme tu dis avoir bien analysé et pesé le pour et le contre, je ne peux que te croire.
A tester :
VB:
Sub contrôle()
    Dim datas, lig As Long, col As Long
    Dim anoH As Long, anoNbr As Long, msg As String
    datas = Worksheets("Rapport").[I28:L74].Value
    For col = 1 To UBound(datas, 2)
        For lig = 1 To UBound(datas, 1)
            If datas(lig, col) = "" Then
                anoH = anoH + 1
            ElseIf IsNumeric(datas(lig, col)) Then
                If datas(lig, col) < 0 Or datas(lig, col) >= 1 Then anoH = anoH + 1
            Else
                anoH = anoH + 1
            End If
        Next lig
    Next col
    datas = Worksheets("Rapport").[M28:M74].Value
    For lig = 1 To UBound(datas)
        If IsNumeric(datas(lig, 1)) Then
            If datas(lig, 1) < 100000 Or datas(lig, 1) > 999999 Then anoNbr = anoNbr + 1
        Else
            anoNbr = anoNbr + 1
        End If
    Next lig
    If anoH Then msg = anoH & " anomalies de saisie heures"
    If anoNbr Then msg = msg & vbLf & anoNbr & " anomalies de saisie nombres"
    If msg <> "" Then MsgBox msg: Exit Sub
    ' suite du code
    ' ...
End Sub
Je fais quand même un rapport global que l'utilisateur n'ait pas à relancer x fois pour découvrir toutes les erreurs.
eric
 

spike29

XLDnaute Occasionnel
Bonsoir Eric,

Merci pour ton code et de ton partage d'expérience. Je suis complètement de ton avis et nous sommes ici avant tout pour partager 🙂

Très bonne idée pour le rapport global, j'adhère à 100%.

Le code semble fonctionner chez moi, seule problématique il part du principe que l'ensemble des cellules de I28 à L74 doivent avoir des valeurs, ce qui dans mon cas est vrai que si et seulement si il y a une valeur présente dans la colonne M de la ligne concernée.

Je te transmet un fichier exemple reprenant avec détail le besoin. Il comprend également une partie de mon code.
Il facilitera certainement la compréhension du besoin.

Merci d'avance et bonne fin de journée.
 

Pièces jointes

  • TEST1 (1).xlsm
    24.3 KB · Affichages: 3

Statistiques des forums

Discussions
312 198
Messages
2 086 136
Membres
103 129
dernier inscrit
Atruc81500