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 :

Validation de données [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut Validation de données
    Bonjour,

    Alors là je n'y comprends rien !!
    J'ai un tableau importé pour lequel j'analyse par ligne plusieurs éléments et insère des listes à l'aide de la validation de données
    les données sont :
    DEBELEC_MH_LB;ABC;DEBELEC_MH;DEBELEC_PO;DEBELEC_PO_LB;DEBELEC_VA;BO_PERPIGNAN;DEBELEC-VA_LB;ÉTÉ_RESEAUX;ÉTÉ_RESEAUX_LB;IMC;IMC_LB;JOCAVEIL_PO;JOCAVEIL_PO_LB;SANCHIS;SANCHIS_LB;SEEB;SEEB_LB;SIR;SIR_LB;TOFFOLI_LB;SOTRANASA;TOFFOLI
    Si j'insère manuellement ma liste tout fonctionne bien
    Si je l'insère en vba avec le code suivant cela me créé une seule ligne avec toute la liste !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    nmprest = Join(nmp, ";")
    With Sheets("export").Cells(lige, coln2).Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=nmprest
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
        End With
    Bizarre non ?
    Je ne vois pas d'erreur, j'ai recherché sur le net et utilisé l'enregistreur de macro mais rien n'y fait.
    Voyez vous le problème ?

    Pour info nmp est une variable tableau qui contient la liste.

    Merci pour votre aide

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 170
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Bizarre non ?
    Je ne vois pas d'erreur, j'ai recherché sur le net et utilisé l'enregistreur de macro mais rien n'y fait.
    Voyez vous le problème ?
    Rien de bizarre et êtes vous sûr d'avoir essayé l'enregistreur de macro ?.
    Je suppose que "nmprest" est le nom qui fait référence à la plage de cellules où se trouvent les valeurs à afficher et donc il y a lieu d'ajouter les guillemets + le signe "="
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=nmprest"
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 121
    Par défaut
    Salut

    @Philippe: Je ne pense pas, nmpPrest est créé via Join au début du code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nmprest = Join(nmp, ";")
    Par contre comment as tu déclaré tes variables? et que contient nmp?
    Si j'en crois le descriptif en ligne de Join, il faut un tableau une dimension. Est-ce bien le cas?

    L'idéal face à ce type de problème, c'est de faire une exécution pas à pas (F8) quite à mettre un point d'arrêt sur la ligne (F9) si noyé dans une function ou un long code. Puis de regarder le contenu de nmPrest pour voir s'il contient bien la chaine escompté.

    Si la chaine est correcte, essaye de remplacer les ";" par des ","... Je n'ai pas le temps de faire un essai, je suis à la bourre
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 170
    Billets dans le blog
    53
    Par défaut
    Bonjour Quaz,
    @Philippe: Je ne pense pas, nmpPrest est créé via Join au début du code.
    Bien vu, j'ai lu trop vite.
    Personnellement je privilégie toujours la référence à une table plutôt que l'insertion de texte.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut
    Citation Envoyé par Qwazerty Voir le message
    oui effectivement, mes données sont dans des variables
    nmprest est une variable simple de type string
    et nmp une variable tableau de type nmp()as string.
    je la remplis en récupérant des éléments sur une feuille avec des conditions
    son contenu est correct puisque avant join j'ai bien une ligne pour chaque nom entre chaque ".
    Se qui me semble bizarre c'est que le contenu de nmprest je le colle puis le copie dans la validation de données je récupère bien ma liste
    Mais si je le colle en vba cela colle tout sur une ligne

    Par contre, j'ai essayé les "," (virgule) cela ne fonctionne pas

    un autre morceau de code car il y a plusieurs choses qui se font dans cette sub :
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    Option Explicit
    Dim lige As Integer 'numero de ligne export
    Dim lige1 As Integer
    Dim lige2 As Integer
    Dim ligca2 As Integer
     
    Dim test1 As Boolean
    Dim test2 As Boolean
    Dim test3 As Boolean
    Dim test4 As Boolean
    Dim testimp As Boolean
     
    Dim nmp() As String
    Dim nmc() As String
    Dim bdtp() As String
    Dim ipimp() As String
    Dim typ(2) As Integer
    Dim prio(1 To 7, 4 To 14) As String
    Dim colnp(4 To 13) As Integer
     
    Dim coln1 As Integer
    Dim coln2 As Integer
    Dim coln3 As Integer
    Dim coln4 As Integer
    Dim coln5 As Integer
    Dim coln6 As Integer
    Dim coln7 As Integer
    Dim coln8 As Integer
    Dim coln9 As Integer
    Dim coln10 As Integer
    Dim coln18 As Integer
     
     
    Dim nm1 As String
    Dim nm2 As String
    Dim nm3 As String
    Dim nm4 As String
    Dim nmprest As String
    Dim nmca As String
     
    Dim a As Integer
    Dim b As Integer
     
    restit = cherchcol("", True, False)
     
    coln1 = restit(1)   'ca
    coln2 = restit(2)   'presta
    coln3 = restit(7)   'osr
    lige = restit(11)
    coln4 = restit(4)   ' 4=type travaux ,
    coln5 = restit(5)   ' 5=consignes particulières,
    coln6 = restit(6)   ' 6=technique brcht
    'coln7=restit()
    coln18 = restit(8)   ' client
    coln10 = restit(3)   ' 3 = insee,
    'definition de la liste presta
    lige1 = 6
    Do While Sheets("bdpresta").Range("a" & lige1).Value <> ""
        lige1 = lige1 + 1
        If lige1 = 10000 Then Exit Do
    Loop
    Erase nmp
    ReDim nmp(6 To lige1 - 1)
    For lige2 = 6 To lige1 - 1
        nmp(lige2) = Sheets("bdpresta").Cells(lige2, 1).Value
    Next lige2
     
    'definition de la liste ca
    lige1 = 4
    Do While Sheets("bdChargaff").Range("a" & lige1).Value <> ""
        lige1 = lige1 + 1
        If lige1 = 10000 Then Exit Do
    Loop
    Erase nmc
    ReDim nmc(4 To lige1 - 1)
    For lige2 = 4 To lige1 - 1
        nmc(lige2) = Sheets("bdChargaff").Cells(lige2, 3).Value & " " & Sheets("bdChargaff").Cells(lige2, 2).Value
    Next lige2
     
    nmprest = Join(nmp, ";")
    nmca = Join(nmc, ";")
     
    Do While Sheets("export").Cells(lige, coln3).Value <> ""
     
        insee = Sheets("export").Cells(lige, coln10).Value
     
        '*********************************insertion de la validation de données dans la case prestataire
        With Sheets("export").Cells(lige, coln2).Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=nmprest
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
        End With
     
     
     
        '**************************insertion de la validation de données dans la case chargé d'affaires
        With Sheets("export").Cells(lige, coln1).Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=nmca
            .IgnoreBlank = True
            .InCellDropdown = True
            .ShowInput = True
            .ShowError = True
        End With
       lige = lige + 1
        If lige = 10000 Then
            MsgBox "TROP DE LIGNES ANALYSES" & vbCrLf & "Contactez le concepteur - erreur saisman 1", vbCritical
            Exit Sub
        End If
    loop
    restit est une fonction qui me renvoie les numéros de colonne que je recherche car la feuille de rechercher est importé par l'utilisateur

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 170
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il est compliqué de suivre votre programme mais il semblerait que vous indiciez la variable tableau nmp à partir de 4 ou ^même de 6
    Comme l'a écrit Quazerty, vérifiez les deux variables nmp et nmprest et vous verrez certainement où est le problème
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  7. #7
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 121
    Par défaut
    Salut

    J'ai repris un peu ton code mais il faudrait penser à carrément modifier le fichier... Si tu as la main sur cette partie bien sûr.

    L'utilisation des tableaux structurés directement dans les feuilles faciliterait grandement l'écriture du code. Je me demande même si ça ne supprimerait pas complètement l'utilité du code.... Je ne peux pas en être complètement sûr sans voir le document mais il me semble qu'une fois les tableaux DB passé en structuré vous auriez immédiatement les contenu des validations et il suffirait ensuite de faire la validation liste sur la 1ère ligne et de l'étendre à tout le tableau (au pire en le faisant via une macro).
    Ce serait beaucoup, beaucoup plus rapide que de faire un traitement ligne à ligne sur des milliers de lignes.

    J'imagine que c'est un fichier pro donc autant faire quelque chose de robuste, surtout si tu n'es pas l'utilisateur unique.

    Je plussoie ce que dit Philippe, ça n'est pas parce que tes données commence à la ligne 6 de ta feuille excel que tu dois créer un tableau avec des index commençant à 6.
    Si tes données vont de 6 à 10 (5 lignes), tu crées un tableau de valeur qui va de 1 à 5. ensuite dans ton code tu aura un truc comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 à ubound(TabValeur)
       tabvaleur(i) = .Cells(i+5,"A").value
    Next

    Voila le code tel qu'il pourrait être (dans le principe mais encore une fois, il vaudrait mieux d'abord travailler le contenu des feuilles avant de se lancer dans du VBa... ça reste que mon avis)
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    Option Explicit
     
    Const cst_Restit_CA = 1
    Const cst_Restit_Presta = 2
    Const cst_Restit_Insee = 3
    Const cst_Restit_TypeW = 4
    Const cst_Restit_CP = 5
    Const cst_Restit_TechB = 6
    Const cst_Restit_OSR = 7
    Const cst_Restit_Client = 8
    Const cst_Restit_NumLigne = 11
     
    Sub Macro()
     
    Dim lige As Integer 'numero de ligne export
    Dim lige1 As Integer
    Dim lige2 As Integer
    Dim ligca2 As Integer
     
    Dim test1 As Boolean
    Dim test2 As Boolean
    Dim test3 As Boolean
    Dim test4 As Boolean
    Dim testimp As Boolean
     
    Dim nmp() As String
    Dim nmc() As String
    Dim bdtp() As String
    Dim ipimp() As String
    Dim typ(2) As Integer
    Dim prio(1 To 7, 4 To 14) As String
    Dim colnp(4 To 13) As Integer
     
    'Dim coln1 As Integer
    'Dim coln2 As Integer
    'Dim coln3 As Integer
    'Dim coln4 As Integer
    'Dim coln5 As Integer
    'Dim coln6 As Integer
    'Dim coln7 As Integer
    'Dim coln8 As Integer
    'Dim coln9 As Integer
    'Dim coln10 As Integer
    'Dim coln18 As Integer
     
     
    Dim nm1 As String
    Dim nm2 As String
    Dim nm3 As String
    Dim nm4 As String
    Dim nmprest As String
    Dim nmca As String
     
    Dim a As Integer
    Dim b As Integer
     
    Dim PlageData As Range, aCell As Range
    Dim lgLigne As Long
    Dim lgData As Long
    Dim NbrLigne
     
        restit = cherchcol("", True, False)
     
        'Pour aider à la lecture du code, les constantes permettent de repérer de suite de quoi il s'agit, elles seront utilisé directement plus bas dans le code
        'Je n'ai pas compris l'utilité de restit()
    '    coln1 = restit(cst_Restit_CA)   'ca
    '    coln2 = restit(cst_Restit_Presta)   'presta
    '    coln3 = restit(cst_Restit_OSR)   'osr
    '    lige = restit(cst_Restit_NumLigne)
    '    coln4 = restit(cst_Restit_TypeW)   ' 4=type travaux ,
    '    coln5 = restit(cst_Restit_CP)   ' 5=consignes particulières,
    '    coln6 = restit(cst_Restit_TechB)   ' 6=technique brcht
    '    'coln7=restit()
    '    coln18 = restit(cst_Restit_Client)   ' client
    '    coln10 = restit(cst_Restit_Insee)   ' 3 = insee,
        'definition de la liste presta
     
        'Si tu as la possibilité le mieux serait de placer les données de dbpresta sous forme de tableau structuré, ça alégerait grandement ton code (et sa fiabilité)
        'A défaut tu peux faire comme ça
        'On pointe la feuille de travail
        With ThisWorkbook.Sheets("bdpresta")
            'On pointe la plage qui contient les données
            Set PlageData = .Range(.Range("A6"), .Cells(.Rows.Count, "A").End(xlUp))
        End With
     
        'On redimensionne le tableau qui va recevoir les valeurs
        'Inutile de faire un erase, le redim sans le mot clé preserve détruit le contenu du tableau
        ReDim nmp(1 To PlageData.Rows.Count)
        lgData = 1
     
        'On boucle sur les cellules contenues dans la plage
        For Each aCell In PlageData
            nmp(lgData) = aCell.Value
        Next
     
    '    lige1 = 6
    '    Do While Sheets("bdpresta").Range("a" & lige1).Value <> ""
    '        lige1 = lige1 + 1
    '        If lige1 = 10000 Then Exit Do
    '    Loop
    '    Erase nmp
    '    ReDim nmp(6 To lige1 - 1)
    '    For lige2 = 6 To lige1 - 1
    '        nmp(lige2) = Sheets("bdpresta").Cells(lige2, 1).Value
    '    Next lige2
     
        'definition de la liste ca
        With ThisWorkbook.Sheets("bdChargaff")
            'On pointe la plage qui contient les données
            Set PlageData = .Range(.Range("A4"), .Cells(.Rows.Count, "A").End(xlUp))
        End With
     
        'On redimensionne le tableau qui va recevoir les valeurs
        'Inutile de faire un erase, le redim sans le mot clé preserve détruit le contenu du tableau
        ReDim nmc(1 To PlageData.Rows.Count)
        lgData = 1
     
        'On boucle sur les cellules contenues dans la plage
        For Each aCell In PlageData
            nmc(lgData) = aCell.Value
        Next
    '    lige1 = 4
    '    Do While Sheets("bdChargaff").Range("a" & lige1).Value <> ""
    '        lige1 = lige1 + 1
    '        If lige1 = 10000 Then Exit Do
    '    Loop
    '    Erase nmc
    '    ReDim nmc(4 To lige1 - 1)
    '    For lige2 = 4 To lige1 - 1
    '        nmc(lige2) = Sheets("bdChargaff").Cells(lige2, 3).Value & " " & Sheets("bdChargaff").Cells(lige2, 2).Value
    '    Next lige2
     
        nmprest = Join(nmp, ";")
        nmca = Join(nmc, ";")
     
        'Pour la suite, je vois un maxi de 10000 lignes, il faudra faire une gestion du application.screenupdating pour accélérer le traitement
        'On pointe la feuille Export
        With ThisWorkbook.Sheets("export")
            'On regarde le nombre de ligne à traiter (je suppose que la colonne 3 à toujours un contenu
            NbrLigne = .Cells(.Rows.Count, restit(cst_Restit_Insee)).End(xlUp).Row
            'On pointe le tableau complet
            Set PlageData = .Range(.Cells(restit(cst_Restit_NumLigne), restit(cst_Restit_CA)), .Cells(NbrLigne, restit(cst_Restit_NumLigne)))
     
            If Plage.Rows.Count > 10000 Then
                MsgBox "TROP DE LIGNES A ANALYSER" & vbCrLf & "Contactez le concepteur - erreur saisman 1", vbCritical
            Else
                'On boucle sur les lignes de la plage
                For lgLigne = 1 To Plage.Rows.Count
                    insee = .Cells(lgLigne, restit(cst_Restit_Insee)).Value
     
                '*********************************insertion de la validation de données dans la case prestataire
                With .Cells(lige, coln2).Validation
                    .Delete
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=nmprest
                    'Inutile de remettre toutes les valeurs qui sont déjà celles par défaut
        '            .IgnoreBlank = True
        '            .InCellDropdown = True
        '            .InputTitle = ""
        '            .ErrorTitle = ""
        '            .InputMessage = ""
        '            .ErrorMessage = ""
        '            .ShowInput = True
        '            .ShowError = True
                End With
                '**************************insertion de la validation de données dans la case chargé d'affaires
                With .Cells(lige, coln1).Validation
                    .Delete
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=nmca
    '                .IgnoreBlank = True
    '                .InCellDropdown = True
    '                .ShowInput = True
    '                .ShowError = True
                End With
     
                'lige = lige + 1
    '            If lige = 10000 Then
    '                MsgBox "TROP DE LIGNES ANALYSES" & vbCrLf & "Contactez le concepteur - erreur saisman 1", vbCritical
    '                Exit Sub
    '            End If
            Loop
     
     
    End Sub
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  8. #8
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut
    Bonjour,

    Merci Philippe et QWAZERTY pour votre aide.
    Il est compliqué de suivre votre programme mais il semblerait que vous indiciez la variable tableau nmp à partir de 4 ou ^même de 6
    Comme l'a écrit Quazerty, vérifiez les deux variables nmp et nmprest et vous verrez certainement où est le problème
    J'ai procédé à la vérification des variables et le résultat est en bas :
    DEBELEC_MH_LB;ABC;DEBELEC_MH;DEBELEC_PO;DEBELEC_PO_LB;DEBELEC_VA;BO_PERPIGNAN;DEBELEC-VA_LB;ÉTÉ_RESEAUX;ÉTÉ_RESEAUX_LB;IMC;IMC_LB;JOCAVEIL_PO;JOCAVEIL_PO_LB;SANCHIS;SANCHIS_LB;SEEB;SEEB_LB;SIR;SIR_LB;TOFFOLI_LB;SOTRANASA;TOFFOLI
    Je constate bien que tous les noms présent dans la liste sont présent et ils sont tous séparéspar un ; comme l'a fait le join.
    Je me demande si les caractères _ ne sont pas le problème.
    Ce qui reste incompréhensible pour moi c'est que le vba qui créé la validation n'y arrive pas et si je créé en manuel en copiant et en collant les données cela fonctionne.

    Merci Qwazerty pour ta proposition ci dessous, car je vois des fonctions que je n'utilisait sur l'analyse des feuilles :aCell.Value, Set PlageData = .Range(.Range("A4"), .Cells(.Rows.Count, "A").End(xlUp))
    Par contre je ne peux pas utiliser les constantes dans mon cas car la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    restit = cherchcol("", True, False)
    est une fonction qui me renvoie les numéros de colonne.
    Le document sur lequel je travaille est un import sur lequel je travaille pour plusieurs choses : c'est une matrice d'affectation des dossiers à une personne et un prestataire selon un nombre important de paramètres
    Cette partie du programme le met en forme uniquement pour que l'utilisateur puisse y travailler directement et faire des corrections après le travail du programme .
    Ma fonction restit part du principe que la feuille d'import n'est pas fiable et les colonnes ne sont pas forcément au même endroit.
    C'est le problème qu'ils ont actuellement avec le tableur qu'ils utilisent actuellement et tout changement leur est difficile.
    Il passe plusieurs heures à faire ce boulot alors que ce petit programme va le faire en quelques secondes.

    J'apprécie QWAZERTY tout se qui supprime les boucles Do loop car elles sont à risques.

    Je vais adapter mon code à ta proposition et je vais voir si cela fonctionne.
    Je reviens vers vous rapidement

    merci encore,

  9. #9
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 121
    Par défaut
    Salut

    Citation Envoyé par chrisaccess Voir le message
    Par contre je ne peux pas utiliser les constantes dans mon cas car la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    restit = cherchcol("", True, False)
    est une fonction qui me renvoie les numéros de colonne.
    Il me semble que ça ne remet pas en cause l'utilisation des Constantes. Dans ton code les valeur 1,2,3,4,5,6,7,8,11 sont inscrite en dur dans le code, les constantes ne font que remplacer ces valeurs en dur. Elles permettent deux chose:
    1. Facilité la lecture du code
    2. Si tu décides de ou dois modifier une des valeurs, il suffit de modifier la constante, ce qui évite un fastidieux travail de modification et un gros risque d'erreur/oubli en moins!


    Je reste convaincu que les tableaux structurés te seraient d'un aide précieuse.
    Citation Envoyé par chrisaccess Voir le message
    Ma fonction restit part du principe que la feuille d'import n'est pas fiable et les colonnes ne sont pas forcément au même endroit.
    Mais je suppose que le noms des colonnes, eux, restent les mêmes. Une fois les données converties en tableaux structurés, il est possible de faire référence aux colonne des tableaux directement via l'entête de la colonne. Donc peu importe où elles se trouve dans le tableau... Fini les correspondances alambiquées.
    C'est toi qui vois mais si tu fourni des fichiers anonymisés il serait possible d'étudier la question...

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 170
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai procédé à la vérification des variables et le résultat est en bas :
    DEBELEC_MH_LB;ABC;DEBELEC_MH;DEBELEC_PO;DEBELEC_PO_LB;DEBELEC_VA;BO_PERPIGNAN;DEBELEC-VA_LB;ÉTÉ_RESEAUX;ÉTÉ_RESEAUX_LB;IMC;IMC_LB;JOCAVEIL_PO;JOCAVEIL_PO_LB;SANCHIS;SANCHIS_LB;SEEB;SEEB_LB;SIR;SIR_LB;TOFFOLI_LB;SOTRANASA;TOFFOLI
    Je constate bien que tous les noms présent dans la liste sont présent et ils sont tous séparéspar un ; comme l'a fait le join.
    Je me demande si les caractères _ ne sont pas le problème.
    Ce qui reste incompréhensible pour moi c'est que le vba qui créé la validation n'y arrive pas et si je créé en manuel en copiant et en collant les données cela fonctionne.
    Quand on a le nez dans le guidon, rien ne va.
    Il faut bien sûr utiliser la virgule et pas le ";" avec la fonction Join.

    Il y a donc lieu, d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nmprest = Join(nmp, ",")
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  11. #11
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut grrrrrrrrrrrrrrrrrrr
    Bonsoir tout le monde,

    effectivement cela tenait à une ponctuation
    la virgule dans le join et tout est réglé.

    merci Philippe.

    Qwazerty, pour ta proposition ci dessous :
    Je reste convaincu que les tableaux structurés te seraient d'un aide précieuse.
    Je t'avoue que je ne m'y suis pas encore penché.
    si tu as une proposition de tutoriels me permettant de comprendre les manipulations et les avantages je suis preneur pour voir s'il correspondra à mon choix.

    Je dois être extrèmement vigilent dans l'analyse de tableau car il se glisse des erreurs de l'extérieur qui peuvent planter la matrice d'affectation.
    J'ai inséré bcp d'exceptions qui saute la ligne quand les données ne sont pas correctes et les utilisateurs trouvent encore le moyen de me mettre des cas qu'on ne trouve pas dans les essais et les exports.

    Merci à tous les 2 et à bientôt

  12. #12
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 121
    Par défaut
    Salut

    Pour les tableau structuré, il y a les tutoriels de Pierre Fauconnier qui te guideront. Tu trouveras aussi beaucoup de sujet où est proposé leur utilisation et des codes qui correspondent. Bien sûr le forum reste disponible si tu coinces sur la mise en œuvre.

    Pour la gestion des exceptions, comment les utilisateurs de ton fichier renseigne-t-ils les informations que tu traite ensuite? Ne pourrais tu pas leur mettre en place un UserForm qui contrôlerait au moment de la saisie/validation que les données saisies sont sous un format correct pour être pris en compte par ton code?

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

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

Discussions similaires

  1. [Excel] Validation de données
    Par ptitsoleil87 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 21/12/2005, 19h35
  2. Problème de validation de données
    Par loutsky dans le forum Access
    Réponses: 3
    Dernier message: 23/11/2005, 14h11
  3. validation de donnée... et post
    Par sonialem2000 dans le forum Bases de données
    Réponses: 12
    Dernier message: 13/07/2004, 02h34
  4. dbgrid AND validation des données
    Par samlerouge dans le forum Bases de données
    Réponses: 10
    Dernier message: 11/06/2004, 23h08
  5. Validation de données à partir d'un XML Schema
    Par leup dans le forum Valider
    Réponses: 2
    Dernier message: 10/06/2004, 08h30

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