Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


30475 / 76738 ←次へ | 前へ→

【51530】Re:重複を無くすコードについて
発言  ichinose  - 07/9/21(金) 19:42 -

引用なし
パスワード
   こんばんは。

>でも、バグがどこに?有るのか・・・と
>その前に、以前数字でこの「重複」を無くすテストをしていて、
>あっ…これは「数字」は対象外だなんて、勝手に決め付けており
>ました。だからバグ?っとは、今の今まで思っていませんでした。
なるほど・・・。

>今の理解では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 等をキーに検索してみてください)

0 hits

【51451】重複を無くすコードについて Misako 07/9/18(火) 21:55 質問
【51452】Re:重複を無くすコードについて ichinose 07/9/18(火) 23:19 発言
【51458】Re:重複を無くすコードについて Misako 07/9/19(水) 20:42 お礼
【51460】Re:重複を無くすコードについて ichinose 07/9/19(水) 21:57 発言
【51485】Re:重複を無くすコードについて Misako 07/9/20(木) 22:17 お礼
【51530】Re:重複を無くすコードについて ichinose 07/9/21(金) 19:42 発言
【51534】Re:重複を無くすコードについて 多摩川 07/9/22(土) 0:02 お礼
【52052】Re:重複を無くすコードについて Misako 07/10/17(水) 22:59 お礼

30475 / 76738 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free