IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

VBA ou formule ? [XL-2000]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé Avatar de Paloma
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 228
    Par défaut VBA ou formule ?
    Bonjour à tous et à toutes,

    J'ai un souci, en fait, j'ai besoin de vérifier ce qui a été saisie dans une cellule (de la colonne 2) par un utilisateur.


    En fait, l'utilisateur ne peut saisir que 2 ou 4 chiffres mais il y a des exception, il doit aussi pouvoir si besoin ajouter une lettre en capital. De plus il peut aussi entrer un nombre avec des zéros à la fin (exemple: 3000).

    Je résume, il peut donc saisir :

    34, 000A

    2 chiffres ou 4 chiffres + 1 lettre en majuscule

    ------------------------------------------------------------
    3450, 9960A

    4 chiffres ou 4 chiffres + 1 lettre en majuscule,
    mais le quatrième chiffre peut avoir un zéro
    ------------------------------------------------------------

    7835 , 7835G

    4 chiffres ou 4 chiffres + 1 lettre en majuscule
    Pour valider la saisie à chaque entrée de l'utilisateur, j'utilise l'outil validation d'Excel.



    Comment peut-on autoriser une lettre en plus ?

    Peut-on remplacer l'outil validation par du code automatique à placer dans la feuille correspondante ?

    Merci pour votre aide.

  2. #2
    Membre éprouvé Avatar de Many31
    Profil pro
    Inscrit en
    Février 2007
    Messages
    198
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 198
    Par défaut ajout des balises de code (sélection du code + # au dessus de la fenêtre de rédaction du message)
    Je connais mal les fonctions Excel et je préfère le VBA.

    Voici les éléments de réponse en macro:

    1) utiliser l'événement Worksheet_Change
    2) Utiliser la fonction Like

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target Like "O?I" Then MsgBox "It's OK"
    End Sub
    les codes de correspondance:
    ? Tout caractère unique.
    * Aucun ou plusieurs caractères.
    # Tout chiffre unique (de 0 à 9).
    [charlist] Tout caractère unique compris dans l'argument charlist.
    [!charlist] Tout caractère unique non compris dans l'argument charlist.

    Tu peux aussi mettre une condition sur Target (Target.Row pour par exemple n'appliquer la condition que sur une ligne donnée etc.)

    Voila

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut Paloma et le forum
    Une proposition par macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Msg_Err As String
    If Target.Cells.Count <> 1 Or Intersect(Target, Columns(4)) Is Nothing Or _
        IsEmpty(Target) Then Exit Sub
    'si on modifie plus d'une cellule ou si celle-ci n'appartient pas à D, On sort
    Select Case Len(Target)
        Case 2
            If Not (Target Like "##") Then Msg_Err = "2 chiffres"
        Case 4
            If Not (Target Like "####") Then Msg_Err = "4 chiffres"
        Case 5
            If Not (Target Like "####[A-Z]") Then Msg_Err = "4 chiffres et 1 majuscule"
        Case Else
            Msg_Err = "2 chiffres,4 chiffres ou 4 chiffres et 1 majuscule"
    End Select
    If Msg_Err <> "" Then
        MsgBox Msg_Err, vbCritical + vbOKOnly, "erreur de saisie"
        Target.ClearContents
    End If
    End Sub
    Cette macro suppose que la colonne D est définie au format Texte (permettant d'avoir "0000").
    A+

  4. #4
    Membre confirmé Avatar de Paloma
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 228
    Par défaut Désolé, je me suis mal expliqué.
    Bonjour Gorfael et Many31,

    D'abord, merci à vous deux.

    Mais je me suis mal expliqué et mon 'algo' n'était pas complet.
    En fait, l'utilisateur ne doit pouvoir saisir que deux 'Digits' (chiffres au format ##) ou deux 'Digits' (chiffres au format ##) et un caractère (qui peut être un chiffre de [0-9] ou [A-H] ou [J-N] ou [P-N].

    J'ai essayé de modifire le code mais ça ne marche pas, je crois que je prend le pb à l'envers. J'y réfléchi mais si vous avez plus d'info.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Private Sub Worksheet_Change(ByVal Target As Range)
      Application.EnableEvents = False
     
    Dim Msg_Err As String
     
    If Target.Cells.Count <> 1 Or Intersect(Target, Columns(4)) Is Nothing Or _
        IsEmpty(Target) Then Exit Sub
    'If more than one cell is modified or if the cell is not in the 'D' column, go out !
    Select Case Len(Target)
        Case 2
            If Not (Target Like "##") Then Msg_Err = "2 Digits"
        Case 4
            If Not (Target Like "####") Then Msg_Err = "4 Digits"
        Case 5
            If Not (Target Like "####[0-9]") Then Msg_Err = "4 Digits and 1 Number"
            ' or
            If Not (Target Like "####[A-H]") Then Msg_Err = "4 Digits and 1 Char in upper case"
            ' or
            If Not (Target Like "####[J-N]") Then Msg_Err = "4 Digits and 1 Char in upper case"
            ' or
            If Not (Target Like "####[P-Z]") Then Msg_Err = "4 Digits and 1 Char in upper case"
        Case Else
            Msg_Err = "2 Digits,4 Digits or 4 Digits and 1 Char in upper case"
    End Select
    If Msg_Err <> "" Then
        MsgBox Msg_Err, vbCritical + vbOKOnly, "erreur de saisie"
        Target.ClearContents
    End If
     
      If Target.Column = 4 And Target.Count = 1 Then 
         Target = UCase(Target)
      End If
     
      Application.EnableEvents = True
    End Sub
    Merci à vous tous.

  5. #5
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Bonjour
    un premier souci de raisonnement
    j'entre
    1111H
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      If Not (Target Like "####[0-9]") Then Msg_Err = "4 Digits and 1 Number" 'ici j'ai un message
            ' or
            If Not (Target Like "####[A-H]") Then Msg_Err = "4 Digits and 1 Char in upper case" 'ici c'est bon
            ' or
            If Not (Target Like "####[J-N]") Then Msg_Err = "4 Digits and 1 Char in upper case"  'ici j'ai un message
            ' or
            If Not (Target Like "####[P-Z]") Then Msg_Err = "4 Digits and 1 Char in upper case"  'ici j'ai un message
    Donc dans 3 cas il y a un message Msg_Err = "4 Digits and 1 Char in upper case"

    Tes 'or ne serve a rien alors qu'il devrais être utilisé
    il faut que ca soit
    au format
    "####[P-Z]" OU "####[J-N]" OU "####[A-H] OU "####[0-9]"
    Un peu d'algèbre de boule
    non "####[0-9]" ET non "####[A-H] ET non "####[J-N]" ET non "####[P-Z]"

    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not (Target Like "####[0-9]") AND  Not (Target Like "####[A-H]") AND  Not (Target Like "####[J-N]") AND Not (Target Like "####[P-Z]") then Msg_Err = "4 Digits and 1 Char in upper case"  'ici j'ai un message
    Je n'ai pas regardais le reste mais ceci m'a violemment sauté aux yeux

  6. #6
    Membre confirmé Avatar de Paloma
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 228
    Par défaut
    Bonjour Krovax,

    Merci, je vais regarder ça.
    Mais en fait ce que j'essaye de faire, c'est que si l'utilisateur saisie autre chose, un message d'erreur doit apparaitre pour lui dire qu'il ne peut saisir que 2 digits ou 2 digits et un caractère (qui peut être un chiffre de [0-9] ou [A-H] ou [J-N] ou [P-N].

    D'ou le message d'erreur apparait s'il fait :
    - 234
    - 234566
    - 4567AA
    - 2345A2
    - A
    - 1
    - 'Blank' ...
    - A232A
    - A3456
    etc ...

    Merci pour vos lumières.
    En attendant, je regarde votre code et l'essaye tout de suite.

    modif:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    '--------------------------------------------------------------------------
    '    Automatic checks capture
    '
    '--------------------------------------------------------------------------
    Private Sub Worksheet_Change(ByVal Target As Range)
      Application.EnableEvents = False
     
    Dim Msg_Err As String
     
    If Target.Cells.Count <> 1 Or Intersect(Target, Columns(4)) Is Nothing Or _
        IsEmpty(Target) Then Exit Sub
    'If more than one cell is modified or if the cell is not in the 'D' column, go out !
    Select Case Len(Target)
        Case 2
            If Not (Target Like "##") Then Msg_Err = "2 Digits"
        Case 4
            If Not (Target Like "####") Then Msg_Err = "4 Digits"
        Case 5
            If Not (Target Like "####[0-9]") And Not (Target Like "####[A-H]") And Not (Target Like "####[J-N]") And Not (Target Like "####[P-Z]") Then Msg_Err = "4 Digits and 1 Char in upper case"    'ici j'ai un message
        Case Else
            Msg_Err = "Please enter 2 Digits or 2 Digits and 1 Char in upper case"
    End Select
    If Msg_Err <> "" Then
        MsgBox Msg_Err, vbCritical + vbOKOnly, "erreur de saisie"
        Target.ClearContents
    End If
     
      If Target.Column = 4 And Target.Count = 1 Then 
         Target = UCase(Target)
      End If
     
      Application.EnableEvents = True
    End Sub
    De plus, peut-on avoir 2 "Private Sub Worksheet_Change(ByVal Target As Range)" si je leur donne des noms différents dans la même feuille ?
    Par exemple :

    Private Sub Worksheet_A_Change(ByVal Target As Range)
    Private Sub Worksheet_B_Change(ByVal Target As Range)

  7. #7
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Je viens de remarqué un truc
    [J-N] ou [P-N].

    le premier permet J K L M N
    le deuxième P N
    je ne sais pas si c'est ce que tu veux faire

    Oui tu peut avoir
    Private Sub Worksheet_A_Change(ByVal Target As Range)
    Private Sub Worksheet_B_Change(ByVal Target As Range)
    dans la m^me feuille mais aucun ne se déclenchera
    Seul
    Private Sub Worksheet_Change(ByVal Target As Range)

    Se déclenche
    Le plus simple est de faire plusieur test sur target
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Worksheet_Change(ByVal Target As Range)
    If not intersect(Target,Range("A1:B5")) is nothing then
       Msgbox "Vous avez cliqué dans la première zone"
    elseif not intersect(Target,Range("D8:F15")) is nothing then
       Msgbox "Vous avez cliqué dans la Deuxième zone"
    elseif not intersect(Target,Range("G:G")) is nothing then
       Msgbox "Vous avez cliqué dans la Troisième zone"
    end if
    End sub
    Ce qui va te forcer a faire


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    If Target.Cells.Count = 1 AND not Intersect(Target, Columns(4)) Is Nothing AND not_
        IsEmpty(Target) Then 
    'ta macro
     
    elseif Test de ta deuxème zone then
    ta nouvelle macro
    end if

  8. #8
    Membre confirmé Avatar de Paloma
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 228
    Par défaut
    Je crois que j'ai réussi à obtenir ce que je voulais.

    Qu'en pensez-vous?
    Et noublions pas que c'est grace à vous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    '--------------------------------------------------------------------------
    '    Automatic checks capture
    '
    '--------------------------------------------------------------------------
    Private Sub Worksheet_Change(ByVal Target As Range)
      Application.EnableEvents = False
     
    Dim Msg_Err As String
     
    If Target.Cells.Count <> 1 Or Intersect(Target, Columns(4)) Is Nothing Or _
        IsEmpty(Target) Then Exit Sub
    'If more than one cell is modified or if the cell is not in the 'D' column, go out !
    Select Case Len(Target)
        Case 2
            If Not (Target Like "##") Then Msg_Err = "Please enter 2 Digits or 2 Digits and 1 Char in upper case"
        Case 4
            If Not (Target Like "####") Then Msg_Err = "Please enter 2 Digits or 2 Digits and 1 Char in upper case"
        Case 5
            If Not (Target Like "####[0-9]") And Not (Target Like "####[A-H]") And Not (Target Like "####[J-N]") And Not (Target Like "####[P-Z]") And Not (Target Like "####[a-h]") And Not (Target Like "####[j-n]") And Not (Target Like "####[p-z]") Then Msg_Err = "4 Digits and 1 Char in upper case"   'ici j'ai un message
        Case Else
            Msg_Err = "Please enter 2 Digits or 2 Digits and 1 Char in upper case"
    End Select
    If Msg_Err <> "" Then
        MsgBox Msg_Err, vbCritical + vbOKOnly, "Data : Error"
        Target.ClearContents
    End If
     
      If Target.Column = 4 And Target.Count = 1 Then 
         Target = UCase(Target)
      End If
     
      Application.EnableEvents = True
    End Sub
    Merci Krovax pour votre réponse.

    Merci encore à vous tous.

  9. #9
    Membre confirmé Avatar de Paloma
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 228
    Par défaut
    Krovax,

    Je n'arrive pas à faire fonctionner deux controles en même temps sur deux colonnes avec la méthode actuelle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    ''--------------------------------------------------------------------------
    '    Automatic checks capture
    '        Column 'D'
    '--------------------------------------------------------------------------
    Private Sub Worksheet_Change(ByVal Target As Range)
      Application.EnableEvents = False
     
    Dim Msg_Err As String
     
    If Target.Cells.Count <> 1 Or Intersect(Target, Columns(4)) Is Nothing Or _
        IsEmpty(Target) Then Exit Sub
    'If more than one cell is modified or if the cell is not in the 'D' column, go out !
    Select Case Len(Target)
        Case 2
            If Not (Target Like "##") Then Msg_Err = "Please enter 2 Digits or 2 Digits and 1 Char (except 'i' and 'o') in upper case"
        Case 4
            If Not (Target Like "####") Then Msg_Err = "Please enter 2 Digits or 2 Digits and 1 Char (except 'i' and 'o') in upper case"
        Case 5
            If Not (Target Like "####[0-9]") And Not (Target Like "####[A-H]") And Not (Target Like "####[J-N]") And Not (Target Like "####[P-Z]") And Not (Target Like "####[a-h]") And Not (Target Like "####[j-n]") And Not (Target Like "####[p-z]") Then Msg_Err = "4 Digits and 1 Char in upper case"   'ici j'ai un message
        Case Else
            Msg_Err = "Please enter 2 Digits or 2 Digits and 1 Char (except 'i' and 'o') in upper case"
    End Select
    If Msg_Err <> "" Then
        MsgBox Msg_Err, vbCritical + vbOKOnly, "Data : Error"
        Target.ClearContents
    End If
     
      If Target.Column = 4 And Target.Count = 1 Then
         Target = UCase(Target)
      End If
     
        '--------------------------------------------------------------------------
        '    Automatic checks during capture
        '        Column 'AZ'
        '--------------------------------------------------------------------------
     
          If Target.Column = 52 And Target.Count = 1 Then 'Check CA Code column
             Target = UCase(Target)
          End If
     
      Application.EnableEvents = True
    End Sub
     
    ''--------------------------------------------------------------------------
    ''    Automatic checks during capture
    ''        Column 'AZ'
    ''--------------------------------------------------------------------------
    '
    'Private Sub Worksheet_B_Change(ByVal Target As Range)
    '  Application.EnableEvents = False
    '  If Target.Column = 52 And Target.Count = 1 Then 'Check CA Code column
    '     Target = UCase(Target)
    '  End If
    '  Application.EnableEvents = True
    'End Sub
    J'ai essayé avec deux "Worksheet_Change" : Worksheet_A_Change et Worksheet_B_Change mais ça ne fonctionne pas. Puis j'ai essayé de mettre tout sous un seul "Worksheet_Change" mais le comportement semble aléatoire. Le contrôle de la colonne 'D' fonctionne mais pas sur la colonne 'AZ' et sinon, le controle ne marche pas du tout.

    Avez-vous une explication ?

    Merci d'avance.

  10. #10
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    essaye de comprendre l'exemple que je t'ai filé et ensuite de l'adapter

    La j'ai l'impression d'avoir fait un post dans le vent. Je t'ai dit de virer le exit sub, tu ne la pas fait, d'utiliser un elseif

    Ps : pour ton histoire de A et B tu ne peux pas dire que je ne t'avais pas prévenu


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Msg_Err As String
     Application.EnableEvents = False
     
     
     
    If Target.Cells.Count = 1 And Not Intersect(Target, Columns(4)) Is Nothing And Not IsEmpty(Target) Then
     
        'macro premier cas
    ElseIf Target.Column = 52 And Target.Count = 1 Then 'Check CA Code column
        'macro deuxième cas
     
    End If
      Application.EnableEvents = True
    End Sub

  11. #11
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour,
    En plus simple et en tenant compte de l'algèbre de Boole , le tout avec un seul test..
    J'ai supposer que tu voulais aussi tester la colonne 5, suffit d'adapter les nombres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        If Target.Count > 1 Or Target = "" Or Not (Not Target.Column <> 4 Or _
        Not Target.Column <> 52) Then Exit Sub
        Application.EnableEvents = False
        Select case Target.Column
        Case 4
           'Traitement colonne 4
        Case 52
           'Traitement colonne 52
        End select
     
        Application.EnableEvents = True
    A+
    Edit: ajouter Select Case

  12. #12
    Membre confirmé Avatar de Paloma
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 228
    Par défaut
    Bonjour LeForestier,

    Merci à vous deux, mais j'essaye d'abord avec l'exemple de Krovax pour essayer de comprendre mais là la macro plante. Pb de if ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    '--------------------------------------------------------------------------
    '    Automatic checks capture
    '      Column 'D'
    '--------------------------------------------------------------------------
    Private Sub Worksheet_Change(ByVal Target As Range)
      Application.EnableEvents = False
     
    Dim Msg_Err As String
     
    If Target.Cells.Count <> 1 Or Intersect(Target, Columns(4)) Is Nothing Or _
        IsEmpty(Target) Then 'Exit Sub
    'If more than one cell is modified or if the cell is not in the 'D' column, go out !
    Select Case Len(Target)
        Case 2
            If Not (Target Like "##") Then Msg_Err = _
            "Please enter 2 Digits or 2 Digits and 1 Char (except 'i' and 'o') in upper case"
        Case 4
            If Not (Target Like "####") Then Msg_Err = _
            "Please enter 2 Digits or 2 Digits and 1 Char (except 'i' and 'o') in upper case"
        Case 5
            If Not (Target Like "####[0-9]") And Not (Target Like "####[A-H]") And Not (Target Like "####[J-N]") _
            And Not (Target Like "####[P-Z]") And Not (Target Like "####[a-h]") And Not (Target Like "####[j-n]") _
            And Not (Target Like "####[p-z]") Then Msg_Err = "4 Digits and 1 Char in upper case"
        Case Else
            Msg_Err = "Please enter 2 Digits or 2 Digits and 1 Char (except 'i' and 'o') in upper case"
    End Select
     
    If Msg_Err <> "" Then
        MsgBox Msg_Err, vbCritical + vbOKOnly, "Data : Error"
        Target.ClearContents
     
     
      ElseIf Target.Column = 4 And Target.Count = 1 Then
         Target = UCase(Target)
     
            '--------------------------------------------------------------------------
            '    Automatic checks during capture
            '      Column 'AZ'
            '--------------------------------------------------------------------------
     
              ElseIf Target.Column = 52 And Target.Count = 1 Then 'Check CA Code column
                 Target = UCase(Target)
    End If
     
      Application.EnableEvents = True
    End Sub
    Ce qui est difficile à faire c'est que j'ai deux colonnes.
    Première 'D':
    Je vérifie ce qui est saisie par l'utilisateur avec les règles fournies précédemment.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    If Target.Cells.Count <> 1 Or Intersect(Target, Columns(4)) Is Nothing Or _
        IsEmpty(Target) Then 'Exit Sub
    'If more than one cell is modified or if the cell is not in the 'D' column, go out !
    Select Case Len(Target)
        Case 2
            If Not (Target Like "##") Then Msg_Err = _
            "Please enter 2 Digits or 2 Digits and 1 Char (except 'i' and 'o') in upper case"
        Case 4
            If Not (Target Like "####") Then Msg_Err = _
            "Please enter 2 Digits or 2 Digits and 1 Char (except 'i' and 'o') in upper case"
        Case 5
            If Not (Target Like "####[0-9]") And Not (Target Like "####[A-H]") And Not (Target Like "####[J-N]") _
            And Not (Target Like "####[P-Z]") And Not (Target Like "####[a-h]") And Not (Target Like "####[j-n]") _
            And Not (Target Like "####[p-z]") Then Msg_Err = "4 Digits and 1 Char in upper case"
        Case Else
            Msg_Err = "Please enter 2 Digits or 2 Digits and 1 Char (except 'i' and 'o') in upper case"
    End Select
     
    If Msg_Err <> "" Then
        MsgBox Msg_Err, vbCritical + vbOKOnly, "Data : Error"
        Target.ClearContents
    si OK, je met le tout en majuscule.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Target.Column = 4 And Target.Count = 1 Then
         Target = UCase(Target)
    Mais quand l'utilisateur édite la colonne 'AZ', je met juste le contenu en majuscule et rien d'autre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Target.Column = 52 And Target.Count = 1 Then 'Check CA Code column
                 Target = UCase(Target)
    .

    Mais avec le code complet ci-dessus, j'ai un controle de la colonne 'D' qui se fait sur la colonne 'AZ' et plus rien sur la colonne 'D'.
    J'ai vraiment raté quel que chode. Quel anne je fait là

    Qu'ai-je raté? je ne voit pas le souci. Bon d'accord je porte des lunettes mais est-ce vraiement là le pb

  13. #13
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Tu aura beau porter des lunettes tant que tu ne fera pas une belle indentation de ton code tu continuera a foncer droit dans le mur a chaque coup

    Private Sub Worksheet_Change(ByVal Target As Range)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
      Application.EnableEvents = False
     
    Dim Msg_Err As String
     
    If Target.Cells.Count <> 1 Or Intersect(Target, Columns(4)) Is Nothing Or _
        IsEmpty(Target) Then 'Exit Sub
    'If more than one cell is modified or if the cell is not in the 'D' column, go out !
        Select Case Len(Target)
            Case 2
                If Not (Target Like "##") Then Msg_Err = _
                "Please enter 2 Digits or 2 Digits and 1 Char (except 'i' and 'o') in upper case"
            Case 4
                If Not (Target Like "####") Then Msg_Err = _
                "Please enter 2 Digits or 2 Digits and 1 Char (except 'i' and 'o') in upper case"
            Case 5
                If Not (Target Like "####[0-9]") And Not (Target Like "####[A-H]") And Not (Target Like "####[J-N]") _
                And Not (Target Like "####[P-Z]") And Not (Target Like "####[a-h]") And Not (Target Like "####[j-n]") _
                And Not (Target Like "####[p-z]") Then Msg_Err = "4 Digits and 1 Char in upper case"
            Case Else
                Msg_Err = "Please enter 2 Digits or 2 Digits and 1 Char (except 'i' and 'o') in upper case"
        End Select
     
        If Msg_Err <> "" Then
            MsgBox Msg_Err, vbCritical + vbOKOnly, "Data : Error"
            Target.ClearContents
     
     
        ElseIf Target.Column = 4 And Target.Count = 1 Then
            Target = UCase(Target)
     
            '--------------------------------------------------------------------------
            '    Automatic checks during capture
            '      Column 'AZ'
            '--------------------------------------------------------------------------
     
        ElseIf Target.Column = 52 And Target.Count = 1 Then 'Check CA Code column
            Target = UCase(Target)
    End If
     
    Application.EnableEvents = True
    End Sub
    Ton premier else if est au même niveau que ton If Msg_Err <> "" Then
    tout ca parce que tu n'a pas mis de end if. Et avec l'indentation ca "saute" pratiquement aux yeux

    Edit : bon pour l'indentation qui conduit droit dans le mur il y a sur le forum un certain nombre de contre exemple tel que Laetitia qui fait de très beau code sans aucune mise en forme

  14. #14
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    J'ai pas bien compris, ton test est le même pour la colonne 4 et la colonne 52 ??
    Si oui, un seul test suffit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Count > 1 Or Target = "" Or Not (Not Target.Column <> 4 Or _
        Not Target.Column <> 52) Then Exit Sub
        Application.EnableEvents = False
     
            Select Case Len(Target)
                Case 2
                    If Not (Target Like "##") Then Msg_Err = _
                    "Please enter 2 Digits or 2 Digits and 1 Char (except 'i' and 'o') in upper case"
                Case 4
                    If Not (Target Like "####") Then Msg_Err = _
                    "Please enter 2 Digits or 2 Digits and 1 Char (except 'i' and 'o') in upper case"
                Case 5
                    If Not (Target Like "####[0-9]") And Not (Target Like "####[A-H]") And Not (Target Like "####[J-N]") _
                    And Not (Target Like "####[P-Z]") And Not (Target Like "####[a-h]") And Not (Target Like "####[j-n]") _
                    And Not (Target Like "####[p-z]") Then Msg_Err = "4 Digits and 1 Char in upper case"
                Case Else
                    Msg_Err = "Please enter 2 Digits or 2 Digits and 1 Char (except 'i' and 'o') in upper case"
            End Select
     
            If Msg_Err <> "" Then
                MsgBox Msg_Err, vbCritical + vbOKOnly, "Data : Error"
                Target.ClearContents
                Target.Select
            End If
            Application.EnableEvents = True
    End Sub
    A+

  15. #15
    Membre confirmé Avatar de Paloma
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 228
    Par défaut
    Merci Krovax,

    C'était un delete intempestif mais je pense que la suite c'est un pb perso

    Malgrès ça, je n'ai pas les contrôles aux bons endroits. Les controles semblent être inversés dans les colonnes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    '--------------------------------------------------------------------------
    '    Automatic checks capture
    '      Column 'D'
    '--------------------------------------------------------------------------
    Private Sub Worksheet_Change(ByVal Target As Range)
      Application.EnableEvents = False
     
    Dim Msg_Err As String
     
    If Target.Cells.Count <> 1 Or Intersect(Target, Columns(4)) Is Nothing Or _
        IsEmpty(Target) Then 'Exit Sub
    'If more than one cell is modified or if the cell is not in the 'D' column, go out !
    Select Case Len(Target)
        Case 2
            If Not (Target Like "##") Then Msg_Err = _
            "Please enter 2 Digits or 2 Digits and 1 Char (except 'i' and 'o') in upper case"
        Case 4
            If Not (Target Like "####") Then Msg_Err = _
            "Please enter 2 Digits or 2 Digits and 1 Char (except 'i' and 'o') in upper case"
        Case 5
            If Not (Target Like "####[0-9]") And Not (Target Like "####[A-H]") And Not (Target Like "####[J-N]") _
            And Not (Target Like "####[P-Z]") And Not (Target Like "####[a-h]") And Not (Target Like "####[j-n]") _
            And Not (Target Like "####[p-z]") Then Msg_Err = "4 Digits and 1 Char in upper case"
        Case Else
            Msg_Err = "Please enter 2 Digits or 2 Digits and 1 Char (except 'i' and 'o') in upper case"
    End Select
    If Msg_Err <> "" Then
        MsgBox Msg_Err, vbCritical + vbOKOnly, "Data : Error"
        Target.ClearContents
    End If
     
      ElseIf Target.Column = 4 And Target.Count = 1 Then
         Target = UCase(Target)
     
            '--------------------------------------------------------------------------
            '    Automatic checks during capture
            '      Column 'AZ'
            '--------------------------------------------------------------------------
     
              ElseIf Target.Column = 52 And Target.Count = 1 Then 'Check CA Code column
                 Target = UCase(Target)
    End If
     
      Application.EnableEvents = True
    End Sub
    Je m'y perd ... Au secour !

  16. #16
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Bon met une pause en début de macro (le gros point rouge quand tu clique dans la marge)
    Modifie une cellule et avance en mode pas a pas (avec la touche F8) regarde un peu ce qui se passe, prend le temps de faire plusieurs teste affiche les variable local (menue affichage) utilise des espions.... Je ne connais pas ton fichier je ne sais pas ce que tu veux faire mais la je sais que tu ne sais pas ce que tu demande a ton programme de faire

    Quand tu fait une
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if a then
    'cas1
    elseif b then
    'cas2
    elseif c then
    'cas 3
    end if
    Si a et vrai le programme ne testera JAMAIS b et c il fait le cas 1 puis va au end if
    Tu comprendra en mode pas a pas,
    Et regarde ce que te suggère Leforestier visiblement, contrairement a moi, il essaye de comprendre ce que tu veux faire et la suggestion qu'il t'a faites mérite d'être approfondi. Mais que cela ne t'empêche pas d'essayer de comprendre ce qui se passe en mode pas a pas sinon
    Enfin c'est surtout que sans cela tu risque fort de copier un code sans comprendre et revenir dans un ou deux jour avec une question similaire

  17. #17
    Membre éprouvé Avatar de Many31
    Profil pro
    Inscrit en
    Février 2007
    Messages
    198
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 198
    Par défaut
    Sinon ya ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    On Error Resume Next
    Dim form As Integer
    Application.EnableEvents = False
     
    If Target.Count > 1 Then GoTo fin
     
    Select Case Target.Column
        Case 4
            Select Case Len(Target)
                Case 0
                    form = 2
                Case 2
                    If Target Like "##" Then form = 2
                Case 3
                    If Left(Target, 2) Like "##" Then form = 1
                    If Right(Target, 1) Like "#" Then form = form + 1
                    If UCase(Right(Target, 1)) Like "[A-H]" Then form = form + 1
                    If UCase(Right(Target, 1)) Like "[J-N]" Then form = form + 1
                    If UCase(Right(Target, 1)) Like "[P-Z]" Then form = form + 1
                Case Else
                    form = 0
            End Select
        Case 52
            form = 2
        Case Else
            GoTo fin
    End Select
     
    If form < 2 Then
        MsgBox "ouuuuuahoooo tu respectes rien ma parole! T'es un ouff!"
        Target = ""
    Else
        Target = UCase(Target)
    End If
     
    fin:
    Application.EnableEvents = True
     
    End Sub
    désolé pour le message d'erreur perso... ca m'aide à me concentrer xD

    EDIT: les Exit sub quand il y a un Application.EnableEvents = False c'est à éviter

  18. #18
    Membre confirmé Avatar de Paloma
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 228
    Par défaut
    Merci Many31, Krovax et LeForestier,

    Je n'y arrive toujours pas.

    LeForestier
    En plus simple et en tenant compte de l'algèbre de Boole , le tout avec un seul test..
    J'ai supposer que tu voulais aussi tester la colonne 5, suffit d'adapter les nombres.
    Non non, c'est bien deux parties differentes.

    1. Colonne 'D', je vérifie si il y a bien 2 digits ou 2 digits plus un caractère (excepter i et o). Si c'est bon, je ne renvoie pas de message d'erreur et je passe le contenu de cette cellule en majuscule, si ce n'est pas le cas, alors je renvoie un message pour dire qu'il faut fournir une donnée au format attendu et la cellule doit être vidée.
    2. Colonne 'AZ', aucune vérification en VBA sur le contenu. La cellule a une 'validation' qui vérifie qu'il y a maximum 5 lettres. Quand une cellule est correspement rempli avec 1-5 lettres, alors la cellule est passé en majuscule.


    Je tourne en rond car une fois ça marche d'un coté, une fois de l'autre ou enfin plus nul part. J'ai fait plusieurs tests et rien pour le moment, mais je continue ... ne pas baisser les bras, ne pas baisser les bras.

  19. #19
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Est ce que tu as lancé le mode pas a pas? Tu a vus par ou passe ta macro? Tu as vu que le premier else if n'est pas testé si les like sont testé?

  20. #20
    Membre éprouvé Avatar de Many31
    Profil pro
    Inscrit en
    Février 2007
    Messages
    198
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 198
    Par défaut
    J'avoue ne pas te suivre...

    Citation Envoyé par Paloma Voir le message

    1. Colonne 'D', je vérifie si il y a bien 2 digits ou 2 digits plus un caractère (excepter i et o). Si c'est bon, je ne renvoie pas de message d'erreur et je passe le contenu de cette cellule en majuscule, si ce n'est pas le cas, alors je renvoie un message pour dire qu'il faut fournir une donnée au format attendu et la cellule doit être vidée.
    ==> Ca c'est fait. Voir le code juste au dessus

    Citation Envoyé par Paloma Voir le message

    1. Colonne 'AZ', aucune vérification en VBA sur le contenu. La cellule a une 'validation' qui vérifie qu'il y a maximum 5 lettres. Quand une cellule est correspement rempli avec 1-5 lettres, alors la cellule est passé en majuscule.
    ==> Ca c'est fait aussi puisque tu l'as intégré au cellule (tu aurais également pu le traiter par Vba en utilisant len(Target)<=5)

    Donc où est ce que ça coince et qu'est ce que tu utilises dans tous ca?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. [VBA-E] - formule matricielle
    Par jimbololo dans le forum Macros et VBA Excel
    Réponses: 37
    Dernier message: 09/06/2006, 14h27
  2. [VBA-E] Formule d'une autre page + Offset
    Par Korleone dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/04/2006, 11h10
  3. [VBA-E] Formule
    Par gojira dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 21/04/2006, 10h32
  4. [VBA-E]Formule de selection
    Par sunme dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/04/2006, 09h37
  5. [VBA/Excel] Formule via macro
    Par UNi[FR] dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 18/10/2005, 15h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo