[リストへもどる]
一括表示

投稿時間:2004/04/28(Wed) 08:25
投稿者名:Rs
Eメール:
URL :
タイトル:
コンボボックスAddItem時に重複するデータを登録しない
いつもお世話になっております。
早速質問なんですが、コンボボックスのAdditemで登録するときに重複するデータを
登録しない処理をしたいのですが・・・。
現状のコードでは

Private Sub TxtA_KeyDown(KeyCode As Integer, Shift As Integer)
    
    'Enterのタイミングで実行
    If KeyCode = vbKeyReturn Then
        For a = 0 To MaxRec
            If Val(Data(1, a)) = Val(TxtA.Text) Then
                CmbTan.AddItem (Val(Data(12, a)))
            End If
        Next a
    End If

End Sub

となっております。
MaxRec(格納されたデータの最大数)、Data(,)(配列の変数Data)
配列変数Dataの(1,a)とTxtAに入力されたデータを比べて、同じであった場合に
コンボボックスにData(12,a)番目のデータをAdditemで登録しています。

コードで教えてもらえると非常に助かります^^;
宜しくお願いします。

投稿時間:2004/04/28(Wed) 10:19
投稿者名:るしぇ
Eメール:
URL :
タイトル:
Re: コンボボックスAddItem時に重複するデータを登録しない
Data の中身が不明なので何がしたいのか全然分かりません。
…はぁ。…こんな感じなんでしょうかねぇ。やっぱり意味は分かりませんが。
質問のために"分かり易い""現象が再現できる""最小限"のコードを提供して下さい。

Option Explicit

Dim Data() As String

Private Sub Form_Load()
    Dim i As Integer
    ReDim Data(12, 3)
    For i = 1 To 12
        Data(i, 0) = i & "月"
    Next
End Sub

Private Sub TxtA_KeyDown(KeyCode As Integer, Shift As Integer)
    Dim a       As Integer
    Dim i       As Integer
    Dim MaxRec  As Integer
    
    'Enterのタイミングで実行
    If KeyCode = vbKeyReturn Then
        MaxRec = UBound(Data, 2)
        For a = 0 To MaxRec
            If Val(Data(1, a)) = Val(TxtA.Text) Then
                With CmbTan
'                    ↓間違いコード。すいません。
'                    For i = 0 To .ListCount
'                        If .List(i) = CStr(Val(Data(12, a))) Then
'                            Exit For
'                        End If
'                        .AddItem (Val(Data(12, a)))
'                    Next i
'                   ↓修正後コード
                    Do While True
                        For i = 0 To .ListCount - 1
                            If .List(i) = CStr(Val(Data(12, a))) Then
                                Exit Do
                            End If
                        Next i
                        .AddItem (Val(Data(12, a)))
                        Exit Do
                    Loop

                End With

            End If
        Next a
    End If

End Sub

投稿時間:2004/04/28(Wed) 10:57
投稿者名:Rs
Eメール:
URL :
タイトル:
Re^2: コンボボックスAddItem時に重複するデータを登録しない
レスありがとうございます。
ちょっと余計なこと書きすぎてわかりずらかったですかね^^;
結論から言うと、単純にコンボボックスに登録するときに
既に登録されたデータとこれから登録するデータを重複させない
という話なんですが

With CmbTan
    For i = 0 To .ListCount
        If .List(i) = CStr(Val(Data(12, a))) Then
            Exit For
        End If
        .AddItem (Val(Data(12, a)))
    Next i
End with

るしぇさんのこの部分のコードが知りたかったのですが、
このコードで行くと、CmbTan.List(i)をFor文で調べている最中に.AddItemがあるので
重複データが見つかるまで、CmbTanに追加されてしまうような気がするので、るしぇさん
のコードを参考に自分で考えてみます。
ありがとうございました。

投稿時間:2004/04/28(Wed) 11:30
投稿者名:るしぇ
Eメール:
URL :
タイトル:
Re^3: コンボボックスAddItem時に重複するデータを登録しない
> このコードで行くと、CmbTan.List(i)をFor文で調べている最中に.AddItemがあるので
> 重複データが見つかるまで、CmbTanに追加されてしまうような気がするので、
おぅ☆。失礼しました。ってゆーかエラーが出なかったので気にしなかったんですが
i も .ListCount - 1 までですよね。朝は頭が働いてません(滅)。じゃ、これで。
With CmbTan
    Do While True
        For i = 0 To .ListCount - 1
            If .List(i) = CStr(Val(Data(12, a))) Then
                Exit Do
            End If
        Next i
        .AddItem (Val(Data(12, a)))
        Exit Do
    Loop
End With

汎用化するなら(というかこっちの方が形としていいと思いますが…)
Private Sub TxtA_KeyDown(KeyCode As Integer, Shift As Integer)
    Dim a       As Integer
    Dim MaxRec  As Integer
    
    'Enterのタイミングで実行
    If KeyCode = vbKeyReturn Then
        MaxRec = UBound(Data, 2)
        For a = 0 To MaxRec
            If Val(Data(1, a)) = Val(TxtA.Text) Then
                Call SameComboItemCheck(Me.CmbTan, CStr(Val(Data(12, a))))
            End If
        Next a
    End If

End Sub

Private Sub SameComboItemCheck(ByVal ComboBoxX As ComboBox, ByVal AddText As String)
    Dim i As Integer
    With ComboBoxX
        For i = 0 To .ListCount - 1
            If .List(i) = AddText Then
                Exit Sub
            End If
        Next i
        .AddItem (AddText)
    End With
End Sub

投稿時間:2004/04/28(Wed) 14:17
投稿者名:Rs
Eメール:
URL :
タイトル:
Re^4: 解決しました。るしぇさんThx!!
るしぇさんいろいろありがとうございました^^
またよろしくお願いします。