Erreur d'exécution 13 : Incompatibilité de type
Bonjour à tous,
Je travaille actuellement dans un classeur dont la macro rencontre une erreur 13 "Incompatibilité de type". Cette macro a pour fonction d'extraire de plusieurs tableaux une liste de valeurs (textuelles) sans doublon. Ex: elle extrait du tableau W3:AF22 toutes les valeurs uniques et les fait apparaître dans la colonne AH3, puis elle s'attaque au tableau W23:W42 et fait apparaître les valeurs dans la colonne AJ3...
Voici sans plus attendre le code avec la ligne problématique en gras. Le fichier est également disponible ci-après.
Option Explicit
Sub ListeSansDoublons()
Dim wS As Worksheet
Dim monDico
Dim Plage As Range
Dim c As Range
Application.ScreenUpdating = False
Set wS = Worksheets(1)
'-----------------------------------------------------------------------
Set monDico = CreateObject("Scripting.Dictionary")
Set Plage = wS.Range("W3:AF22")
If Application.CountA(Plage) <> 0 Then
For Each c In Plage
If c <> "" Then monDico(c.Value) = ""
Next c
End If
[AH3].Resize(monDico.Count, 1) = Application.Transpose(monDico.keys)
Set monDico = Nothing: Set Plage = Nothing
'-----------------------------------------------------------------------
Set monDico = CreateObject("Scripting.Dictionary")
Set Plage = wS.Range("W23:AF42")
If Application.CountA(Plage) <> 0 Then
For Each c In Plage
If c <> "" Then monDico(c.Value) = ""
Next c
[b] [AJ3].Resize(monDico.Count, 1) = Application.Transpose(monDico.keys)[/b]
End If
Set monDico = Nothing: Set Plage = Nothing
'-----------------------------------------------------------------------
Set monDico = CreateObject("Scripting.Dictionary")
Set Plage = wS.Range("W43:AF62")
If Application.CountA(Plage) <> 0 Then
For Each c In Plage
If c <> "" Then monDico(c.Value) = ""
Next c
[AL3].Resize(monDico.Count, 1) = Application.Transpose(monDico.keys)
End If
Set monDico = Nothing: Set Plage = Nothing
'-----------------------------------------------------------------------
Set monDico = CreateObject("Scripting.Dictionary")
Set Plage = wS.Range("W63:AF82")
If Application.CountA(Plage) <> 0 Then
For Each c In Plage
If c <> "" Then monDico(c.Value) = ""
Next c
[AN3].Resize(monDico.Count, 1) = Application.Transpose(monDico.keys)
End If
Set monDico = Nothing: Set Plage = Nothing
'-----------------------------------------------------------------------
Set monDico = CreateObject("Scripting.Dictionary")
Set Plage = wS.Range("W83:AF102")
If Application.CountA(Plage) <> 0 Then
For Each c In Plage
If c <> "" Then monDico(c.Value) = ""
Next c
[AP3].Resize(monDico.Count, 1) = Application.Transpose(monDico.keys)
End If
Set monDico = Nothing: Set Plage = Nothing
'-----------------------------------------------------------------------
Set monDico = CreateObject("Scripting.Dictionary")
Set Plage = wS.Range("W103:AF122")
If Application.CountA(Plage) <> 0 Then
For Each c In Plage
If c <> "" Then monDico(c.Value) = ""
Next c
[AR3].Resize(monDico.Count, 1) = Application.Transpose(monDico.keys)
End If
Set monDico = Nothing: Set Plage = Nothing
'-----------------------------------------------------------------------
Set wS = Nothing
End SubAvez-vous une idée de la cause du problème ? Il est peut-être important de savoir que la macro fonctionnait parfaitement, mais que suite à un léger remaniement de l'organisation des données de mon fichier (suppression d'informations inutiles), j'ai du adapter la macro uniquement au niveau des références (colonnes, plages...).
Merci au génie qui trouvera la clé de ce mystère.
NB : Le fichier tire ses données d'autres fichiers. Ne vous étonnez donc pas d'avoir des problèmes de référence.
*Cette macro a été initialement créée par Jean-Eric du forum.
Salut,
à tout hasard, remplace le code précédent par celui-ci
Option Explicit
Dim wS As Worksheet
Dim monDico
Dim Plage As Range, myRange As Range
Dim c As Range
Dim aa As Integer
Sub ListeSansDoublons()
Application.ScreenUpdating = False
Set wS = Worksheets(1)
Set Plage = wS.Range("W3:AF22")
routine Plage, Range("AH3")
Set Plage = wS.Range("W23:AF42")
routine Plage, Range("AJ3")
Set Plage = wS.Range("W43:AF62")
routine Plage, Range("AL3")
Set Plage = wS.Range("W63:AF82")
routine Plage, Range("AN3")
Set Plage = wS.Range("W83:AF102")
routine Plage, Range("AP3")
Set Plage = wS.Range("W103:AF122")
routine Plage, Range("AR3")
Set wS = Nothing
End Sub
Sub routine(Plage, myRange)
Set monDico = CreateObject("Scripting.Dictionary")
aa = Application.WorksheetFunction.CountIf(Plage, ">*") + Application.WorksheetFunction.CountIf(Plage, ">0")
If aa > 0 Then
For Each c In Plage
If c <> "" Then monDico(c.Value) = ""
Next c
myRange.Resize(monDico.Count, 1) = Application.Transpose(monDico.keys)
End If
Set monDico = Nothing: Set Plage = Nothing
End SubMerci beaucoup Game Over,
Ça fonctionne au poil ! Comme ton VBA n'a plus grand chose à voir avec l'original, je ne vois pas exactement quelle était mon erreur. Bon, l'essentiel est que ça fonctionne. Toutefois, est-ce que cette macro est aisément "extensible" ? Je m'explique. Chaque itération de l'opération correspond à un mois d'une demi année (de mai à décembre 2013). Un fichier similaire sera également utilisé pour les années ultérieures qui, elles, seront complètes. Suffira-t-il d'ajouter les références suivantes ?
Set Plage = wS.Range("W123:AF142")
routine Plage, Range("AT3")Encore une fois, un grand merci.
Guildo a écrit :Comme ton VBA n'a plus grand chose à voir avec l'original, je ne vois pas exactement quelle était mon erreur. Bon, l'essentiel est que ça fonctionne.
If Application.CountA(Plage) <> 0 cette partie du code dans la version précédente est censée déterminer si la plage est vide ou non, auquel cas elle continuera la routine.
Le problème est que la plage en question : Range("W23:AF42") ... bien que n'affichant aucun résultat, n'est pas vide pour autant car elle est composée de formules dont la valeur est "", ce qui est différent.
Du coup, s'agissait de remplacer cette condition par une formule qui contourne cette difficulté; c'est ce que fait la partie de code suivante :
aa = Application.WorksheetFunction.CountIf(Plage, ">*") + Application.WorksheetFunction.CountIf(Plage, ">0")
If aa > 0 ThenGuildo a écrit :Toutefois, est-ce que cette macro est aisément "extensible" ?
Set Plage = wS.Range("W123:AF142") routine Plage, Range("AT3")
C'est exact, il suffira, d'ajouter à chaque fois, cette partie du code, adaptée aux plages source et cible que tu veux traiter.
Merci pour les explications. Excellente journée à toi.