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 :

[E-02] Chaine trop longue pour Validation.Add


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut [E-02] Chaine trop longue pour Validation.Add
    Bonjour,
    J'essaye de créer une liste déroulante avec des différents choix possible pour l'utilisateur.
    Les composantes de cette liste déroulante sont gérées sur le workbook de la macro sur une feuille "Orga".
    Le workbook où se situe la macro est un outil de pilotage : aucune donnée est importée sur le workbook.

    Les deux exemples suivants sont bon lorsque la valeur de propiété Formula1 est courte. Par contre, ce code plante lorsque Formula1 contient une chaine de caractère longue : >285 (ma chaine fait 513 carac de long).

    Voici mes deux mains différents (de peu) qui entrainent deux erreurs differentes :

    1 Entraine l'erreur'-2147417848' Automation error
    The object invoked has disconnected from its client

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
    Workbooks.Open Chemin
    sWk = ActiveWorkbook.Name
    With Workbooks(sWk).ActiveSheet
        .Range(.Cells(1, 1), .Cells(3, 1)).Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:=RechercheIntitule("Etat")
    End With
    End Sub

    2 Entraine l'erreur'-2147417848' (La même à priori) Methode 'Add' of object Validation Failed

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
    Workbooks.Open Chemin
    sWk = ActiveWorkbook.Name
    With Workbooks(sWk).ActiveSheet
        .Range(.Cells(1, 1), .Cells(3, 1)).Validation.Add xlValidateList, xlValidAlertStop, xlBetween, RechercheIntitule("Etat")
    End With
    End Sub
    Et voici ma fonction RechercheIntitule

    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
    Function RechercheIntitule(ByVal Intitule As String) As String
    RechercheIntitule = ""
    Dim bMasquer As Boolean     'Feuille Orga masquée ou non
    Debug.Print "--> RechercheIntitule"
        With ThisWorkbook
     
            bMasquer = .Sheets("Orga").Visible
     
            If .Sheets("Orga").Visible = False Then
                .Sheets("Orga").Visible = True
            End If
     
            With ThisWorkbook.Sheets("Orga")
                j = 1
                While Not .Cells(1, j) Like Intitule
                    j = j + 1
                    If j > 250 Then
                        Exit Function
                    End If
                Wend
                i = 2
                While .Cells(i, j) <> ""
                    RechercheIntitule = RechercheIntitule & .Cells(i, j) & ","
                    i = i + 1
                Wend
                RechercheIntitule = Left(RechercheIntitule, Len(RechercheIntitule) - 1)
     
            End With
            If bMasquer = False Then
                .Sheets("Orga").Visible = False
            End If
        End With
        Debug.Print "<-- RechercheIntitule"
    End Function
    Merci pour votre aide!

  2. #2
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2008
    Messages : 273
    Points : 323
    Points
    323
    Par défaut
    La variante string est limitée en nombre de caractères.
    Tu peux passer par un tableau pour y remédier.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    ce passage me semble bizarre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    While Not .Cells(1, j) Like Intitule
        j = j + 1
        If j > 250 Then
            Exit Function
        End If
    Wend
    Tu ne voulais pas plutôt sortir de la boucle while ici?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Tu m'interesses....Peux-tu me detailler avec du code stp?
    j'avais tester la propriété Value:=... memes erreurs
    j'ai changer l'output de RechercheIntitule en variant,string(),range....memes erreurs. Enfin, j'ai pas chercher trop longtemps ( ca fait déjà 5h que je suis dessus)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par decondelite Voir le message
    ce passage me semble bizarre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    While Not .Cells(1, j) Like Intitule
        j = j + 1
        If j > 250 Then
            Exit Function
        End If
    Wend
    Tu ne voulais pas plutôt sortir de la boucle while ici?
    Oui je sais j'etais un peu feignasse sur ce coup mais disons que c'est impossible que ma condition if soit validé mais c'etait juste au cas ou l'utilisateur (pas moi) fasse le con sur cette feuille Orga

  6. #6
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2008
    Messages : 273
    Points : 323
    Points
    323
    Par défaut
    tableau(1) = 200 premiers caractères par exemple
    tableau(2) = 200 suivants
    ...etc

    ta valeur = tableau(1) & tableau(2)

    Voilà le principe.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Après avoir relu l'aide en ligne sur le type string:
    Il existe deux types de chaînes : les chaînes de longueur variable et les chaînes de longueur fixe.

    Les chaînes de longueur variable peuvent contenir environ 2 milliards (2^31) de caractères.


    Les chaînes de longueur fixe peuvent contenir de 1 à environ 64 Ko (2^16) de caractères.
    Je me demande si c'est vraiment ça le problème...

    Exécute ton code au pas à pas (utilise des points d'arrêt pour "sauter" les boucles), et dis-nous à quel endroit il plante exactement, car là je ne vois pas trop...

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par decondelite

    Je me demande si c'est vraiment ça le problème...

    Exécute ton code au pas à pas (utilise des points d'arrêt pour "sauter" les boucles), et dis-nous à quel endroit il plante exactement, car là je ne vois pas trop...
    Je suis sur que c'est ca car si je mets moins d'éléments sur la feuille Orga la macro ne buggue pas.
    mais à partir d'un certain nombre d'elements ma macro me dit sort les erreurs précédements citées.
    Et la ligne "jaune" est la ligne Range (pas de prob pour rechercheIntitule) donc moi aussi je suis un peu surpris.....

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Ca te met l'erreur à cette ligne, mais une fois que le marqueur va ici regarde si il va à l'intérieur de RechercheIntitule en exécutant au pas à pas.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par oOVaveOo Voir le message
    tableau(1) = 200 premiers caractères par exemple
    tableau(2) = 200 suivants
    ...etc

    ta valeur = tableau(1) & tableau(2)

    Voilà le principe.
    T'es vraiment sur de ton coup?
    ta valeur je l'associe à quelle propriété de .Add?

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Les chaînes de longueur fixe peuvent contenir de 1 à environ 64 Ko (2^16) de caractères.
    Ca je pense que ça ne concerne que les chaînes entre guillemets (mais je n'en suis pas sûr il n'y a rien d'expliqué là-dessus dans l'aide en ligne: faire une recherche sur le web), et même si c'est une chaîne de longueur fixe à laquelle on a affaire, j'ai du mal à croire que tu puisses remplir 64ko de caractères en mémoire...

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par decondelite Voir le message
    Ca te met l'erreur à cette ligne, mais une fois que le marqueur va ici regarde si il va à l'intérieur de RechercheIntitule en exécutant au pas à pas.
    Il va dans RechercheIntitule. Il en ressort sans souci. La fonction est bien un string inercoupé de "," (comme je voulais).
    Donc j'en conclu que c'est vraiment au moment de "construire" la liste deroulante sur les cellules qu'il aime pas.

    Comme dit si l'output de RechercheIntitule est court genre :"a,e,fr,v,f" la methode .Add passe
    Mais si l'output de RechercheIntitule est long genre "montonton,matata,monpapi,mamami,moncousingermain,monbofquipuedelagueuleetquisentdesbrasetpasquedesbras,mamere,mononcle,sonfils,sabellesoeur,monfichier,monchien,grispou,lameremichele,gaston,tournesol,capitainehaddock,fafanlatulipe,winniloursoun,tigrou,texlebrontosore,perecastor,lespowerrangers,leschevaliersduzodiak,piolane,pechemelba,uncognacgarcon,jadoreexcelmaisvbacestdelavraimerdersurttquandcaplantettletempsetpkcaplantelaparticuelierement" la ca merde
    vais aller manger... ca me detendra....

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Il se peut que ce soit la valeur de la validation qui n'accepte pas des données d'une telle taille, et non pas la chaîne qui est trop longue (la preuve: ta fonction la donne sans problème).

    Essaye donc de stocker le résultat dans un nom de classeur, et lorsque tu ajoutes la validation, tu fais:

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 150
    Points : 100
    Points
    100
    Par défaut
    J'ai essayé mais j'y arrive pas.
    J'ajoute ma chaine obtenu dans workbook("Temp").names.Add "Statut", RechercheIntitule

    mais quand j'ecris Formula1:="=Statut"
    il me met une erreur

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Attention: les noms se rapportent à une plage de cellules.
    Tu vas devoir stocker ton résultat quelque part.

  16. #16
    Membre éprouvé
    Avatar de JackOuYA
    Inscrit en
    Juin 2008
    Messages
    1 040
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1 040
    Points : 1 191
    Points
    1 191
    Par défaut
    Bonsoir,

    je pencherai pour le fait que formula1 est limité à 255 caractéres.., tu pourrai utiliser une formule pour ce paramétre, vu que la formule doit être relative à des cellules de la feuille en cours plutôt que mettre tes paramétres sur une feuille cachée met tes paramétres sur une colonne caché puis pour formula1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .formula1="=$G$2:$G$258"
    tu dis quoi ...?

  17. #17
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Personnellement, dans ce genre de cas, je transfère les infos sous-jacentes de la liste du fichier d'application vers l'autre, puis je base la validation dessus. C'est beaucoup moins problématique.

Discussions similaires

  1. chaine trop longue pour être indexée
    Par ctobini dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 04/10/2007, 10h36
  2. Chaines trop longues
    Par Anduriel dans le forum Langage
    Réponses: 7
    Dernier message: 01/02/2006, 21h15
  3. Chaine trop longue
    Par valoji dans le forum Bases de données
    Réponses: 1
    Dernier message: 18/10/2005, 14h10
  4. Erreur ORA-01704 : constante de chaine trop longue
    Par verrec_s dans le forum Oracle
    Réponses: 22
    Dernier message: 13/12/2004, 15h30
  5. chaine trop longue pour envoyer en socket?
    Par jeje.r dans le forum C++Builder
    Réponses: 10
    Dernier message: 27/06/2003, 16h36

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