Error 1024 - creation de liste de choix

insosama

XLDnaute Nouveau
Bonjour

j'ai une macro plutot simple, généré en partie via l'enregistreur de macro et très légèrement modifié à dessin, qui me fait une magnifique erreur 1024 sans autre explication.
a noter que "on error resume next" ne fait pas apparaitre d'erreur, mais la fonction ne fait alors rien du tout.

voici la fonction :

Code:
Public Function AddListToCell(target As Range, Formula As String, Optional ErrorShow As Boolean = False)

'ajouter liste de choix a une cellule :
'On Error Resume Next

    target.Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=" & Formula
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = ErrorShow
    End With
    
End Function

elle permet d'ajouter une liste de choix prédéfini (formula) dans une cellule (target). et d'autoriser ou non les valeurs autre que celles contenue dans la formule (ErrorShow)

je l'apelle ainsi :

Code:
temp = Cells(i, 2).Value
AddListToCell Cells(i, 2), "DECALER(Liste_Ini!$G$1;;;Liste_Ini!$F$2)"
Cells(i, 2).Value = temp

ces deux codes sont des fonctions publique dans des modules séparés.
le "décaler" (DECALER(Liste_Ini!$G$1;;;Liste_Ini!$F$2)) génère un "range" valide de 6 valeurs, tout est conforme de ce coté, la formule marche.
le "temp" permet de s'assurer que les valeurs ne partent pas dans les opérations d'ajout / suppression de liste de choix. je ne savais pas trop si la fonction supprimerais la valeur ou non, j'ai donc pour le moment pris un peu de précaution.

c'est l'instruction :
".Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=" & Formula"
qui envois une erreure 1024

à noter deux choses curieuse :

1) une autre fonction est disponible pour supprimer les listes devenues non necessaire. elle est bati sur le meme principe, toujours en "enregistrement de macro" de base, tout juste remanié.

Code:
Public Function DeleteListe(target As Range)

    target.Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
        :=xlBetween
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
    
End Function

sauf que elle .... fonctionne au poil !


autre curiosité :

pour tester au tout début que l'effet etait celui escompté (et que ma formule etait bonne) j'ai lancé cette fonction en tant que formule, directement dans mon tableur.

elle a parfaitement fonctionné.
exception faite que la "liste" ne se mettait pas sur la cellule désigné en "target", mais sur la cellule ou la formule se trouvait. curiosité ... mais comme je ne comptais pas vraiment utiliser cette fonction en tant que formule, je ne suis pas allé chercher plus loin

reste que cela marchait.
je n'ai rien modifié dans la fonction
et depuis que j'ai seulement ajouté les instructions appelant cette fonction dans mon autre fonction, meme en mode formule, cela ne marche plus !

voila, je ne sais pas trop quoi en penser, comment regler le probleme, ou pourquoi a un moment ca a visiblement très bien marché, puis tout a coup, ca ne marche pas.
que mon "cells(i,2)" ne suffise pas a pointer un target convenable, c'est surprenant, mais passe encore. mais quand je le désigne par formule, il n'y a aucune raison pour que ce qui marchait avant décide de jeter l'éponge.

des idées ?

merci d'avance pour toute aide apportée :)

cordialement.
 

Staple1600

XLDnaute Barbatruc
Re : Error 1024 - creation de liste de choix

Bonsoir à tous

insosama
Une intuition (à infirmer ou confirmer)
Formula est un mot réservé par VBA, non ?
Range("A1").Formula="=ROW()" par exemple

Une suggestion:
Joindre un fichier exemple pourrait être utile, non ?C
Car nous aurions la feuille nomme Liste_Ini et donc nous pourrions faire des tests sur nos PC.
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Error 1024 - creation de liste de choix

Bonsoir Insosama, bonsoir le forum,

D'abord bravo pour tes explications qui sont on ne peut plus claires et ça devient tellement rare que je tenais à le souligner. Je n'ai malheureusement pas de solution juste une supposition qui me paraît tellement évidente que j'ose à peine la dire... N'est-il pas nécessaire et mettre entre parenthèse l'appel de la fonction avec les deux arguments :
AddListToCell
(Cells(i, 2), "DECALER(Liste_Ini!$G$1;;;Liste_Ini!$F$2)")

J'imagine ton fichier original lourd mais je pense que tu obtiendras plus de réponse si tu fournissais une base qui nous permettrait de tester le code sans avoir a recréer nous-même...


[Édition]
Et Paf ! Encore un Staple-carambolage ! Et m.... en plus j'ai pas la priorité je viens
de gauche... et j'ai même pas vu le panneau [formula] !
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Error 1024 - creation de liste de choix

Bonsoir Robert

En modifiant ainsi (voir mon premier message)
Cela semble fonctionner.
A confirmer avec ton fichier exemple.

En tout cas, je n'ai pas de message d'erreur.
EDITION: Mais pour autant ce n'était pas là le fin de l'histoire;)
(voir mon dernier message)
Code:
Public Function AddListToCell(target As Range, Formul As String, Optional ErrorShow As Boolean = False)
'ajouter liste de choix a une cellule :
'On Error Resume Next
    target.Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:=Formul
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = ErrorShow
    End With
End Function
 
Dernière édition:

insosama

XLDnaute Nouveau
Re : Error 1024 - creation de liste de choix

Bonjour

tout d'abord, merci à tous pour votre aide.
petit erratum hier : c'est une erreur 1004, et non 1024 :rolleyes:
concernant les parenthese, il est certain que ce n'est pas la source du probleme. une fonction n'a besoin de parenthese que si elle retourne quelque chose.

par exemple :

MaVariable = Mafonction(MesParam)

alors que, si on a une fonction (comme celle ci) effectuant quelque chose de précis, mais sans retourner quoi que ce soit :

Mafonction MesParam

a noter un cas particulier : celui ou la fonction retourne un param modifié (utilisation détournée du ByRef)

MesParam = MaVariable_avant
MaFonction MesParam
MaVariable_Apres = MesParam

à noter d'ailleurs qu'essayer d'ajouter des parenthese a quelque chose qui n'en necessite pas (facile a deviner : y'a pas de signe égal !) envois un message d'erreur dès la rédaction de l'instruction <=> erreur de syntaxe.
il n'y a donc pas d'erreur possible à ce niveau.

Concernant les autres points, ils m'ont tous semblé pertinant, je les ai donc tous testé.
j'ai changé Formula en Formule, puis meme Instruct
à noter que meme si un mot est utilisé, il n'est pas toujours "reservé". fort heureusement, vb fait la distinction entre une simple "variable" et un attribut d'objet / sa (ou ses) methodes. si le soucis etait venu de la, a priori, j'aurais eue de toute facon un message d'erreur associé a une variable non autorisé. (je sais plus de tete le n°)

j'ai ensuite changé "DECALER" par "OFFSET"

dans les deux cas
=> toujours strictement le même soucis.
ce qui est d'ailleurs conforme avec le fait que visiblement mon code avait fonctionné sans.

je vois par contre une différence que j'ai négligé entre avant (quand le code a marché) et après (quand il a décrété de m'envoyer des 1004).
la formule etait à l'epoque dans le code, et non issue des params de la fonction.

par aquis de conscience, verrifier / localiser les sources du problème, je vais tenter cette "methode" (meme si il faudra, de toute facon, a terme, que ce soit sous forme de param, et non tout integré.

je vais aussi rebooter tout le PC, et tenter d'isoler les codes spécifiquement lié a mon soucis, à la fois pour bosser "au propre" et vous passer le fichier. il est effectivement énorme (près de 150 fonctions implantés)

cordialement.


Edit : apres test, remettre l'instruction dans le corps de la fonction n'a rien donné de probant.
de meme, le reboot n'a rien donné non plus.
je vous prépare un fichier test.

cordialement (bis repetatem)
 
Dernière édition:

insosama

XLDnaute Nouveau
Re : Error 1024 - creation de liste de choix

voila, j'ai simplifié tout mon fichier pour aller a l'essentiel et se concentrer uniquement sur le bug dont il est question ici.

évidement, il va sans dire que la feuille "liste_ini" est en réalité bien plus remplie, les contenus des listes sont des formules, les autres colonnes sont pleine, etc ...

toutefois, j'ai réussi a :

la fonction (AddListToCell et DeleteListe) est strictement celle que j'ai dans mon projet (voir module 1)

la structure appelante, dont vous reconnaitrez sans mal les 3 lignes que je vous avait montré au début se trouve dans le code de "feuil1". c'est un petit erratum. j'etais fatigué hier, je me rend compte que je vous avais dit que c'etait deux modules :p

elle se trouve dans une SUB

Code:
Sub InitList()

For i = 1 To 65000

    If Cells(i, 1) <> "" Then
        If InStr(1, Cells(i, 1).Value, "valeur") <> 0 Then
            'input
            temp = Cells(i, 2).Value
            AddListToCell Cells(i, 2), "DECALER(Liste_Ini!$N$1;;;Liste_Ini!$E$2)"
            Cells(i, 2).Value = temp
        Else
            If InStr(1, Cells(i, 1).Value, "nom resultat") <> 0 Then
                'output
                temp = Cells(i, 2).Value
                AddListToCell Cells(i, 2), "DECALER(Liste_Ini!$G$1;;;Liste_Ini!$F$2)"
                Cells(i, 2).Value = temp
            Else
                'autre
                temp = Cells(i, 2).Value
                DeleteListe Cells(i, 2)
                Cells(i, 2).Value = temp
            End If
        End If
    Else
        Exit For
    End If

Next

End Sub

la feuille est scannée, tout particulierement la premiere colonne (celle qui contient les noms des variables, cette feuille sert a regler des options utilisateurs).
si les noms des "variables" portent les mots clés "valeur" ou "nom resultat", on ajoute sur la seconde colonne une liste de choix pointant dans la feuil "Liste_Ini" définissant les "valeurs" possible (colonne N) ou les "nom resultat" possible (colonne G)
de plus, les valeurs éventuelle présente sont sauvegardé pour etre sur que l'ajout d'une liste (meme si ici elle est reglée de sorte a autoriser des valeurs "autre" que celle proposé) ne supprime pas le contenu.

cette sub est à la lettre près strictement la meme que celle que j'utilise.
notez d'ailleurs que si ma "fonction" (AddListToCell) utilise un "select" (dont il est sans doute possible de se passer), rien dans le code ne necessite de switcher / perdre le focus sur la feuille "List_Ini". c'est l'interet d'avoir utilisé une "simple" formule générique d'excel : elle appelle la selection a distance, a priori.

j'ai remis la formule en francais, partant du principe que :
=> la fonction a été créé via enregistrement de macro. c'est ni plus ni moins que la formule que j'ai moi meme tappé à la main dans la "liste de validation de donnée", et hors de toute considération "macro", je l'ai tappé à la main, et elle fonctionne.
vous pouvez tester vous meme :
dans la feuille 1, choisissez une cellule, Ribbon : "Donnée" / validation des donnée / validation des donnée.
onglet "Option". autoriser : liste
tappez dans "Source :" la formule EN FRANCAIS:
=DECALER(Liste_Ini!$G$1;;;Liste_Ini!$F$2)
onglet "alerte d'erreur"
décochez "quand les donnée non valide sont tapées"
fermez.
vous obtiendrez exactement ce que je cherche. et si vous avez lancé l'enregistrement de macro, vous obtiendrez quelque chose de très proche de ma fonction, avez, notez le, la formule en francais dans la macro.


seule l'instruction appelant "InitList" est simplifié
ici, c'est sur double clic
on identifie si le double clic a lieux sur A1, et dans ce cas, on applique le scann.

en pratique, c'est très proche de ca, sauf que A1 n'est pas la seule cellule lancant un scann, et que celui ci fait suite a d'autres appels de sub pour enregistrer, ouvrir, mettre à jour.

mais qu'importe.
ainsi simplifié, toutefois, TOUTE la boucle de ma fonction est visible (donc tout les éléments agissant dessus) et ... le bug est bien reproduit.
ce qui retire aussi le risque (avec un fichier aussi gros / modifié) d'un bug lié a d'autres appel de fonction en fond de tache, ou d'un fichier corrompus (ca m'est deja arrivé).

enfin, a voir si de votre coté, vous reproduirez le bug (j'espere :rolleyes:)

merci a tous pour vos réponse !
 

Pièces jointes

  • test liste.xlsm
    19.4 KB · Affichages: 44
  • test liste.xlsm
    19.4 KB · Affichages: 51
  • test liste.xlsm
    19.4 KB · Affichages: 51

insosama

XLDnaute Nouveau
Re : Error 1024 - creation de liste de choix

sorry pour le multi post, mais comme chacun des trois derniers messages (comprenant celui ci) parlent de choses bien différentes, cela me parrait beaucoup plus clair de procéder de la sorte.

j'ai trouvé un truc "interressant".
en supprimant le "=", dans l'appel de la formule, je n'AI PLUS D'ERREUR

.Add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=instruction

(au lieu de :)
.Add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=" & instruction

enfin, attention : je n'ai plus de bug, mais l'instruction est alors reconnue comme un mot SEUL, et donc la "liste" est consituté d'un seul élément : le texte de la formule. ca n'est en aucun cas l'effet recherché.

j'ai évidement tenté d'ajouter le "=" du coté de l'appel de la fonction (donc directement compris dans la variable "instruction", mais dans ce cas, retour case départ <=> 1004

cela doit pourtant fonctionner, puisque c'est ni plus ni moins que la syntaxe de la création de macro, celle qu'on peux aussi utiliser a la main en définissant une liste de validation de donnée, et qu'a un moment, je ne sais absoluement pas pourquoi / comment, mais la fonction a marché dans cet état. (avec une formule, et un "=")

toutefois, si vraiment je (on) arrivait pas a débloquer la lecture de formule, j'entrevois une autre solution : peut etre qu'il est possible non de lui envoyer une "formule", mais un "array". il faudra bien sure creer une petite fonction pour générer un array à la facon d'un "DECALER" pour remplacer cette formule reclacitrante, et sans doute que la macro est a modifier un peu (Formula1:= parait alors peu indiqué) mais c'est peut etre une solution de sortie possible.

moi je seche complet, la. je vois pas.

j'ai testé, le bug est bien reproductible ailleurs (donc chez vous aussi, j'immagine).

j'espere donc de tout coeur que vous serez plus inspiré que moi \o/

merci d'avance

cordialement.
 

insosama

XLDnaute Nouveau
Re : Error 1024 - creation de liste de choix

OK !

ca y'est ! epik fail / meha culpa !

VOUS aviez a 100% raison ! Staple1600, Merci à toi !
En fait je ne suis égaré
C'est juste une histoire de syntaxe
Si ta formule est à la sauce anglaise plus d'erreur

"OFFSET(Liste_Ini!$G$1,,,Liste_Ini!$F$2)"

j'ai mal lu, j'ai pas copié / collé ton code, juste retranscrit, et j'ai fait une erreur digne d'un sombre ignorant.
en anglais, les ";" sont remplacé par des ","
si j'avais copié ta formule, je n'aurais eue aucun soucis.

évidement Offset(x;;;z) marche beaucoup moins bien !!!!

bref, donc, il faut bien passer les formules en ANGLAIS, avec des VIRGULES.

merci a tous pour votre aide précieuse.
 

Staple1600

XLDnaute Barbatruc
Re : Error 1024 - creation de liste de choix

Bonsoir à tous

insosama
C'est ballot d'avoir des problèmes de lunettes. ;)
Car la solution était là au chaud depuis hier 19h33 et tu as remis la main sur tes lunettes qu'à 11h47 ce matin (lol) ;)
 

insosama

XLDnaute Nouveau
Re : Error 1024 - creation de liste de choix

bah comme une erreur est toujours pretexte a éviter de la refaire, j'ai commencé a coder une fonction de conversion EN=>FR et vice versa :)
mais ouais, c'est vraiment bete de pas avoir vu plus tot.

merci pour tout en tout cas :)
 

Discussions similaires

Statistiques des forums

Discussions
312 216
Messages
2 086 342
Membres
103 192
dernier inscrit
Corpdacier