[[20170419021315]] 『リストボックスをリストビューに書き換えたい』(yasu) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『リストボックスをリストビューに書き換えたい』(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 >


Excel標準ではないコントロールを利用したいならば、自力で使い方を調べる力量が必要です。不慣れだから判らない、なんて理屈は通用しません。自分で調べないから判らないだけであり、修正を人にやらせようとするのは、他力本願な甘えです。

 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


追記で、FullRowSelectプロパティをTrueにした方が良いかもです。

βさん、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


(???)さん
(β)さん
ありがとうございます。
ListView1へのデータ表示は一応出来ました。
以下です
Private Sub UserForm_Initialize()

    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


1つ目を選択状態にするコードは書けているじゃないですか。ならば、状態を調べるのも同じプロパティですよ?

 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

元々、Aryという配列を渡していたのに、何で私のサンプルのままのコードにあるcwを指定しているのですか?
元のまま、代入する内容だけ変えれば良いのですよ? cwは単に選択された行を見せただけですよ? 少しは考えてコーディングしてください。
標準ではないモジュールを使うならば、絶対に他力本願しないように! 自力で解決できないなら、元のコードのままで満足してください。
(???) 2017/04/19(水) 17:44

(???)さん
ありがとうございました。
>標準ではないモジュールを使うならば
標準ではないんですか?
残念ですが、ご指導通りとします。
(yasu) 2017/04/19(水) 18:04

[[20141022104627]]
excel2013でできるのかは知りませんが、ご参考。
listboxでマウスホイールによるスクロールをする方法です。
少し危険かな、とも思いますのでお勧めはしませんが、こういう方法もあるということで・・・
(名無し) 2017/04/20(木) 10:26

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.