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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

1266閲覧

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

kurumisawasaki

総合スコア10

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/01/31 09:18

前提・実現したいこと

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

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

投稿2019/02/02 18:28

kurumisawasaki

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

VBA

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

投稿2019/02/01 01:35

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問