XL 2013 Erreur "Incompatibilité de type" avec des dictionnaires en vba

Tubule

XLDnaute Nouveau
Bonjour,

J'ai un fichier (ci-joint) dont le but est d'exploiter des données issues de 2 exports différents (dans onglets "Export1" et "Export2"). Ainsi, une fois que l'on a collé les données issues des 2 exports, il faut cliquer sur une macro à chaque fois située dans l'onglet de l'export. Ainsi, des corrections et des calculs sont effectués.

Ce fichier comporte 4 dictionnaires (remplis et modifiables dans des onglets nommés "Dicos123" et "Dico4") qui génèrent des erreurs "incompatibilité de type". En effet, lorsque je clique sur la macro de l'export1, j'obtiens l'erreur incompatibilité de type et lors du débogage (issue de la macro "export1", la ligne ci-dessous est surlignée :

VB:
LO_OP.Range(i + 1, 12).Value = DicoIO(LO_OP.Range(i + 1, 1).Value)(2)

et lors de la macro de l'export2, j'obtiens le même type d'erreur, avec cette ligne surlignée :
Code:
habilitation = DicoIO(iocourant)(0)

Je sens qu'il y a une erreur avec le dictionnaire DicoIO mais je ne comprends pas. J'ai déclaré toutes mes variables et pour moi tout concorde.
Je vous remercie par avance.










Attention, je ne sais pas pourquoi, mais lorsqu'on lance la macro, une autre erreur est générée. Je pense que cela est dû au fait que j'ai vidé le classeur.
 

Pièces jointes

  • test.xlsm
    311.8 KB · Affichages: 7

patricktoulon

XLDnaute Barbatruc
bonjour
tout simplement parce que tu essaie semble t-il de gérer les items de ton dico comme une variable tableau même si ça en est un en quelque sorte
et ca n'est pas possible
on fait PAS !!! x=mondico("toto")(2)
un dico n'a que des keys et items


exemple
VB:
Sub test()
Dim dico As Object, Dkeys
Set dico = CreateObject("scripting.dictionary")
dico("toto") = 36
dico("titi") = 44
dico("riri") = 25

Dkeys = dico.keys

MsgBox dico("toto")'donne 36
MsgBox Dkeys(0)'donne "toto"
End Sub
on constate aussi et c'est à savoir que si oon utilise pas de variables intermediaires pour le dicokeys
on ne peut le gerer
exemple dico.keys(0) ne fonctionnera pas
j'ai tout dis ;)
 

Tubule

XLDnaute Nouveau
Merci beaucoup pour votre aide patricktoulon !
Je ne connais pas grand-chose aux dictionnaire, ça m'aide bien.

Je viens de tester de nouveau, après modifications comme vos dires, mais l'erreur persiste ; j'ai dû me tromper ..
Voici mes modifications, si je prends en exemple la ligne de l'export 1 qui me pose un problème :

A la place de (module Export1, après le else, avant dernière-ligne) :
VB:
Dim ws_OP As Worksheet
    Dim i As Integer
    Dim decalage As Long
    Dim LO_OP As ListObject
    Dim DicoAct As New Dictionary, DicoIO As New Dictionary
    
    
    Set ws_OP = Sheets("Export1")
    Set LO_OP = ws_OP.ListObjects("Tab_ChargeOP")
    
    Call Variables.CreationDicoAct 'Transfert dans un dictionnaire des charges et décalages de chaque activité.
    If Not VariablesCreees Then Call Variables.CreationVariables 'Si le nom n'existe pas dans la liste, on le crée
    
        For i = 1 To LO_OP.ListRows.Count 'On parcourt le tableau ligne par ligne, dans la colonne "IO"
            'Correction du regroupement :
                If LO_OP.Range(i + 1, 1).Value = "?" Then 'Si l'IO est encore inconnu
                    LO_OP.Range(i + 1, 12).Value = LO_OP.Range(i + 1, 4).Value 'Le regroupement "corrigé" est celui de l'export
                Else
                    LO_OP.Range(i + 1, 12).Value = DicoIO(LO_OP.Range(i + 1, 1).Value)(2) 'Si l'on connaît le nom de la personne, alors le regroupement est celui de référence et non celui qui est écrit dans la colonne "RgtAct"
                End If

