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 :

Limite de caractères avec Scripting.Dictionary [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
    Étudiant
    Inscrit en
    Août 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 17
    Par défaut Limite de caractères avec Scripting.Dictionary
    Bonjour à tous,

    J'utilise le code suivant pour éliminer les doublons d'une liste et copier le résultat dans une nouvelle colonne en triant les valeurs par ordre alphabetique

    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
     
    Option Explicit
    Sub test_dico()
     
    Dim MonDico4 As Object
    Dim c4 As Variant
     
         Set MonDico4 = CreateObject("Scripting.Dictionary")
            With Worksheets("Sheet1")
                For Each c4 In .Range("A2:A" & .Cells(.Rows.count, 1).End(xlUp).Row)
                    If Not MonDico4.exists(Trim(c4.Value)) Then MonDico4.Add Trim(c4.Value), Trim(c4.Value)
                Next c4
                With Worksheets("Sheet1").Range("D2").Resize(MonDico4.count, 1)
                    .Value = Application.Transpose(MonDico4.keys)
                    .Sort Key1:=Worksheets("Sheet1").Range("D2"), Order1:=xlAscending, Header:=xlNo
                End With
            End With
        Set MonDico4 = Nothing
    End Sub
    Le problème est le suivant :

    Si une cellule contient plus de 256 caraères, la macro ne s'execute plus et le message d'erreur suivant apparait :

    Run-time Error' '13:
    Type mismatch

    Est-ce que quelqu'un aurait déjà rencontré ce problème et comment puis-je y remédier ?
    Je bloque dessus depuis bientôt 2 jours

    Merci d'avance

  2. #2
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Perso, je réaliserais une copie de la plage puis une suppression des doublons. Ca éviterait la boucle, souvent pénalisante en termes de performances, et le code serait bien plus simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Test()
      Dim Source As Range
      Dim Target As Range
     
      Set Source = Range("a1:a10")
      Set Target = Range("c1")
     
      Source.Copy Destination:=Target
      Set Target = Target.Resize(Source.Rows.Count)
      Target.RemoveDuplicates Columns:=1, Header:=xlNo
      Target.Sort Target
    End Sub
    PS: je sais que cela ne répond pas à ta question concernant l'utilisation d'un dico. Je pense toutefois que l'erreur Type Mismatch n'est pas due à une longueur trop importante, mais probablement à un type de donnée qui n'est pas accepté. Il faudrait vérifier les valeurs de la clé et de la valeur passée pour voir si des petites crasses ne sont pas logées dans tes cellules.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 17
    Par défaut
    Merci pour ta réponse rapide, simple et efficace !

    Effectivement cela ne répond pas à ma question mais l'objectif est d'avoir une solution au problème et cette solution s'affranchie de la limite de caractères du dico.

    Ma colonne étant de taille variable j'ai apporté la modification suivante à ton code :

    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
     
    Sub Test()
      Dim Source As Range
      Dim Target As Range
      Dim last_row As Long
     
        last_row = Range("A" & Rows.count).End(xlUp).Row
     
      Set Source = Range("A2:A" & last_row)
      Set Target = Range("c1")
     
      Source.Copy destination:=Target
      Set Target = Target.Resize(Source.Rows.count)
      Target.RemoveDuplicates Columns:=1, Header:=xlNo
    End Sub

    Dernier petit soucis

    Par rapport à la solution avec le dico je perds le tri par ordre alphabétique dans la nouvelle liste sans doublon.
    Je souhaiterais également obtenir uniquement les valeurs (pas la mise en forme) de la colonne de destination.

    Si jamais tu as une idée , en attendant je vais continué de chercher.

    Merci encore

  4. #4
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    J'ai édité mon message pour ajouter la ligne de tri pendant que tu rédigeais ta réponse, à mon avis...

    target.sort target devrait faire l'affaire (par rapport au code que j'ai proposé...)

    Citation Envoyé par Chichinois Voir le message
    Merci pour ta réponse rapide, simple et efficace ![...]
    Le principe de cette simplicité/Efficacité réside dans ma signature: Quand on fait du VBA pour Excel, on pense d'abord Excel...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Voilà un code qui ne copie que les valeurs, supprime les doublons puis trie par ordre croissant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Test()
      Dim Source As Range
      Dim Target As Range
     
      Set Source = Range("a1:a10")
      Set Target = Range("c1")
     
      Source.Copy
      Target.PasteSpecial xlPasteValues
      Set Target = Target.Resize(Source.Rows.Count)
      Target.RemoveDuplicates Columns:=1, Header:=xlNo
      Target.Sort Target
    End Sub
    NB: Certaines syntaxes méconnues peuvent être retrouvées grâce à l'enregistreur de macro qui singe les actions de l'utilisateur
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 17
    Par défaut
    J'étais en train de te répondre quand avant de posté j'ai vérifié si tu ne m'avais pas déjà répondu pour ne pas me faire avoir 2 fois et j'ai bien fait !

    Le code marche parfaitement en plus d'être plus rapide que ma solution initiale avec des réponses dans un temps record (meme plus le temps de poster entre 2 réponses )

    Merci beaucoup pour ton aide !

  7. #7
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    ou encore via un filtre avancé pour directement effectuer la copie sans doublon
    et une deuxième ligne de code pour le tri …

    ___________________________________________________________________________________________________________
    Je suis Paris, Barcelone, London, Manchester, Egypte, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  8. #8
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    [...]
    ou encore via un filtre avancé pour directement effectuer la copie sans doublon
    [...]
    Judicieux, mais je pense que ça recopie le format, or la demande précisait un copier-coller valeurs...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 17
    Par défaut
    J'ai fait un essai avec le filtre avancé.

    Le problème c'est que certaine ligne sont vides dans les colonnes de mon tableau et la taille des listes variables, du coup je ne suis pas parvenue à quelque chose de robuste avec les filtres.
    Le problème exposé dans ce post n'expose pas toutes les contraintes du fichier excel sur lequel je travaille.

    Après je ne connais que les fonctions "basique" du filtre avancé mais il est peut-être possible de faire ce que je souhaitais avec cet outil.

    Merci pour la suggestion en tout cas

  10. #10
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    @ Pierre : oui effectivement indiqué en bas du post #3, solution restant valable pour la "présentation" initiale …

    @ Chichi : reste sur la voie de Pierre.

  11. #11
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Re,

    Je suppose que dans le cas d'un filtre avancé (étant déjà très rapide), un ClearFormats pourrait faire l'affaire en fin de code …
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

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

Discussions similaires

  1. Copier une ligne avec un nombre limité de caractères
    Par nyarlath dans le forum Shell et commandes GNU
    Réponses: 16
    Dernier message: 16/05/2013, 15h36
  2. [XL-2003] limitation à 255 caractères copie avec liaison
    Par jfhoo dans le forum Excel
    Réponses: 2
    Dernier message: 23/06/2012, 13h25
  3. [Toutes versions] Scripting Dictionary avec plusieurs descendants
    Par seba_stien dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 14/10/2009, 11h41
  4. Erreur avec "Scripting.Dictionary"
    Par jubourbon dans le forum VBScript
    Réponses: 3
    Dernier message: 10/04/2009, 14h34
  5. Réponses: 4
    Dernier message: 27/10/2008, 07h27

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