Microsoft 365 VBA - Objet dictionnary limité à 256 items

S[1]t'Yor

XLDnaute Junior
Bonjour tout le monde.

Je dois débugger le programme ci dessous. Il créer un objet dictionnary (appelé Dico) et regarde une grande plage (852 élément minimum) et vérifie s'il y a des #REF dans cette plage. Le problème est que Dico s'arrete à 256 items et pas un de plus. Or j'ai créer des erreurs forcés après la 256eme valeur, elle ne sont pas référencé dans Dico.

A l'aide SVP

Cordialement

S

VB:
Sub CorrigeErrRef()
'replace les références des repères en cas de suppression de lignes
'ne pas lancer cette commande sans avoir recaculé les cellules avant, sinon ça ne sert à rien...
'le mode de calcul doit donc être en automatique, pas manuel

'enlève la protection pour pouvoir travailler
Call Enleve_Protec

'met en dictionnaire la colonne de Repere pour déterminer les lignes en erreur

'mise en cache colonne de Repère
ligne_debut = 1
colonne = Range("Repere").Column
ligne_fin = Range("Der_ligne_Ferr").Row

Dim fer As Worksheet
Set fer = Worksheets("Nomenclature")

'sélectionne la feuille ferrure-170 pour éviter un bug lors de l'ouverture du fichier si une autre feuille est sélectionnée
fer.Select
Dim plage As Range
Set plage = Application.Worksheets("Nomenclature").Range(Cells(ligne_debut, colonne), Cells(ligne_fin, colonne))

'mise en dico de la plage colonne Repere
Set Dico = CreateObject("scripting.dictionary")
cle = ligne_debut
For Each Value In plage
    Dico.Add cle, Value
    cle = cle + 1
Next

'On Error Resume Next
'cherche toutes les lignes #Ref dans le dico
For Each k In Dico.keys
    'si une ligne est une ligne commençant par #
    If IsError(Dico.item(k)) Then
      
        'pour chaque colonne d'items ou de récap items met la formule de la cellule à jour
        fer.Cells(k, colonne).FormulaR1C1 = "=R[-1]C"

    End If
Next



End Sub
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @S[1]t'Yor :),

Je plussoie aux propos de @BrunoM45 que je salue ;) :
  • ce n'est pas engageant de laisser aux potentiels répondeurs le soin de dépiauter votre code pour déterminer les erreurs et ce d'autant plus que nous n'avons aucun échantillon représentatif des données sources
  • un minimum est de décrire en quelques phrases l'objectif initial de la macro pour "dégrossir" le sujet de la demande
Mettez toutes les chances de votre côté pour appâter les éventuels répondeurs.

A très bientôt pour la suite de ce fil ;) ...
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonsoir
l'erreur elle vient de là
For Each Value In plage
Dico.Add cle, Value
cle = cle + 1
Next
1
tu utilise value comme une variable alors que c'est un terme utilisé par office excel
2 mais combien même tu aurais utilisé autre chose sce serait bonnet blanc/blanc bonnet
en effet
for each value in plage
( ça ve dire quoi pour toi?)
par ce que pour excel VBA ca veut dire
for each tout object ou propertie in plage
en effet ca peut etre
for each row in plage.rows
ou
for each colon in plage.columns
ou encore
for each cel in plage.cells
ou bien encore
for each com in plages.comments
etc..etc..
comme vba ne peut pas décider il tamponne une erreur
et c'est la que la notion explicite si souvent décriée prend tout son sens
donc pour toi c'est
dim Valoche
For Each Valoche In plage.cells
Dico.Add cle, Valoche
cle = cle + 1
Next


bien que je vois pas trop l’intérêt ici dans ce contexte d'utiliser un dictionnaire
sauf si valoche devient la clé là ça a du sens

oserais ajouter que la méthode Add du dico peut aussi te tamponner une erreur au cas ou la clé existe déjà
la méthode "Add doit toujours être utilisée avec un test if dico.exists(clé)then
mais il est vrai qu'avec un fichier, les tests et la compréhension du contexte en serait plus aisée

