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
 

TooFatBoy

XLDnaute Barbatruc
a voir pourquoi pas
Il n'y a que toi qui peux savoir si la structure du tableau le permet ou pas. 😉

Dans ce cas, deux lignes de VBA doivent suffir.
Et ça peut même être fait sans VBA, à la main, ça prend deux secondes.


ps : j'espère que tu travailles sur une copie et non sur le fichier originel, ou éventuellement que tu travailles sur le fichier originel mais que tu as une sauvegarde à côté.
 

S[1]t'Yor

XLDnaute Junior
Il n'y a que toi qui peux savoir si la structure du tableau le permet ou pas. 😉

Dans ce cas, deux lignes de VBA doivent suffir.
Et ça peut même être fait sans VBA, à la main, ça prend deux secondes.


ps : j'espère que tu travailles sur une copie et non sur le fichier originel, ou éventuellement que tu travailles sur le fichier originel mais que tu as une sauvegarde à côté.
le tableau est varie trop d'une ligne à l'autre, rien n'est régulier et c'est un peu casse gueule.

Tqt pas je travaille sur une copie
 

mapomme

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

Et ma proposition du fil #21, elle compte pour des prunes ? C'est du pipi de chat ?

Du coup, ne peux-tu tout simplement copier la formule de la première cellule de la colonne et la coller dans toute la colonne ?
Bonjour @TooFatBoy :),
Ce n'est pas ce qu'il désire me semble-t-il, ce ne serait à faire que pour les cellules dont la formule initiale retourne une erreur.
 

TooFatBoy

XLDnaute Barbatruc
Bonjour @TooFatBoy :),
Ce n'est pas ce qu'il désire me semble-t-il, ce ne serait à faire que pour les cellules dont la formule initiale retourne une erreur.
Bonjour ma🍏,
Oui j'ai bien compris, mais généralement dans un tableau toutes les cellules d'une même colonne ont la même structure, et si on peut coller la formule du dessus dans n'importe quelle cellule donnant une erreur, logiquement on devrait pouvoir coller ladite formule dans toute la colonne.

Mais ici ça ne semble pas être le cas. 😕
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re à tous,

Bon, sans les données sources (ne serait qu'un petit échantillon représentatif), ça ne sert à rien de gloser.

En tout cas si tout le reste du code est de cet acabit, notre demandeur n'est pas au bout de ses peines pour le décortiquer et le faire fonctionner (dure la dernière année d'étude !).

Bon courage de la part d'un Angevin 👌.
 

laurent950

XLDnaute Barbatruc
Bonsoir

Votre variable "Value" c'est une variable objet de type range.

VB:
Sub CorrigeErrRef()
ligne_debut = 1
colonne = Range("Repere").Column
ligne_fin = Range("Der_ligne_Ferr").Row
Dim fer As Worksheet
Set fer = Worksheets("Nomenclature")
fer.Select
Dim plage As Range
Set plage = fer.Range(Cells(ligne_debut, colonne), Cells(ligne_fin, colonne))
Set Dico = CreateObject("scripting.dictionary")
cle = ligne_debut
For Each Value In plage
    Dico.Add cle, Value
    cle = cle + 1
Next
For Each k In Dico.keys
    Set Value = Dico.Item(k)
    If IsError(Value) Then
        Value.FormulaR1C1 = "=R[-1]C"
    End If
Next
End Sub
 
Dernière édition:

S[1]t'Yor

XLDnaute Junior
Bonsoir

Votre variable "Value" c'est une variable objet de type range.

VB:
Sub CorrigeErrRef()
ligne_debut = 1
colonne = Range("Repere").Column
ligne_fin = Range("Der_ligne_Ferr").Row
Dim fer As Worksheet
Set fer = Worksheets("Nomenclature")
fer.Select
Dim plage As Range
Set plage = fer.Range(Cells(ligne_debut, colonne), Cells(ligne_fin, colonne))
Set Dico = CreateObject("scripting.dictionary")
cle = ligne_debut
For Each Value In plage
    Dico.Add cle, Value
    cle = cle + 1
Next
For Each k In Dico.keys
    Set Value = Dico.Item(k)
    If IsError(Value) Then
        Value.FormulaR1C1 = "=R[-1]C"
    End If
Next
End Sub
Merci je vais regarder ca
 

Statistiques des forums

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