J'écris donc, après avoir déclaré une variable intermédiaire (avant-dernière-ligne, toujours):
Code:
E
Dim ws_OP As Worksheet
    Dim i As Integer
    Dim decalage As Long
    Dim LO_OP As ListObject
    Dim DicoAct As Object, DicoIO As Object, DkeysAct As Variant, DKeysIO As Variant
    
    'Création des dictionnaires
    Set DicoAct = CreateObject("scripting.dictionary") 'Création des dictionnaires
    Set DicoIO = CreateObject("scripting.dictionary")
        
    'Création d'une variable intermédiaire pour chaque dictionnaire, ce qui permet de les gérer
    DkeysAct = DicoAct.Keys
    DKeysIO = DicoIO.Keys
    
    Set ws_OP = Sheets("Export_chargeOP")
    Set LO_OP = ws_OP.ListObjects("Tab_ChargeOP")
    
    Call Variables.CreationDicoAct 'Transfert dans un dictionnaire des charges et décalages de chaque activité.
    If Not VariablesCreees Then Call Variables.CreationVariables 'Si l'IO n'existe pas, on le crée dans la feuille tampon (et T_Param)
    
        For i = 1 To LO_OP.ListRows.Count 'On parcourt le tableau ligne par ligne, dans la colonne "IO"
            'Correction du regroupement :
                If LO_OP.Range(i + 1, 1).Value = "?" Then 'Si l'IO est encore inconnu
                    LO_OP.Range(i + 1, 12).Value = LO_OP.Range(i + 1, 4).Value 'Le regroupement "corrigé" est celui de l'export
                Else
                    LO_OP.Range(i + 1, 12).Value = DKeysIO(LO_OP.Range(i + 1, 1).Value)(2) 'Si l'on connaît l'IO, alors le regroupement est celui de référence et non celui qui est écrit dans la colonne "RgtAct"
                End If

Qu'en pensez-vous ?
Merci
 

Pièces jointes

  • test.xlsm
    306.3 KB · Affichages: 4

patricktoulon

XLDnaute Barbatruc
bon ben au vue de ceci ci dessous tu n'a rien compris
VB:
 LO_OP.Range(i + 1, 12).Value = DicoIO(LO_OP.Range(i + 1, 1).Value)(2) 'Si l'on connaît le nom de la personne, alors le regroupement est celui de référence et non celui qui est écrit dans la colonne "RgtAct"
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @patricktoulon ;);););)

En cherchant bien et pour le fun (et parce que je suis tordu) :
VB:
Sub Test()
Dim dico
   Set dico = CreateObject("scripting.dictionary")

   dico.Add "toto", Array("c'est zéro", "c'est un", "c'est deux")

   MsgBox dico("toto")(2)

End Sub

:D:D:D:D

nota : @Tubule : ne cherchez pas pour l'instant à comprendre ce code qui ne concerne pas votre problème:confused:
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Moi si j'ai un conseil à vous donner c'est de ne jamais donner à des variables locales les mêmes noms qu'à des variables globales.
Une astuce peut être de prendre des noms plus cours pour les variables déclarées dans les procédures. Par exemple déclarer DIO au lieu de DicoIO le Dictionary volatile de la Sub CreationVariableses, seulement défini pendant son exécution, pour ne plus le confondre avec le DicoIO Public déclaré dans le module export2.
C'est déjà assez difficile sans cela de s'y retrouver sans avoir à tenir compte de ce que si une variable locale porte le même nom qu'une variable globale (qu'elle soit Public ou Private peu importe) elle l'emporte sur celle-ci quant à ce qu'elle désigne.
En résumé: la Sub CreationVariables n'initialise pas le DicoIO Public déclaré dans le module export2, elle en initialise un du même nom qu'elle est seule à manipuler et qui n'est pas gardé. Pareil pour le DicoJferies.
 
Dernière édition:

Discussions similaires

Réponses
17
Affichages
1 K

Statistiques des forums

Discussions
311 720
Messages
2 081 925
Membres
101 841
dernier inscrit
ferid87