et si je regarde plus loin après tu va chercher autre chose dans les keys du dico
donc a mon avis tu n'a pas bien compris la mécanique du dictionnaire
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir le fil,

@TooFatBoy
En attendant le où de patrick
Voici ce que j'ai dans ma besace concernant les dictionary

NB:
Normalement ... à force de mettre les narines dans VBE à longueur de journé, on peut ou moins anglophone , non ? ;)
Sinon, voir avec le G de GAFAM ;)


EDITION: Il y a aussi ce que nous laisse JB
 

TooFatBoy

XLDnaute Barbatruc
NB: Quand tu vbaises, tu causes english, non ? ;)
Il y a pas mal de temps j'avais essayé un BASIC en français, mais j'avoue que pour moi c'était bien compliqué...
Pour la programmation c'est plus simple de le faire en english parce que ce sont les mêmes mot-clés pour tous les langages (ou presque), mais ça n'a rien à voir avec des textes en anglais. ;)
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
l'erreur elle vient de là
For Each Value In plage
Dico.Add cle, Value
cle = cle + 1
Next
Bonjour @patricktoulon :),

Je ne vois pas en quoi, VBA ferait une erreur. D'ailleurs VBA n'en fait pas. Que le code fasse des choses logiques, c'est une autre question...

La question est pourquoi le dictionary s'arrête-t-il à 256 éléments ? Là aussi, je pense que c'est une illusion de la fenêtre espion quand on lui demande d'afficher le "dico".

La principale question est de savoir ce qu'on met dans le dico en tant qu'item.
Et dans ce cas, on n'y met pas une valeur mais un range qui correspond successivement à chaque "cellule "de la plage (et non à la valeur contenue dans la cellule).

VB:
For Each  x In plage
   Dico.Add cle, x
on insère dans le dico un objet range (identique à In plage.cells)

VB:
For Each  x In plage.value
   Dico.Add cle, x
on insère dans le dico une valeur

Mais dans le cas qui nous préoccupe, l'emploi d'un dictionary me semble totalement superfétatoire.

L'utilisation de noms de variables (déclarées ou non) comme étant des mots-clefs de VBA ou d'Excel (et des propriétés de sa hiérarchie d'objets) risque d'avoir des effets de bords bizarres et non détectables facilement.

Je ne vois pas pourquoi le Option Explicit est critiqué. C'est la base de la programmation (s'interroger sur les variables qu'on utilise) et ça évite tellement de faute de frappe involontaire.
 
Dernière édition:

S[1]t'Yor

XLDnaute Junior
Bonjour tout le monde

Merci pour vos réponses. Je ne peux pas mettre de fichier en PJ car ce sont des fichiers de mon travail que je ne peux pas partager (vous le comprenez tous je pense). Épurer ce fichier me demanderai un taf considérable et je risque de perdre pas mal d'info. enfin ce fichier est une usine à gaz monumental que je dois débugger dans tout les sens car ça n'a jamais été mis à jour depuis 2013. Si je vous le partage, je pense qu'a aucun moment cela vous aidera.


Pour expliquer en gros le programme (cc @mapomme ) :
- J'enleve la protection de la feuille avec une fonction propre au fichier
- Je me place sur la bonne feuille pour éviter toute erreur
- je stocke les valeurs de la colonne "Repere" dans un Dico
- Je parcoure chaque varaible de ce dico
- Si je rencontre un #REF dans Dico ou une erreur quelconque je copie colle une formule du dessus dans ma cellue erroné

PB majeur : Plage de donnée --> plus de 850 données / Dico --> 256 valeurs

Question : Pourquoi Dico est bloqué à 256 valeurs ? Il peut seulement y avoir un Integer k ici Dico.Item(k) ?

Cordialement

S
 

Statistiques des forums

Discussions
315 091
Messages
2 116 111
Membres
112 662
dernier inscrit
lou75