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 :

[EXCEL] Validation des données saisies - nouvelle Question :-)


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 [EXCEL] Validation des données saisies - nouvelle Question :-)
    Bonjour,

    Voilà j'ai un problème assez important, j'ai un truc à gérer et je ne sais pas et comment commencer.

    Voilà, j'ai un fichier Excel qui utilise un form.
    Mon form contient notamment un bouton parcourir qui me permet de sélectionner un répertoire.
    Une fois fait, la page 2 est rempli comme suit :

    feuille (2) "WorkFile" avec en titre dans la ligne 1 :
    A = Parent Folder
    B = Full Path
    C = File Name
    D ....

    Puis un autre bouton permet d'ajouter dans une "listBox" des filtres.
    Je m'explique :

    les fichiers trouvés dans le répertoire sont du type
    M5711045500000 ....

    les filtres sont du type M571;P777
    ou le ; sépare la chaîne à chercher dans le résultat obtenu à la lecture du répertoire de la chaîne que deviendra celle qui sera copier dans une autre feuille (3) "result" de ce même classeur sous la forme P77...

    Mais voilà j'ai d'autres trucs à contrôler :
    Par exemple les filtres entrés un à un ne peuvent contenir que des lettres autorisées. exemple : M, P, Z, T ou aucune
    donc M571;B88 interdit

    mais je peux avoir 571;888 et ça doit fonctionner.
    la lettre restera donc M (pour mon cas précédent )

    puis quand les différents filtres sont ajoutés et valider (à chaque nouveau filtre), la feuille (3) est mis à jour ...
    Colonne C = liste des nouveaux noms.

    Enfin, je rentre à la maison et je rajouterais un lien vers une vidéo se sera plus explicite.

    Cordialement,
    Paloma

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Je pense que Like règlerait ton pb. Regarde dans l'aide, un peu fastidieux mais très bien expliqué. Te permet de comparer une chaîne de caractères à une liste de caractères.
    Si tu as des difficultés, tu dis, on verra ça. Mais fais-nous quelque chose
    A+

    Edit
    Je regarde si on peut faire mieux mais pour exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim ok as boolean
    For i = 1 To 4
        Ok = "M569" Like Mid("MPZT", i, 1) & "*"
        If ok then Exit for
    Next
    Et en simplifiant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ok = "M569" Like "M*" Or "M569" Like "P*" Or "M569" Like "T*" Or "M569" Like "Z*"

  3. #3
    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 ouskel'n'or
    Effectivement, j'avais vu Like et j'ai commencé par là.
    Mais bon ça n'est que le début donc je continu, on verra bien.

    Voici une ch'tite vidéo qui montre un peu ce que j'aimerais obtenir.
    http://patrick.dubernet.free.fr/perso.html

    @ plus
    Cordialement,
    Paloma

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Ta vidéo m'a refusé la lecture A pas trouvé le lecteur Y'a un blème... Chez HTML ou chez moi ?

  5. #5
    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 Pour la vidéo.
    Bonjour ouskel'n'or,

    Bonjour tout le monde ;-)

    Pour la vidéo, vu tous les formats standards qui existent, on se demande lequel est standard?

    Je suis désolé ...

    Pour moi, ça fonctionne à la maison et au boulot.
    J'utilise VLC pour toutes mes vidéos et ça fonctionne bien.

    Ce soir, j'essaierais sinon de refaire la vidéo en mpeg, mais elle sera plus lourde.

    Bon, en tout cas, je teste ce que tu m'as dit ouskel'n'or et je reviendrais.

    @ plus

    Paloma

  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 Peut être avec ça ?
    En fait, je me suis demandé si je pouvais vérifier la saisie avec un truc du genre :

    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
    Private Sub ButAdd_Click()
        strValue = InputBox("Please enter a value to consider to translate the package", "Add filter")
        If strValue = "NULL" Or strValue = "" Then
        MsgBox "You must enter a not empty value!", vbCritical, "!STOP!"
        Else
        ListBoxFilters.AddItem UCase(strValue)
        End If
        'Programs Check value entries ---------------------------------------------
     
    Dim DataString(11) As String
        Dim InString() As String
        Dim i As Integer
     
        'Remplissage du tableau qui va être testé
        DataString(0) = "R" ' AC_WBY_A300
        DataString(1) = "L" ' AC_SA_A318
        DataString(2) = "L" ' AC_SA_A319
        DataString(3) = "L" ' AC_SA_A319CJ
        DataString(4) = "L" ' AC_SA_A320
        DataString(5) = "L" 'AC_SA_A321
        DataString(6) = "N" ' AC_LR_A330
        DataString(7) = "N" ' AC_LR_A340
        DataString(8) = "F" ' AC_LR_A380
        DataString(9) = "N" ' AC_XWB_A350
        DataString(10) = "M" ' AC_Military_A400M
        DataString(11) = ";"
     
        '"DataString" est le tableau dans lequel doit être effectué la recherche.
        '"str" est la chaîne à rechercher.
        'La fonction Filter renvoie le tableau "InString" contenant les éléments
        'qui répondent aux critères de la recherche.
        InString = Filter(DataString, strValue, True)
     
        'Boucle sur le tableau afin de visualiser les éléments
        'qui répondent aux critères de recherche.
        For i = 0 To UBound(InString)
            Debug.Print InString(i)
        Next i
    End Sub
    Source : http://silkyroad.developpez.com/VBA/...racteres/#LI-V

    Mais j'ai une message d'erreur quand je compil :
    Variable ou procédure attendue, et non un module et le mot Filter est en surbrillance dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        '"DataString" est le tableau dans lequel doit être effectué la recherche.
        '"str" est la chaîne à rechercher.
        'La fonction Filter renvoie le tableau "InString" contenant les éléments
        'qui répondent aux critères de la recherche.
        InString = Filter(DataString, strValue, True)
    Si quelqu'un a une idée?

    Bien à vous,
    Paloma

  7. #7
    Invité
    Invité(e)
    Par défaut


    Tu as qu'elle version d'Excel ?
    Car chez moi sur Excel 2003, ça fonctionne !

    A+

  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 Bonjour BrunoM45
    Domage, je suis sous Excel 2000

    Mais, j'en profite pour dire que je ne dois pas pouvoir faire comme ça, il faut que je modifie plus le code car ce que j'aimerais faire, c'est récupérer la valeur saisie (ici strValue) et regarder dedans si elle a bien un élément du tableau.

    Si c'est du type

    584;566 c'est bon
    R541;L632 c'est bon
    P401;L632 c'est pas bon P n'existe pas donc message d'erreur à renvoyer "Fault !" et le filtre ne s'ajoute pas.
    R456N542 ne fonctionne pas : message Il manque le ; pour avoir un filtre valide !"

    Donc je cherche comment faire ça au mieux

    Merci pour vos infos, elles sont précieuse ....

    Cordialement,
    Paloma

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Juste un truc pour simplifier l'écriture d'un tableau tel que le tien
    DataString = Array("R" ,"L","L","L","L","L","N","N","F","N","M",";")
    nbd = Ubound(DataString) 'pour la taille
    Le tableau commence à l'index 0
    Ceci dit, je n'ai pas compris ton pb, j'y retourne

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Voilà. Tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Dim InString() As String
    mais tu ne redimensionnes pas ton tableau avant la ligne
    InString = Filter(DataString, strValue, True)
    Mets
    En VBA 97, ça ne passe pas non plus
    Tu devras le redimensionner avec Redim Preserve si tu veux conserver les données stockées et indexer ton tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        i = i + 1
        Redim Preserve InString(i)
        InString(i) = Filter(DataString, strValue, True)
    A+

  11. #11
    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 Voilà j'ai presque fini ...
    Bon d'accord j'ai encore un truc qui ne fonctionne pas bien.

    Donc dans mon code, il y a trois vérifications sur la saisie :

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    Private Sub ButAdd_Click()
        strValue = InputBox("Please enter a value to consider to translate the package", "Add filter")
        If strValue = "NULL" Or strValue = "" Then
        MsgBox "You must enter a not empty value!", vbCritical, "!STOP!"
        Exit Sub
        Else
     
    '=(1)==================================================================================================================
        'vérification que le séparateur ";" existe -------------------------------------------------------------
                If InStr(1, strValue, ";") = 0 Then
                    boolvalidity = False
                    MsgBox "You forget ; char separator between old value and new value!", vbCritical, "!STOP!"
                    Exit Sub
                    Else
                    boolvalidity = True
                    End If
     
         'Extraction de la chaine de caractère jusqu'au ";" ---------------------------------------------------
     
                Dim strOldChar As String
                Dim intPosition As Integer
                intPosition = InStr(1, strValue, ";") - 1
                strOldChar = Left(strValue, intPosition)
     
    '=(2)==================================================================================================================
         'Vérification que la chaine avant le ";" existe bien dans la feuille Excel "WorkFiles" ----------------
                Dim objStringFind
                Dim ok As Boolean
                    'Sheets("Work files").Activate
                    With Worksheets("Work files").Range("C:C")
                        Set objStringFind = .Find(strOldChar, LookIn:=xlValues)
                        If Not objStringFind Is Nothing Then ok = True
                        Set objStringFind = Nothing
                    End With
                    If Not ok Then
                        MsgBox "Your request value ( " & strOldChar & " ) does not exist in all filename !", vbCritical, "!STOP!"
                        boolvalidity = False
                           Else
                        boolvalidity = True
                    End If
                    'Sheets("Reference File GENERATOR").Activate
     
    '=(3)==================================================================================================================
        'Extraction du premier caractère après le ";" ----------------------------------------------------------
     
                Dim strAircraftChar As String
                'Dim intPosition As Integer
                intPosition = InStr(1, strValue, ";") + 1
                strAircraftChar = Mid(strValue, intPosition, 1)
     
        'Vérification que ce caractère est bien une Lettre de l'alphabet ---------------------------------------
               Dim intCODE As Integer
               intCODE = Asc(strAircraftChar)
     
                If intCODE < 65 Then
     
                Else
        'Vérification Programme Avion (AIRBUS) -----------------------------------------------------------------
     
            'strSingleValue = strValue
            Call chkPrograms(strAircraftChar)
     
                End If
     
    'Ajout du filtre si toutes les condition sont vrai ----------------------------------------------------------
         If boolvalidity = True Then
            ListBoxFilters.AddItem UCase(strValue)
            ButGenerate.Visible = True
            Else
            MsgBox "For to add a new filter, please you must enter a value corresponding to a part of the old file name then a (;) separator and after a value to change the first value you has entered", vbInformation, "Tips for added a new filter :"
            End If
        End If
     
     
    End Sub
    a partir du :
    '=(3)==================================================================================================================
    Le problème c'est que, si j'ai bien une lettre après le ";" la fonction chkPrograms est appelée mais elle ne fonctionne pas.

    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
    Public Function chkPrograms(strSingleValue As String) As String
    'Programs Descriptions ---------------------------------------------
     
            Dim DataString(10) As String
                Dim InString() As String
                Dim i As Integer
                Dim strActive As String
     
            'Remplissage du tableau qui va être testé
                DataString(0) = "R" ' AC_WBY_A300
                DataString(1) = "L" ' AC_SA_A318
                DataString(2) = "L" ' AC_SA_A319
                DataString(3) = "L" ' AC_SA_A319CJ
                DataString(4) = "L" ' AC_SA_A320
                DataString(5) = "L" 'AC_SA_A321
                DataString(6) = "N" ' AC_LR_A330
                DataString(7) = "N" ' AC_LR_A340
                DataString(8) = "F" ' AC_LR_A380
                DataString(9) = "N" ' AC_XWB_A350
                DataString(10) = "M" ' AC_Military_A400M
     
                '"DataString" est le tableau dans lequel doit être effectué la recherche.
                '"str" est la chaîne à rechercher.
                'La fonction Filter renvoie le tableau "InString" contenant les éléments
                'qui répondent aux critères de la recherche.
     
                InString = Filter(DataString, strSingleValue, True, vbTextCompare)
                strActive = DataString(i)
     
                'Boucle sur le tableau afin de visualiser les éléments
                'qui répondent aux critères de recherche.
                For i = 0 To UBound(InString)
                    Debug.Print InString(i)
                Next i
     
                    If strSingleValue = strActive Then
                    Else
                    MsgBox "You enter an invalid Aircraft Programs Letter (" & strActive & ")", vbCritical, "Airbus Policy"
                    End If
     
    End Function
    Je cherche si la lettre trouvée est bien dans le tableau si ok je ne fais rien, sinon, j'affiche un message d'erreur avec le caractère en question, j'informe que ce n'est pas un caractère valide et je passe ma valeur boolvalidity à false dans la partie principale du programme.

    Si quelqu'un peu m'aider à ce sujet.

    Bien à vous.
    Paloma

  12. #12
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    tiens ton probléme doit venir de la de la façon dont est écrit ton code je pense que tu aura le même résultat en remplaçant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strActive = DataString(i]
    par

    puisqu'as l'endroit où tu l'utilise je ne vois pas comment i peu "valoir" une autre valeur que 0 ..?

  13. #13
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Je t'ai donné une réponse mais j'ai commis une erreur sur les variables à comparer. Je ne me souviens plus mais que récupères-tu dans InString() ?
    A toi

  14. #14
    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 Heu ... yes
    Bon ok, je m'égare moi aussi de toute façon.
    Je pense que je prends mal le problème.

    En fait, dans strSingleValue, je récupère une lettre de l'alphabet.

    J'aimerais que si cette lettre n'existe pas dans le tableau, ma variable boolvalidity passe à false.

    Donc ce que je fais avec InString ne me sert à rien...
    Donc il faut que je cherche comment comparer ce caractère avec tous ceux de mon tableau.

    Donc j'ai presque tout à revoir...

    Paloma

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Malgré tout, et avant de tout démolir, j'aimerais savoir ce qu'il y a dans InString.
    Tu as mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                For i = 0 To UBound(InString)
                    Debug.Print InString(i)
                Next i
    Qu'est-ca que ça affiche ?
    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Excel] Intégrer au fichier Excel des données saisies par formulaire
    Par drogba72 dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 21/05/2008, 11h13
  2. [EXCEL] Formatage des données
    Par Cupidon dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 02/11/2005, 21h32
  3. [Excel] Récupérer des données d'une base Access
    Par FoxDeltaSierra dans le forum Excel
    Réponses: 8
    Dernier message: 03/09/2005, 10h22
  4. Réponses: 3
    Dernier message: 25/07/2005, 09h40
  5. dbgrid AND validation des données
    Par samlerouge dans le forum Bases de données
    Réponses: 10
    Dernier message: 11/06/2004, 23h08

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