質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.48%

EXCELのユーザーフォームにあるリストボックスから特定の情報を省きたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,458

score 10

前提・実現したいこと

EXCELでユーザーフォームを作り、データベースから条件に当てはまるものをリストボックスで一覧表示させています。
表示させているものは、Worksheetsは顧客情報にある列「顧客名」、「顧客分類」、「状態」の情報です。

Changeを使用しそれぞれに該当するテキストボックスorコンポボックスに入力があると、リストボックスに表示される仕組みなのですが、「顧客分類」にある”販売済"だけを省いて表示するような仕組みができないかと、チェックボックスを作ってやってみたのですができません。

どなたかご教授よろしくお願いいたします。

該当のソースコード

Option Explicit

Private Sub TextBox1_Change()
Call SetListBox
End Sub

Private Sub UserForm_Initialize()
rtnNo = 0
Call SetBunruiList
Call SetListBox

End Sub

'チェックボックスをONでリストボックスから"販売済"を省く

Private Sub CheckBox1_Click()

Dim i As Long

If Me.CheckBox1.Value = True Then
With Me.lst顧客リスト
For i = .ListCount To 1 Step -1
If .Cells(.Range("顧客分類列")) = "販売済" Then
.RemoveItem (i - 1)
End If
Next
End With
End If

End Sub

Private Sub SetBunruiList()
Dim wRow        As Long

Me.cmb顧客分類.Clear
For wRow = 3 To Worksheets("顧客分類").Range("A1").CurrentRegion.Rows.Count
Me.cmb顧客分類.AddItem Worksheets("顧客分類").Cells(wRow, 1)
Next
End Sub

Private Sub txt顧客名_Change()
Call SetListBox
End Sub

Private Sub cmb顧客分類_Change()
Call SetListBox
End Sub

Private Sub lst顧客リスト_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
rtnNo = Me.lst顧客リスト.Text
Unload Me
End Sub

Private Sub SetListBox()
Dim wRow        As Long
Dim wLstRow     As Long
Dim wHitFlg     As Boolean

Me.lst顧客リスト.Clear
wLstRow = 0
With Worksheets("顧客情報")
For wRow = 2 To .Range("A1").CurrentRegion.Rows.Count
wHitFlg = True
If Me.txt顧客名 <> "" Then
If InStr(1, .Cells(wRow, .Range("顧客名列").Column), Me.txt顧客名, vbTextCompare) = 0 Then
wHitFlg = False
End If
End If
If Me.cmb顧客分類 <> "" Then
If .Cells(wRow, .Range("顧客分類列").Column) <> Me.cmb顧客分類 Then
wHitFlg = False
End If
End If
If Me.TextBox1 <> "" Then
If InStr(1, .Cells(wRow, .Range("状態列").Column), Me.TextBox1, vbTextCompare) = 0 Then
wHitFlg = False
End If
End If
If wHitFlg = True Then
Me.lst顧客リスト.AddItem ""
Me.lst顧客リスト.List(wLstRow, 0) = wRow
Me.lst顧客リスト.List(wLstRow, 1) = Worksheets("顧客情報").Cells(wRow, 2)
Me.lst顧客リスト.List(wLstRow, 2) = Worksheets("顧客情報").Cells(wRow, 3)
Me.lst顧客リスト.List(wLstRow, 3) = Worksheets("顧客情報").Cells(wRow, 8)

wLstRow = wLstRow + 1
End If
Next
End With

**    Dim i As Long

If Me.CheckBox1.Value = True Then
With Me.cmb顧客分類
For i = .ListCount To 1 Step -1
If .List(i - 1, 2) = "販売済" Then
.RemoveItem (i - 1)
End If
Next
End With
End If**

件数 = lst顧客リスト.ListCount

End Sub

試したこと

'Private Sub CheckBox1_Click()
に以下構文を追加
Dim i As Long

If Me.CheckBox1.Value = True Then
With Me.lst顧客リスト
For i = .ListCount To 1 Step -1
If .Cells(.Range("顧客分類列")) = "販売済" Then
.RemoveItem (i - 1)
End If
Next
End With
End If

End Sub

'Private Sub SetListBox()に以下構文を追加

Dim i As Long

If Me.CheckBox1.Value = True Then
With Me.cmb顧客分類
For i = .ListCount To 1 Step -1
If .List(i - 1, 2) = "販売済" Then
.RemoveItem (i - 1)
End If
Next
End With
End If

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

データベースに別項目で状態を準備し、それによってリストボックスの内容を変えました。
ご指導いただきありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

なんとなくですが、処理の流れとしては、次のようになると思います。

  1. リストボックスのアイテムでループ
  2. アイテムの名前が顧客名列の何行目にあるか検索する
  3. 顧客分類列の同じ行の値を取得する
  4. 販売済ならRemoveItem

コードで書くとこんな感じでしょうか(動作未確認)

With 対象のオブジェクト
    ' オブジェクト内アイテムを後ろからループ
    For i = .ListCount To 1 Step -1
        ' 顧客名列を先頭からループ
        For r = 1 To Range("顧客名列").Count
            ' 顧客名がアイテムと同じか
            If Range("顧客名列").Item(r, 1) = .List(i) Then
                ' 同じ行にある顧客分類列の値が販売済みか
                If Range("顧客分類列").Item(r, 1) = "販売済" Then
                    ' リストからアイテム削除
                    .RemoveItem (i)
                End If
            End If
        Next
    Next
End With

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る