いつもお世話になっております
下記の部分を複数選択したいのですが
どうしたよろしいでしょうか
If r.Value = ListBox1.List(ListBox1.ListIndex) Then
A列 担当
B列 名前
C列 性別
Private Sub UserForm_initialize()
With ListBox1
.AddItem "工藤"
.AddItem "加藤"
.AddItem "遠藤"
.AddItem "佐藤"
.Font.Size = 14
.MultiSelect = fmMultiSelectMulti
End With
End Sub
Private Sub CommandButton1_Click()
Dim dic As Object
Dim r As Range, rr As Range
Dim key1, key2, i As Integer
Set dic = CreateObject("Scripting.Dictionary")
For Each r In Range("A2", Cells(Rows.Count, "A").End(xlUp))
If r.Value = ListBox1.List(ListBox1.ListIndex) Then
If Not dic.exists(r.Value) Then dic.Add r.Value, _
CreateObject("Scripting.Dictionary")
If Not dic(r.Value).exists(r.Offset(, 1).Value) Then _
dic(r.Value).Add r.Offset(, 1).Value, _
CreateObject("System.Collections.ArrayList")
dic(r.Value)(r.Offset(, 1).Value).Add (r.Offset(, 2).Value)
End If
Next
Set rr = Range("F2")
Range("F:H").Clear
For Each key1 In dic.keys
rr.Value = key1
For Each key2 In dic(key1).keys
Set rr = rr.Offset(1)
rr.Offset(, 1).Value = key2
Set rr = rr.Offset(1)
For i = 0 To dic(key1)(key2).Count - 1
rr.Offset(i, 2).Value = dic(key1)(key2)(i)
Next
Set rr = rr.Offset(dic(key1)(key2).Count - 1)
Next
Set rr = rr.Offset(1)
Next
Set dic = Nothing
End Sub
No.1
- 回答日時:
コード読んでいないけど、、、
リストボックスのmultiselect の使い方はこんな感じかな?
http://officetanaka.net/excel/vba/tips/tips144.htm
ぶっちゃけ、選択されたリストをどのように使いたいのかな?
No.2
- 回答日時:
For Each r In Range("A2", Cells(Rows.Count, "A").End(xlUp))
If r.Value = ListBox1.List(ListBox1.ListIndex) Then
エクセルのVBAは使ったことがないので、的を射ていない質問かもしれませんが、上記の行では何をしたいのでしょうか?
・範囲を指定して、それぞれのセルの値がリストボックスで選ばれたもののいずれかと合致している場合以下の処理をする
(以下の処理)
・一度dic という配列に突っ込み
・セルF2に表示させる
というようなことでしたら、ループを二重にしないと、それぞれのセルの値ということにはなりません。
例えばの話、
A B C
佐藤 阿部 男
佐藤 井口 女
加藤 伊藤 女
遠藤 宇野 男
佐藤 江口 女
藤本 小野 男
工藤 加賀 男
佐藤 木村 女
のように入っていて、リストボックスで 佐藤、工藤 を選択したら、F2に何を表示させたいのですか?
No.3
- 回答日時:
ListBoxの担当者が抱える?顧客名一覧を書き出したいとかでしょうかね。
取り敢えずユーザーフォームを表示している間はデータの書き換えや追加・削除がなければ、dicへの登録はUserForm_initialize()イベントで行ないdicの宣言はプロシージャー外で行った方が見やすそうに感じます。
⇒書き換える必要があるならスル~で。
若しくはデータが多いとかでしょうか?
Dim dic As Object 'イベントの前に書いておく
Private Sub UserForm_initialize()
・・・・
>例えば 担当 工藤 加藤 選択したら
>その、担当の 名前 性別 血液型を
担当者名はなくても宜しいのでしょうか?
また名前が重複(同じ担当者で)するようなデータ構築されているのですか?
No.4
- 回答日時:
No.3 です。
お礼の内容からすると解決したと言う事であれば、その旨記載して欲しいです。
A列に重複がなければDictionaryオブジェクトは不要でしょうし、仮にあるのならそのItemにDictionaryオブジェクトは不要でしょう。
ただB列に重複があるか否か次第ですけど。
No.5
- 回答日時:
まずA列の重複と言うのは、担当:お客様が1:1なのか1:多なのかを確認したかったのです。
それにより出力される件数は 選択した数 or 担当しているお客様数 と行数が変わりますので。
ダミーデータを提示されるならその辺を気にされた方が宜しいかも。
あと担当者が入れ替わりなど多い場合なら、どこか空いている列に一覧を作成し
RowSourceプロパティ
http://officetanaka.net/excel/vba/tips/tips139.htm
を用いるのと後々管理は楽かなと。
本題についてはちょっとお時間を。
No.6ベストアンサー
- 回答日時:
取り敢えず形にはなっているでしょうか?
Dim dic1 As Object
Private Sub UserForm_Initialize()
Dim r As Range
Dim st As String
With ListBox1
.AddItem "工藤"
.AddItem "加藤"
.AddItem "遠藤"
.AddItem "佐藤"
.Font.Size = 14
.MultiSelect = fmMultiSelectMulti
End With
Set dic1 = CreateObject("Scripting.Dictionary")
For Each r In Range("A2", Cells(Rows.Count, "A").End(xlUp))
With Application
st = Join(.Index(r.Resize(, 2).Value, 1, 0), "_")
If Not dic1.Exists(st) Then dic1.Add st, .Index(r.Range("B1:D1").Value, 1, 0)
End With
Next
End Sub
Private Sub CommandButton1_Click()
Dim key As Variant
Dim rf As Range
Dim i As Long
Dim v As Variant
Set rf = Range("F2")
Range("F:H").Clear
For i = 0 To ListBox1.ListCount - 1
For Each key In dic1.Keys
If ListBox1.Selected(i) = True Then
If key Like ListBox1.List(i) & "*" Then
v = dic1(key)
rf.Resize(, 3).Value = v
Set rf = rf.Offset(1)
End If
End If
Next
Next
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) シートごとに 個数と集計 2 2021/10/25 22:00
- Visual Basic(VBA) 超難 日付に対するクロス集計 7 2021/12/06 20:56
- Visual Basic(VBA) ListBox1をClickしたときのイベント 5 2022/12/11 19:45
- Visual Basic(VBA) ワークシートチェンジ 1 2022/02/01 11:19
- Visual Basic(VBA) ワークシートごとに計算結果 2 2022/04/30 22:00
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) vba 特定シートを一つにまとめる 3 2021/10/20 14:59
- Visual Basic(VBA) リストポックスへの抽出方法 1 2022/08/10 17:58
- Visual Basic(VBA) VBA チェックボックスの設定について 1 2022/10/24 10:27
- Visual Basic(VBA) VBA Find でオートメーションエラー(エラー440)が出ました 1 2021/11/09 21:22
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
select case について
Visual Basic(VBA)
-
マクロVBAについてご教授いただけましたらと存じます。
Visual Basic(VBA)
-
VB.NETでVBスクリプトを作るにはどうしたらいいですか?
Visual Basic(VBA)
-
-
4
VBA 同じ名前のオブジェクトを選択したいのですが
Visual Basic(VBA)
-
5
一つのフォルダーに50個のエクセルファイルがあります。 各ファイルにはAとBのシートがあります。 5
Visual Basic(VBA)
-
6
csvファイルを列数ごとに分割するExcelマクロが書けずに困っています
Visual Basic(VBA)
-
7
Windows 11 Pro での、VBAのCode書き換えで、1点お教え願います。
Visual Basic(VBA)
-
8
環境依存文字?をEnumで定義したい
Visual Basic(VBA)
-
9
VBA 何かしら文字が入っていたら
Visual Basic(VBA)
-
10
エクセル VBAでの転記の方法について
Visual Basic(VBA)
-
11
VBA とびとびの列を結合させる
Visual Basic(VBA)
-
12
2013Excel保存済みファイルグレーアウト Excelを開こうとするとメニュー以外全てグレーにな
Excel(エクセル)
-
13
[大至急!]ExcelSheetFreeの使い方がわかりません
Excel(エクセル)
-
14
Excel VBA素人です。VBAで図形のセンタリング方法ご教示下さい
Visual Basic(VBA)
-
15
Excelマクロで空白セルの大小比較処理について
Visual Basic(VBA)
-
16
自動VBAマクロって会社の中で禁止なんですか?
Visual Basic(VBA)
-
17
【補足欄が足りなかったため、こちらで再質問させていただきます。】 Excelの転記マクロについて、教
Visual Basic(VBA)
-
18
Excel VBAにて、2GB超の点群データ(CSVファイル,改行コードLF)を高速で解析したい。
Visual Basic(VBA)
-
19
vba userFormのSubを標準モジュールから呼び出す方法を教えてください
Visual Basic(VBA)
-
20
(マクロ)コピー貼付のマクロで、クリップボードに何も貼付ていな時の実行をエラーにしない為には
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
foreachで上限回数指定方法また...
-
phpでforeachの中にforeachがあ...
-
スカラーのベクトル微分
-
ヒアドキュメントの中のfor文
-
プログラミングのPythonのnoteb...
-
ファイルの書き込みについて教...
-
2次元配列への標準入力
-
file_existsでファイル名の部分...
-
プルダウンメニューにDBの内容...
-
自動で番号を振りたい
-
while文について
-
配列をループでたくさん宣言し...
-
phpで、連想配列を普通の配列に...
-
一度に複数の値を取得できる乱...
-
smartyでページングするには
-
Smartyのテンプレートからjavas...
-
配列を回すとき、最後の要素だ...
-
多次元配列の一次元目の最大値...
-
php Undefined variableエラー
-
PHP: 未定義エラーの回避方法を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
smartyのforeachの使い方
-
マッチング処理(1:N)
-
foreachで上限回数指定方法また...
-
多次元配列を、1次元の配列にす...
-
foreachの間にテーブルの<TR>を...
-
PHP、{}記号の意味
-
VB.NET で 二次元のハッシュは...
-
$_POST受信で必要項目のみを結...
-
3つの連想配列を交互に代入し...
-
PHP:ツリー構造をulとli要素に...
-
foreachで配列を、左から縦3列...
-
PHPの構文で間違えが分からない
-
PHPで連想配列のプルダウンメニ...
-
添え字が全て文字列のPHPの多次...
-
テーブルデータ表示
-
Smartyでインクリメント
-
PHPで変数名にハイフンを使うに...
-
POSTで渡されるデータの数がわ...
-
Delphi XEの警告文を消したい
-
配列の要素の値をループ中に変...
おすすめ情報
返信遅れてすみません。
担当を複数選択して抽出したいのですが、
For i = 0 To ListBox1.ListCount - 1
If r.Value = ListBox1.Selected(i) Then
に修正しましたが、エラーにはなりませんでしたが、
なにも 表示されませんでした
おしえてくれませんでしょうか
すみません。説明不足でした
A列 B列 C列 D列
担当 名前 性別 血液型
工藤 根岸 育雄 男 A
加藤 小田 都義 女 A
遠藤 高松 友良 男 A
佐藤 村瀬 一樹 女 A
リストボックス1に表示されているのが
A列の担当
例えば 担当 工藤 加藤 選択したら
その、担当の 名前 性別 血液型を
表示させたいです。
autofiter ではなく。
すみません 解決していません。
A列に重複がなければ ではなく
単純に 工藤 加藤 が選択されたら
工藤 加藤の
名前(お客様) 性別 血液型
をすべて 表示させたいだけです、。
担当:お客様が1:1なのか1:多なのか
提示したデータはお客様が1:1となっていますが、
1:多です
すみませんでした