|
こんばんは。
>でも、バグがどこに?有るのか・・・と
>その前に、以前数字でこの「重複」を無くすテストをしていて、
>あっ…これは「数字」は対象外だなんて、勝手に決め付けており
>ました。だからバグ?っとは、今の今まで思っていませんでした。
なるほど・・・。
>今の理解ではList()の添え字がこのケースでは0〜9まで使われていて、listの
>中で制御できないのでしょうか?多分これでは無いかと判断しました。
>つまり添え字の数字と重複を無くす数字の区別がつかないのでは。
添え字の数字iは直接は関係ありません。
でも、言い回しが違っているだけで 本質のところはお分かりなのかもね!!
では・・・。
新規ブック(あくまでも新規ブックですよ)の標準モジュールに
'=========================================================
Sub main()
Dim g0 As Long
Dim com As Variant
Dim vardat1 As Variant
Dim vardat2 As Variant
Dim strdat As String
Dim lngdat As Long
Dim mes As String
vardat1 = "123"
vardat2 = 123
strdat = "123"
lngdat = 123
With Range("a1:a5")
.Value = Evaluate("{""vardat1----Variant """"123"""""";" & _
"""vardat2----Variant 123""; " & _
"""strdat ----String """"123"""""";" & _
"""lngdat ----Long 123"";" & _
"""これらの変数と定数で比較します""}")
.Rows.AutoFit
.Columns.AutoFit
End With
MsgBox "ready ?"
If vardat1 = vardat2 Then
mes = "vardat1 と vardat2は、等しい"
Else
mes = "vardat1 と vardat2は、等しくない"
End If
Cells(1, 3).Value = mes
If vardat1 = lngdat Then
mes = "vardat1 と lngdatは、等しい"
Else
mes = "vardat1 と lngdatは、等しくない"
End If
Cells(2, 3).Value = mes
If vardat2 = strdat Then
mes = "vardat2 と strdatは、等しい"
Else
mes = "vardat2 と strdatは、等しくない"
End If
Cells(3, 3).Value = mes
If vardat1 = 123 Then
mes = "vardat1 と 123は、等しい"
Else
mes = "vardat1 と 123は、等しくない"
End If
Cells(4, 3).Value = mes
If vardat2 = "123" Then
mes = "vardat2 と 文字列""123""は、等しい"
Else
mes = "vardat2 と 文字列""123""は、等しくない"
End If
Cells(5, 3).Value = mes
With Range("c1:c4")
.Columns.AutoFit
End With
End Sub
mainを実行して見てください。
A列に入力された変数の型と変数の中身と
C列に入力された比較結果をよく見てみてください。
If文での比較では、
最初のVariant型の変数同士であるVardat1とVardat2を比較した結果以外は、
等しいという結果を出しています。
数値と文字列でもVariant型同士の比較でなければ、等しい という結果です。
では、元のコードに戻ると・・・、
Private Sub UserForm_Initialize()
Dim k As Long
Dim i As Long
For k = 6 To Range("A65536").End(xlUp).Row
For i = 0 To ComboBox1.ListCount - 1
If Cells(k, 1).Value = ComboBox1.List(i) Then '★
' このCells(k, 1).Value Variant型の数値であり、
' ComboBox1.List(i) は、Variant型の文字列になります。
' よって、セルに入っている5とList()に格納されている"5"は
' 決して等しくなりません。
' つまり、このExit Forが実行されないので
' 同じ5が追加されてしまいます。
Exit For
End If
Next i
If i = ComboBox1.ListCount Then
ComboBox1.AddItem Cells(k, 1).Value
End If
Next k
End Sub
修正は、Variant型とVariant型の変数の比較にしなければ良いのですから、
★の行を
If cstr(Cells(k, 1).Value) = ComboBox1.List(i) Then
と修正して再度確認してみてください。
今度は、数字も正しく重複なしで登録されると思いますよ!!
尚、重複なしのデータを取得する方法は、他にもいくつかあります
提示されたコードが悪いわけではありません。
が、もう少し簡単で処理の速い方法がここの過去ログにも
ありますから、調べてみてください。
(Dictionary または、AdvancedFilter 等をキーに検索してみてください)
|
|