scripting.dictionary probleme avec .exists

7 réponses
Avatar
isabelle
bonjour à tous,

j'ai de la brume dans mes lunette,
voilà,
en cellule A1:A4 j’inscris
1
2
1
2

puis j’exécute la macro ci-bas.
normalement il devrait résulter en cellule C1:C2 les données 1 et 2
mais non, j’obtiens en cellule C1:C4 1, 2, 1, 2


Private Sub liste()
Dim it As Range
Range("C:C").Delete

With CreateObject("scripting.dictionary")

For Each it In Range("A1:A4")
If Not .exists(it) Then .Item(it) = it
Next

Range("C1").Resize(.Count, 1) = Application.Transpose(.Items)
End With

End Sub

c'est grave docteur ?
isabelle

7 réponses

Avatar
DanielCo
Bonjour,
Private Sub liste()
Dim it As Range, Dico As Object
Range("C:C").Delete
Set Dico = CreateObject("scripting.dictionary")
With Dico
For Each it In Range("A1:A4")
If Not .exists(it.Value) Then .Item(it.Value) = it
Next
Range("C1").Resize(.Count, 1) = Application.Transpose(.Items)
End With
End Sub
Cordialement.
Daniel
bonjour à tous,
j'ai de la brume dans mes lunette,
voilà,
en cellule A1:A4 j’inscris
1
2
1
2
puis j’exécute la macro ci-bas.
normalement il devrait résulter en cellule C1:C2 les données 1 et 2
mais non, j’obtiens en cellule C1:C4 1, 2, 1, 2
Private Sub liste()
Dim it As Range
Range("C:C").Delete
With CreateObject("scripting.dictionary")
For Each it In Range("A1:A4")
If Not .exists(it) Then .Item(it) = it
Next
Range("C1").Resize(.Count, 1) = Application.Transpose(.Items)
End With
End Sub
c'est grave docteur ?
isabelle
Avatar
DanielCo
Ou au minimum :
Private Sub liste2()
Dim it As Range, Dico As Object
Range("C:C").Delete
With CreateObject("scripting.dictionary")
For Each it In Range("A1:A4")
If Not .exists(it.Value) Then .Item(it.Value) = it
Next
Range("C1").Resize(.Count, 1) = Application.Transpose(.Items)
End With
End Sub
Daniel
bonjour à tous,
j'ai de la brume dans mes lunette,
voilà,
en cellule A1:A4 j’inscris
1
2
1
2
puis j’exécute la macro ci-bas.
normalement il devrait résulter en cellule C1:C2 les données 1 et 2
mais non, j’obtiens en cellule C1:C4 1, 2, 1, 2
Private Sub liste()
Dim it As Range
Range("C:C").Delete
With CreateObject("scripting.dictionary")
For Each it In Range("A1:A4")
If Not .exists(it) Then .Item(it) = it
Next
Range("C1").Resize(.Count, 1) = Application.Transpose(.Items)
End With
End Sub
c'est grave docteur ?
isabelle
Avatar
isabelle
merci Daniel,
ça fonctionne avec le .Value
isabelle
Le 2016-11-16 à 05:56, DanielCo a écrit :
Ou au minimum :
Private Sub liste2()
Dim it As Range, Dico As Object
Range("C:C").Delete
With CreateObject("scripting.dictionary")
For Each it In Range("A1:A4")
If Not .exists(it.Value) Then .Item(it.Value) = it
Next
Range("C1").Resize(.Count, 1) = Application.Transpose(.Items)
End With
End Sub
Daniel
Avatar
HB
Bonjour,
Encore un cas ou la "propriété par défaut"
(ici .Value) n'est plus facultative...
Peut-on considérer qu'il s'agit là
d'un défaut de VBA ?
C'est quand même curieux ...
On se laisse facilement prendre à défaut ...
HB
Le 16/11/2016 à 15:57, isabelle a écrit :
merci Daniel,
ça fonctionne avec le .Value
isabelle
Le 2016-11-16 à 05:56, DanielCo a écrit :
Ou au minimum :
Private Sub liste2()
Dim it As Range, Dico As Object
Range("C:C").Delete
With CreateObject("scripting.dictionary")
For Each it In Range("A1:A4")
If Not .exists(it.Value) Then .Item(it.Value) = it
Next
Range("C1").Resize(.Count, 1) = Application.Transpose(.Items)
End With
End Sub
Daniel
Avatar
DanielCo
Bonjour,
A partir du moment ou tu peux faire un dictionnaire d'objets range, il
faut bien spécifier que c'est selement la valeur qui t'intéresse.
Cordialement.
Daniel
Bonjour,
Encore un cas ou la "propriété par défaut"
(ici .Value) n'est plus facultative...
Peut-on considérer qu'il s'agit là
d'un défaut de VBA ?
C'est quand même curieux ...
On se laisse facilement prendre à défaut ...
HB
Le 16/11/2016 à 15:57, isabelle a écrit :
merci Daniel,
ça fonctionne avec le .Value
isabelle
Le 2016-11-16 à 05:56, DanielCo a écrit :
Ou au minimum :
Private Sub liste2()
Dim it As Range, Dico As Object
Range("C:C").Delete
With CreateObject("scripting.dictionary")
For Each it In Range("A1:A4")
If Not .exists(it.Value) Then .Item(it.Value) = it
Next
Range("C1").Resize(.Count, 1) = Application.Transpose(.Items)
End With
End Sub
Daniel
Avatar
isabelle
oui c'est bien ça,
étant donné que chaque cellule a une adresse différente
c'est pourquoi tous était mit dans le dico
isabelle
Le 2016-11-16 à 12:11, DanielCo a écrit :
Bonjour,
A partir du moment ou tu peux faire un dictionnaire d'objets range, il faut bien
spécifier que c'est selement la valeur qui t'intéresse.
Cordialement.
Daniel
Bonjour,
Encore un cas ou la "propriété par défaut"
(ici .Value) n'est plus facultative...
Peut-on considérer qu'il s'agit là
d'un défaut de VBA ?
C'est quand même curieux ...
On se laisse facilement prendre à défaut ...
HB
Le 16/11/2016 à 15:57, isabelle a écrit :
merci Daniel,
ça fonctionne avec le .Value
isabelle
Le 2016-11-16 à 05:56, DanielCo a écrit :
Ou au minimum :
Private Sub liste2()
Dim it As Range, Dico As Object
Range("C:C").Delete
With CreateObject("scripting.dictionary")
For Each it In Range("A1:A4")
If Not .exists(it.Value) Then .Item(it.Value) = it
Next
Range("C1").Resize(.Count, 1) = Application.Transpose(.Items)
End With
End Sub
Daniel
Avatar
HB
oui
c'était juste pour tourner autour du mot "default"
;o)
Blague à part :
On prend vite l'habitude de ne pas spécifier ".Value"
et quand c'est indispensable on peut se laisser surprendre...
HB
Le 16/11/2016 à 18:11, DanielCo a écrit :
Bonjour,
A partir du moment ou tu peux faire un dictionnaire d'objets range, il
faut bien spécifier que c'est selement la valeur qui t'intéresse.
Cordialement.
Daniel
Bonjour,
Encore un cas ou la "propriété par défaut"
(ici .Value) n'est plus facultative...
Peut-on considérer qu'il s'agit là
d'un défaut de VBA ?
C'est quand même curieux ...
On se laisse facilement prendre à défaut ...
HB
Le 16/11/2016 à 15:57, isabelle a écrit :
merci Daniel,
ça fonctionne avec le .Value
isabelle
Le 2016-11-16 à 05:56, DanielCo a écrit :
Ou au minimum :
Private Sub liste2()
Dim it As Range, Dico As Object
Range("C:C").Delete
With CreateObject("scripting.dictionary")
For Each it In Range("A1:A4")
If Not .exists(it.Value) Then .Item(it.Value) = it
Next
Range("C1").Resize(.Count, 1) = Application.Transpose(.Items)
End With
End Sub
Daniel