VBA Erreur 13: Array alimenté par des dictionnaires

avaya

XLDnaute Nouveau
Bonjour à tous,


Dans un projet VBA, j'ai un bug que je n'arrive pas à résoudre et dont pourtant je crois connaître l'origine.

La partie du programme en question:
-Remplit un array selon une union de colonnes discontinues de Range (colonnes vertes + blanches)
-Trie l'array selon les colonnes vertes
-Somme les lignes selon les colonnes vertes à l'aide de dictionnaires
-Ecrase l'ancien array en le remplissant par les dictionnaires
(-Affiche les valeurs de l'array dans une autre feuille)

J'ai remarqué qu'il n'y a pas de bug lorsque les cellules vertes de la ligne 2 ne sont pas vides.
Du coup, je vous ai fournis en pièce jointe deux feuilles de test, une avec bug (test 1), une sans (test 2).

Le bug survient sur la ligne:
Code:
TableauEntiteSomme = Application.Transpose(Array(mondicoA.items, mondicoB.items, mondicoC.items, mondicoD.items, mondicoE.items, mondicoF.items, mondicoG.items, mondicoH.items, mondicoI.items))
C'est une erreur d'incompatibilité de type 13.

J'ai du mal à comprendre pourquoi il y a un bug puisque l'array est trié avant le remplissage des dictionnaires.
On voit bien avec le débuggeur que les array extrait des feuilles test1 et test2 sont identiques après le tri.

Est-ce que quelqu'un pourrait m'expliquer pourquoi il y a l'erreur?

Merci d'avance


avaya
 

Pièces jointes

  • QuestionArray.xlsm
    136.3 KB · Affichages: 38

avaya

XLDnaute Nouveau
Re : VBA Erreur 13: Array alimenté par des dictionnaires

Gosselien,

Un TCD ne me convient pas car le programme devra traiter de lourdes bases de données (l'exemple que j'ai envoyé est une version simpliste à la fois du programme et des données).
Je préfère travailler en array car c'est plus rapide et plus propre.

Peux-tu me dire ce que tu ne comprends pas pour que je puisse t'expliquer?
Peut-être que tu sauras m'aider après des explications complémentaires de ma part.

avaya


N.B: Dans le fichier d'exemple, l'erreur 13 se déclenche avec la procédure Test1 (Module3) qui prend les données de la feuille Test1.
La procédure Test2 (Module3) qui prend les données de la feuille Test2 fonctionne.
Les procédures sont identiques.
La différence se fait au niveau des feuilles:
Feuille Test1 -> B2 vide
Feuille Test2 -> B2 non vide (j'ai juste interchangé la ligne 2 avec la 3 de la feuille Test1)

J'aimerais comprendre pourquoi la procédure bug si B2 est vide...
 

tototiti2008

XLDnaute Barbatruc
Re : VBA Erreur 13: Array alimenté par des dictionnaires

Bonjour avaya, Bonjour gosselien :),

Je pense que Application.transpose fonctionne sur un tableau à 2 dimensions, mais pas sur un tableau de tableau
ce n'est pas la même chose
Il te faut reconstruire un tableau à 2 dimensions, tant qu'à faire directement dans le bon sens, en créant une variable tableau à 2 dimensions

Edit : j'ai tout faux, avec une valeur en B2 ça marche effectivement, je repars en recherche^^
 
Dernière édition:

gosselien

XLDnaute Barbatruc
Re : VBA Erreur 13: Array alimenté par des dictionnaires

Je préfère travailler en array car c'est plus rapide et plus propre.

Peux-tu me dire ce que tu ne comprends pas pour que je puisse t'expliquer?
Peut-être que tu sauras m'aider après des explications complémentaires de ma part.
avaya

Sorry , mais ça vole trop haut pour moi :( c'était juste une proposition, les TCD étant très rapides et puissants, sait on jamais :)

P.
 

tototiti2008

XLDnaute Barbatruc
Re : VBA Erreur 13: Array alimenté par des dictionnaires

Re,

un essai de correction de TriTabMult

Code:
Sub TriTabMult(Tbl, Optional ColTri1, Optional Coltri2, Optional Coltri3, Optional Coltri4, Optional Coltri5, Optional Coltri6, Optional Coltri7) 
If IsMissing(ColTri1) Then ColTri1 = 1
 Dim clé(): ReDim clé(LBound(Tbl) To UBound(Tbl))
 Dim idx() As Long: ReDim idx(LBound(Tbl) To UBound(Tbl))
 Dim b(): ReDim b(LBound(Tbl) To UBound(Tbl), LBound(Tbl, 2) To UBound(Tbl, 2))
If Not IsEmpty(Tbl(1, ColTri1)) And (IsNumeric(Tbl(1, ColTri1)) Or IsDate(Tbl(1, ColTri1))) Then tri1 = "num"
If Not IsMissing(Coltri2) Then If Not IsEmpty(Tbl(1, Coltri2)) And (IsNumeric(Tbl(1, Coltri2)) Or IsDate(Tbl(1, Coltri2))) Then trix2 = "num"
If Not IsMissing(Coltri3) Then If Not IsEmpty(Tbl(1, Coltri3)) And (IsNumeric(Tbl(1, Coltri3)) Or IsDate(Tbl(1, Coltri3))) Then tri3 = "num"
If Not IsMissing(Coltri4) Then If Not IsEmpty(Tbl(1, Coltri4)) And (IsNumeric(Tbl(1, Coltri4)) Or IsDate(Tbl(1, Coltri4))) Then tri4 = "num"
If Not IsMissing(Coltri5) Then If Not IsEmpty(Tbl(1, Coltri5)) And (IsNumeric(Tbl(1, Coltri5)) Or IsDate(Tbl(1, Coltri5))) Then tri5 = "num"
If Not IsMissing(Coltri6) Then If Not IsEmpty(Tbl(1, Coltri6)) And (IsNumeric(Tbl(1, Coltri6)) Or IsDate(Tbl(1, Coltri6))) Then tri6 = "num"
If Not IsMissing(Coltri7) Then If Not IsEmpty(Tbl(1, Coltri7)) And (IsNumeric(Tbl(1, Coltri7)) Or IsDate(Tbl(1, Coltri7))) Then tri7 = "num"
 For i = LBound(Tbl) To UBound(Tbl)
    If tri1 = "num" Then col1 = Format(Tbl(i, ColTri1), "0000000") Else col1 = Tbl(i, ColTri1)
    If Not IsMissing(Coltri2) Then
      If trix2 = "num" Then col2 = Format(Tbl(i, Coltri2), "0000000") Else col2 = Tbl(i, Coltri2)
    Else
      col2 = ""
    End If
    If Not IsMissing(Coltri3) Then
      If tri3 = "num" Then col3 = Format(Tbl(i, Coltri3), "0000000") Else col3 = Tbl(i, Coltri3)
    Else
      col3 = ""
    End If
    If Not IsMissing(Coltri4) Then
      If tri4 = "num" Then col4 = Format(Tbl(i, Coltri4), "0000000") Else col4 = Tbl(i, Coltri4)
    Else
      col4 = ""
    End If
    If Not IsMissing(Coltri5) Then
      If tri5 = "num" Then col5 = Format(Tbl(i, Coltri5), "0000000") Else col5 = Tbl(i, Coltri5)
    Else
      col5 = ""
    End If
    If Not IsMissing(Coltri6) Then
      If tri6 = "num" Then col6 = Format(Tbl(i, Coltri6), "0000000") Else col6 = Tbl(i, Coltri6)
    Else
      col6 = ""
    End If
    If Not IsMissing(Coltri7) Then
      If tri7 = "num" Then col7 = Format(Tbl(i, Coltri7), "0000000") Else col7 = Tbl(i, Coltri7)
    Else
      col7 = ""
    End If
    clé(i) = col1 & "_" & col2 & "_" & col3 & "_" & col4 & "_" & col5 & "_" & col6 & "_" & col7
    idx(i) = i
 Next i
 Call QuickI(clé(), idx(), LBound(clé), UBound(clé))
 For lig = LBound(clé) To UBound(clé)
   For col = LBound(Tbl, 2) To UBound(Tbl, 2): b(lig, col) = Tbl(idx(lig), col): Next col
 Next lig
 For lig = LBound(clé) To UBound(clé)
    For col = LBound(Tbl, 2) To UBound(Tbl, 2): Tbl(lig, col) = b(lig, col): Next col
 Next lig
End Sub

Edit : c'est pas tous les jours qu'on complète un code de Monsieur JB :rolleyes:
A sa décharge, je ne l'aurais pas vu venir non plus ce soucis là
 
Dernière édition:

avaya

XLDnaute Nouveau
Re : VBA Erreur 13: Array alimenté par des dictionnaires

Bonjour à vous deux,


Gosselien:
Ce n'est pas grave, merci quand même pour ta suggestion!

Tototiti:
Je te remercie infiniment pour ta solution qui marche super bien!
Ca parait tout bête maintenant mais je n'ai pas du tout pensé que l'erreur pouvait venir de là.
Le module de JB est tellement bien écrit que je ne l'ai pas remis en cause (quoique effectivement, c'est une situation pas trop commune d'avoir des cellules vides à trier).
En tout cas, encore mille merci pour ton aide, c'est génial!!

Passez une bonne journée ; )


avaya
 

Discussions similaires

Statistiques des forums

Discussions
312 488
Messages
2 088 836
Membres
103 972
dernier inscrit
steeter