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 :

Liste de validation - erreur 1004 [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur étude
    Inscrit en
    Novembre 2016
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur étude

    Informations forums :
    Inscription : Novembre 2016
    Messages : 50
    Par défaut Liste de validation - erreur 1004
    Bonjour à tous,

    j'ai pas mal cherché sur le problème mais j'ai essayé diverses solutions trouvées sur le net, rien n'y fait...

    J'ai un code qui, sous certaines conditions qui ne nous intéressent pas ici, est censé appliquer à des cellules une liste déroulante dynamique.

    En gros : j'ai un tableau structuré contenant des dates et j'ai nommé 'dates' la plage de cellules contenant ces dates (car on ne peut pas directement citer le tableau dans la liste de validation). La formule permet d'appliquer à des cellules une liste déroulante contenant une partie seulement du tableau, ceci en fonction de la valeur de la cellule située en colonne M sur la même ligne ; cette dernière contient une date et le but est que la liste déroulante parte de cette date (chaque cellule concernée par la formule aura donc une liste déroulante qui contient les dates mais à chaque fois, on ne démarre pas de la même date)...

    Bon, je reconnais que c'est peu clair.

    La ligne en français, avec les double guillemets est celle-ci, mais ça ne fonctionne pas (précision: je sélectionne bien la cellule au préalable): j'ai une erreur 1004.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=INDIRECT(""source!L"" & EQUIV(INDIRECT(""M"" & LIGNE());dates;1)+LIGNE(dates)-1&""C""&COLONNE(dates)&"":L""&EQUIV(MAX(dates);dates;1)+LIGNE(dates)-1&""C""&COLONNE(dates);FAUX)"

    En anglais, ce n'est pas mieux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=INDIRECT(""source!R"" & MATCH(INDIRECT(""M"" & ROW()),dates,1)+ROW(dates)-1 & ""C"" & COLUMN(dates) & "":R"" & MATCH(MAX(dates),dates,1)+ROW(dates)-1 & ""C"" & COLUMN(dates),FALSE)"

    Pourtant, quand j'entre directement la formule (en français avec des simples guillemets) dans la fenêtre Excel (sans passer par VBA), ça fonctionne.

    Quelqu'un saurait-il d'où peut venir le problème, svp?

    Merci par avance.

    Yohann

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    On voit bien une ligne de code, mais on ne voit pas à quel bloc With elle correspond.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur étude
    Inscrit en
    Novembre 2016
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur étude

    Informations forums :
    Inscription : Novembre 2016
    Messages : 50
    Par défaut
    Bonjour,

    c'est un bloc tout simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=INDIRECT(""source!L"" & MATCH(INDIRECT(""M"" & ROW()),dates,1)+ROW(dates)-1&""C""&COLUMN(dates)&"":L""&MATCH(MAX(dates),dates,1)+ROW(dates)-1&""C""&COLUMN(dates),FALSE)"
    End With

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Pourtant, quand j'entre directement la formule (en français avec des simples guillemets) dans la fenêtre Excel (sans passer par VBA), ça fonctionne.
    Fais donc cette opération manuelle en lançant l'enregistreur de macros, puis va voir le code ainsi obtenu

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur étude
    Inscrit en
    Novembre 2016
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur étude

    Informations forums :
    Inscription : Novembre 2016
    Messages : 50
    Par défaut
    Merci à toi. J'ai bien essayé, ça donne ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        With Selection.Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:= _
            "=INDIRECT(""source!L"" & EQUIV(INDIRECT(""M"" & LIGNE());dates;1)+LIGNE(dates)-1&""C""&COLONNE(dates)&"":L""&EQUIV(MAX(dates);dates;1)+LIGNE(dates)-1&""C""&COLONNE(dates);FAUX)"
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
        End With
    Mais le problème est que l'enregistreur prend la formule en français en ajoutant simplement les double guillemets. Or, quand on lance ce code... on obtient une erreur 1004. Excel crée lui-même un bout de code qui ne fonctionne pas.

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur étude
    Inscrit en
    Novembre 2016
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur étude

    Informations forums :
    Inscription : Novembre 2016
    Messages : 50
    Par défaut
    J'ai trouvé.

    En fait, il y a deux problèmes:

    • la cellule qu'on prend pour référence (date à partir de laquelle on souhaite démarrer la liste) ne doit pas être vide (il faut une date)
    • l'utilisation de INDIRECT au format R1C1 n'est pas conseillée: quand VBA retranscrit la formule en français dans la liste de validation de la cellule, il ne remplace par R (row) par L (ligne) => on obtient alors une liste qu'on ne peut pas dérouler et il faut modifier à la main le R en L


    Le bout de code est donc celui-ci (je simplifie). On remarque qu'il faut aussi calculer la lettre où se situe la liste des dates : LEFT(ADDRESS(ROW(dates), COLUMN(dates), 4), 1)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    With plage
         .Validation.Delete
         If Range("M" & row()) <> "" Then
             .Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:= _
             "=INDIRECT(""source!"" & LEFT(ADDRESS(ROW(dates), COLUMN(dates), 4), 1) & MATCH(INDIRECT(""M"" & ROW()), dates, 1) + ROW(dates) - 1  & "":"" & LEFT(ADDRESS(ROW(dates), COLUMN(dates), 4), 1) & MATCH(MAX(dates), dates, 1) + ROW(dates) - 1)"
        End If
    End With
    et puis en retranvaillant un peu, on améliore et on a ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    With plage
         .Locked = False
         .Validation.Delete
         If Range(TB.DisplayName & "[date de début révisée]")(cellule.Row - data.Row + 1) <> "" Then
              a = Range("dates").Worksheet.Name & "!" & _
              Replace(Cells(1, Range("dates").Column).Address(False, False), 1, "") & Application.Match(CLng(Range(TB.DisplayName & "[date de début corrigée]")(cellule.Row - data.Row + 1)), Range("dates"), 1) + Range("dates").Row - 1 & _
              ":" & Replace(Cells(1, Range("dates").Column).Address(False, False), 1, "") & Range("dates").Count + Range("dates").Row - 1
              .Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:= "=" & a
         End If
    End With

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

Discussions similaires

  1. [Toutes versions] Erreur 438 - Suppression des listes de validation
    Par Angélique01 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/02/2016, 09h40
  2. [XL-2010] Erreur 1004 - MDP non valide
    Par France31400 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/11/2015, 08h31
  3. [Excel] Erreur 1004 avec un search
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/12/2005, 13h54
  4. Insérer une image : Erreur 1004
    Par dp_favresa dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 26/10/2005, 14h01
  5. [XHTML] Listes imbriquées valides ?
    Par Amon dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 23/09/2005, 23h05

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