[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『リストボックスをリストビューに書き換えたい』(yasu)
よろしくお願いします
現在ListBox1でフィルター機能(履歴確認用として)を利用しているのですが
項目数が200件程度ありマウススクロールが効かずちょっと不便なので
ListView1に以下マクロを置き換えるたいのですが、御教授お願いします。
概要の表は以下です
3行目が見出し行
A B C D ・・ P 3 年月日 仕入先 件名 ・・・ 4 2017/4/1 ○○商事 5 2017/4/1 △○企画 6 2017/5/1 ○○商事 以下続きます。 ユーザーフォームのリストボックスに表示(仕入先)クリックし(選択は複数可能「リストボックス」は複数可能ですがリストビューは選択可能か?) 可能でなければ、1社選択でも仕方ないのでOKです CommandButton1クリックでフィルター作動 もう一度クリックでフィルター解除
CommandButton2はリストビューの選択解除となります。
マクロ不慣れなので、どのように修正すれば可能なのか
回答お願いします
Option Explicit
Private Sub CommandButton1_Click()
Dim Ary() As Variant Dim i As Long, j As Long
If ActiveSheet.AutoFilterMode = False Then
With ListBox1 For i = 0 To .ListCount - 1 If .Selected(i) Then j = j + 1 ReDim Preserve Ary(1 To i) Ary(i) = .List(i) End If Next End With With Worksheets("Sheet1") ' ※ .AutoFilterMode = False If j = 0 Then MsgBox "ひとつも選択されていません" Else .Range("B3:B5000").AutoFilter Field:=1, _ Criteria1:=Ary, Operator:=xlFilterValues
Application.Goto Range("A3") AppActivate Application.Caption End If End With
Else Range("A3:E3").AutoFilter Call CommandButton2_Click End If AppActivate Application.Caption End Sub
Private Sub CommandButton2_Click()
Dim cnt As Long
For cnt = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(cnt) = True Then ListBox1.Selected(cnt) = False End If Next cnt End Sub
Private Sub UserForm_Initialize()
Dim z As Long
With Sheets("Sheet1") z = .Range("AT" & .Rows.Count).End(xlUp).Row ListBox1.RowSource = .Name & "!AT2:AT" & z With ListBox1 .MultiSelect = 1 End With End With End Sub
< 使用 Excel:Excel2013、使用 OS:Windows10 >
Private Sub UserForm_Initialize() With ListView1 .ColumnHeaders.Clear .ListItems.Clear .View = lvwReport .MultiSelect = True .ColumnHeaders.Add , , "年月日", 60 .ColumnHeaders.Add , , "仕入れ先", 60 .ColumnHeaders.Add , , "件名", 120 With .ListItems.Add .Text = Format(Now, "YYYY/MM/DD") .SubItems(1) = "○○商事" .SubItems(2) = "○○○○" End With With .ListItems.Add .Text = Format(Now, "YYYY/MM/DD") .SubItems(1) = "△○企画" .SubItems(2) = "△△△△" End With End With End Sub (???) 2017/04/19(水) 09:07
>選択は複数可能「リストボックス」は複数可能ですがリストビューは選択可能か
私の環境では、新しくListView を挿入することができなくなっているので 既存のコードを、ちょこっと変更して確認しただけですが
ListView1.MultiSelect = True と設定することで可能です。
https://msdn.microsoft.com/ja-jp/library/system.windows.forms.listview.multiselect.aspx
( β) 2017/04/19(水) 09:11
βさん、ListViewコントロールを配置するには、ツールボックスウィンドウで右クリックし、「その他のコントロール」からListViewを追加です。現在はこれを追加していない状態に戻したのでしょう。
または、これを追加するとMSCOMCTL.OCXが「参照設定」にも追加される(Microsoft Windows Common Controls)のですが、こっちだけチェックを外してしまった、とかかも? 一旦ツールボックスから削除後、再度追加すれば直るかと思います。
とはいえ、ListViewの方は複数選択する場合、ShiftキーやCtrlキーの押下が必要であり、マウスのドラッグだけで済むListBoxの方が使いやすいと思うのですよねぇ。苦労する割には報われないコーディングだと思います。
(???) 2017/04/19(水) 09:48
To ??? さん
当方の環境、xl2010 と xl2013 なんですが、いずれも その他コントロールで ListView コントロールの追加をしてあります。 で、古い xl2010PC のほうは、それを ユーザーフォーム上に配置できるんですが、xl2013PC のほうでは 配置しようとした瞬間に 「正式にライセンスされていないためコントロールを追加できません」と叱られます。
調べると、いろいろ解説されていますが、最近ではわざわざ、ListViewを使わずとも ListBox で充分、事足りるなぁと 思っていることと、どうしても必要なら、ListView 組み込み済みのテンプレートブックを元に新規作成もできるので うっちゃってあるというところです。
★アドバイスいただいたように、いったんコントロールを削除し、再度組み込みましたら 叱られずに配置できました。 ありがとうございます! (でも、積極的に使おうという気持ちにはなかなかなれませんが。リストを作り上げるまでのコードが面倒ですしね)
(β) 2017/04/19(水) 10:09
Dim i As Long With ListView1 ''プロパティ .View = lvwReport .LabelEdit = lvwManual .HideSelection = False .AllowColumnReorder = True .FullRowSelect = True .Gridlines = True .MultiSelect = True .ColumnHeaders.Add , "_siire", "仕入先", 130 End With If Not m_ShownFlag Then With ListView1 For i = 2 To Range("AT" & Rows.Count).End(xlUp).Row .ListItems.Add Text:=Cells(i, 46).Value Next End With m_ShownFlag = True End If End Sub
Private Sub CommandButton2_Click()
With ListView1 If .ListItems.Count > 0 Then .ListItems(1).Selected = True End With End Sub
CommandButton1に当たるフィルターを利用するマクロ
お願いできませんか?
よろしくお願いします。
(yasu) 2017/04/19(水) 15:44
Private Sub CommandButton1_Click() Dim i As Long Dim cw As String
With ListView1 For i = 1 To .ListItems.Count If .ListItems(i).Selected = True Then cw = cw & i & vbLf End If Next i End With
MsgBox cw End Sub
どの行が選択されているかさえ判れば、後は同じですよね。
(???) 2017/04/19(水) 16:30
Dim cw As String Dim i As Long
If ActiveSheet.AutoFilterMode = False Then
With ListView1 For i = 1 To .ListItems.Count If .ListItems(i).Selected = True Then cw = cw & i & vbLf End If Next i End With
' MsgBox cw
With Worksheets("Sheet1") ' ※ .AutoFilterMode = False
If i = 0 Then MsgBox "ひとつも選択されていません" Else ★ .Range("B3:B5000").AutoFilter Field:=1, _ Criteria1:=cw, Operator:=xlFilterValues
Application.Goto Range("A3")
AppActivate Application.Caption End If End With
Else Range("A3:E3").AutoFilter Call CommandButton2_Click (yasu) 2017/04/19(水) 17:33
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.