[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ListBoxの代わりにListViewに表示させるには』(take)
現在データをUFのListBoxに下記コードにて候補表示していますが
件数が増えマウススクロールが利用できるListViewに書き換えるには
どのようにすれば可能でしょうか
候補表示の概要説明は以下です。
1.X列 5行目から最下行は不特定
2.同一名称は、1つとし重複は省く(空白(未入力)は無視)
順番はX5から下へ入力順でかまいません。(ソートの必要なし)
ListView側の準備も含め
よろしくお願いします
Private Sub UserForm_Activate()
With ListView1
'プロパティ
.View = lvwReport
.LabelEdit = lvwManual
.HideSelection = False
.AllowColumnReorder = True
.FullRowSelect = True
.Gridlines = True
''列見出し
.ColumnHeaders.Add , "_List", "社名", 150’1列
End With
Private Sub UserForm_Initialize()
Dim c As Object
Dim r As Range
Dim t As Range
If Cells(5, 24).Value <> "" Then
Set c = CreateObject("Scripting.Dictionary")
Set t = Range("X5", Cells(Rows.Count, "X").End(xlUp))
On Error Resume Next
For Each r In t
c.Add r.Value, 0
Next
On Error GoTo 0
Me.ListBox1.List = c.keys
Else
MsgBox "データがありません", vbExclamation
Me.ListBox1.AddItem "デフォルト値"
End If
ListBox1.ListIndex = Worksheets("見積").Range("AC1").Value
End Sub
< 使用 Excel:Excel2013、使用 OS:Windows10 >
UserForm_Initializeの方を修正して、
Private Sub UserForm_Initialize()
Dim c As Object
Dim r As Range
Dim t As Range
Dim k As Variant
If Cells(5, 24).Value <> "" Then
Set c = CreateObject("Scripting.Dictionary")
Set t = Range("X5", Cells(Rows.Count, "X").End(xlUp))
On Error Resume Next
For Each r In t
c.Add r.Value, 0
Next
On Error GoTo 0
With Me.ListView1
.ListItems.Clear
For Each k In c.keys
With .ListItems.Add
.Text = k
End With
Next
If .ListItems.Count > 0 Then .ListItems(1).Selected = True
End With
Else
MsgBox "データがありません", vbExclamation
End If
End Sub
(ウッシ) 2016/12/26(月) 09:21
よろしくお願いします
(take) 2016/12/26(月) 10:40
Private Sub UserForm_Activate()
With ListView1
'プロパティ
.View = lvwReport
.LabelEdit = lvwManual
.HideSelection = False
.AllowColumnReorder = True
.FullRowSelect = True
.Gridlines = True
''列見出し
.ColumnHeaders.Add , "_List", "社名", 150’1列
End With
End Sub
の方はそのままにしてありますか?
(ウッシ) 2016/12/26(月) 11:22
依って最初の条件を変更したいのですが
リスト内に(会社名が殆どです)(株)○○、○○(株)など
半角カッコや全角カッコなど(当然ですが(有)も存在します。)
この末尾の(株)は問題ないと思いますがあたま(株)はのぞき
(ソート時のみ、表示は(株)ついたままでOKです)
50音順に、表示させられないでしょうか
何度も申し訳ないのですがお知恵お貸しください。
よろしくお願いします。
記入のある社名は以下です。
○○(株)
○△(株)
□□(有)
?梶?○(機種依存の株です)
(株)○○
(株)○▲
(有)◇○
(有)□△
(take) 2016/12/26(月) 12:27
>50音順に、表示させられないでしょうか
50音順なら振り仮名の情報が欲しいかも?
Option Explicit
Private Sub UserForm_Initialize()
With ListView1
.View = lvwReport ''表示
.LabelEdit = lvwManual ''ラベルの編集
.HideSelection = False ''選択の自動解除
.AllowColumnReorder = True ''列幅の変更を許可
.FullRowSelect = True ''行全体を選択
.Gridlines = True ''グリッド線
.ColumnHeaders.Add , "_Name", "名前", 150 '1列
End With
Reset_ListView
End Sub
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
With ListView1
.SortKey = ColumnHeader.Index - 1
.SortOrder = .SortOrder Xor lvwDescending
.Sorted = True
End With
End Sub
Sub Reset_ListView()
Dim rngT As Range
Dim rngB As Range
Dim c As Range
Dim i As Long
With Sheets(1)
Set rngT = .Cells(5, "X")
Set rngB = .Cells(.Rows.Count, "X").End(xlUp)
End With
With Me.ListView1.ListItems
If rngT.Row <= rngB.Row Then
For Each c In Range(rngT, rngB)
If c.Value <> Empty Then
On Error Resume Next
.Add Key:=c.Value, Text:=c.Value
On Error GoTo 0
End If
Next
End If
If .Count = 0 Then .Add Text:="デフォルト値"
For i = 1 To .Count
If .Item(i).Key = Sheets(1).Range("AC1").Value Then
.Item(i).Selected = True
Exit For
End If
Next
End With
End Sub
あぁ、最初に昇順1回なら、アイテムを追加するときに
上手く並べ替えてもいけるかもですが、
アルゴリズムとか知らないとつらいですかね。。。
リストビューも自分で調べられんと、手取り足取り全部をっていうわけにもならんだろうから、
結構つらいかもですねー。。。
参考URL>>
http://officetanaka.net/excel/vba/listview/index.htm
(まっつわん) 2016/12/26(月) 13:27
>あぁ、最初に昇順1回なら、アイテムを追加するときに
>上手く並べ替えてもいけるかもですが、
>アルゴリズムとか知らないとつらいですかね。。。
アルゴリズム?解らないですね つらい
>最初に昇順1回なら、
↑これの意味はどういうことでしょうか
ユーザーフォーム起動はX列ダブルクリックで行っています。
(take) 2016/12/26(月) 14:19
↑は、
.Add Key:=c.Value, Text:=c.Value
のところでインデックス番号も指定できるようなので、
次に何番目に挿入すればいいかがわかれば、
昇順に並ぶであろうという話しです。
>ソートしてないようです。残念です
ヘッダーを1回クリックで昇順/降順に切り替わるはずですが。。。。
(株)とかの記号は別にして。。。
非表示の列に振り仮名情報を入れておけば、
希望する並べ替えが出来ると思います。
>参考URL>>
>確認しました。
>う〜、かなり難しいですね・・・
書いてあることが難しければ、
書いてないことを探るのはもっと難しいかと。。。
気長に研究出来ればいいのでしょうが、
モチベーションが続くかどうか。。。
ListViewはヘルプが使えないので、
オブジェクトブラウザでみたり、
ネットで他言語の解説とか見て想像するかくらいしか、
探る方法が思いつかないので、
初心者では厳しいかと思います。
まぁ、掲示板でしつこく聞くくらいしかできんとを思うけど、
詳しい人が掲示板で回答してるとは限らないので。。。^^;
(まっつわん) 2016/12/26(月) 14:35
Private Sub UserForm_Activate()
・・・
End Sub
は削除して貰って、
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
With ListView1
.SortKey = ColumnHeader.Index - 1
.SortOrder = .SortOrder Xor lvwDescending
.Sorted = True
End With
End Sub
は、まっつわんさんのをお借りして、
Private Sub UserForm_Initialize()
Dim r As Range
Dim t As Range
Dim k As Variant
With ListView1
'プロパティ
.View = lvwReport
.LabelEdit = lvwManual
.HideSelection = False
.AllowColumnReorder = True
.FullRowSelect = True
.Gridlines = True
''列見出し
.ColumnHeaders.Add , "_List", "社名", 150 '1列
.ColumnHeaders.Add , "_Kana", " かな名", 150 '1列
End With
If Cells(5, 24).Value <> "" Then
Set t = Range("X5", Cells(Rows.Count, "X").End(xlUp))
With Me.ListView1
.ListItems.Clear
On Error Resume Next
For Each r In t
With .ListItems.Add
.Key = r.Value
.Text = r.Value
.SubItems(1) = Application.GetPhonetic(法人格抜き(r.Value))
End With
Next
On Error GoTo 0
If .ListItems.Count > 0 Then .ListItems(1).Selected = True
End With
Else
MsgBox "データがありません", vbExclamation
End If
End Sub
Function 法人格抜き(s As String) As Variant
s = Replace(s, "特定非営利活動法人", "")
s = Replace(s, "(公益社団法人)", "")
s = Replace(s, "(社会福祉法人)", "")
s = Replace(s, "(農事組合法人)", "")
s = Replace(s, "(医療法人財団)", "")
s = Replace(s, "(医療法人社団)", "")
s = Replace(s, "社会福祉法人)", "")
s = Replace(s, "農事組合法人)", "")
s = Replace(s, "医療法人財団)", "")
s = Replace(s, "医療法人社団)", "")
s = Replace(s, "(社会福祉法人", "")
s = Replace(s, "(農事組合法人", "")
s = Replace(s, "(医療法人財団", "")
s = Replace(s, "(医療法人社団", "")
s = Replace(s, "商工組合連合会", "")
s = Replace(s, "協同組合連合会", "")
s = Replace(s, "(森林組合)", "")
s = Replace(s, "(生産組合)", "")
s = Replace(s, "(宗教法人)", "")
s = Replace(s, "(学校法人)", "")
s = Replace(s, "(企業組合)", "")
s = Replace(s, "(財団法人)", "")
s = Replace(s, "(社団法人)", "")
s = Replace(s, "(医療法人)", "")
s = Replace(s, "(協同組合)", "")
s = Replace(s, "(相互会社)", "")
s = Replace(s, "(合名会社)", "")
s = Replace(s, "(合資会社)", "")
s = Replace(s, "(有限会社)", "")
s = Replace(s, "(株式会社)", "")
s = Replace(s, "社会医療法人", "")
s = Replace(s, "公益社団法人", "")
s = Replace(s, "社会福祉法人", "")
s = Replace(s, "農事組合法人", "")
s = Replace(s, "医療法人財団", "")
s = Replace(s, "医療法人社団", "")
s = Replace(s, "(医財団)", "")
s = Replace(s, "(医社団)", "")
s = Replace(s, "森林組合)", "")
s = Replace(s, "生産組合)", "")
s = Replace(s, "宗教法人)", "")
s = Replace(s, "学校法人)", "")
s = Replace(s, "(企業組合", "")
s = Replace(s, "財団法人)", "")
s = Replace(s, "社団法人)", "")
s = Replace(s, "医療法人)", "")
s = Replace(s, "協同組合)", "")
s = Replace(s, "相互会社)", "")
s = Replace(s, "合名会社)", "")
s = Replace(s, "合資会社)", "")
s = Replace(s, "有限会社)", "")
s = Replace(s, "株式会社)", "")
s = Replace(s, "NPO法人", "")
s = Replace(s, "(森林組合", "")
s = Replace(s, "(生産組合", "")
s = Replace(s, "(宗教法人", "")
s = Replace(s, "(学校法人", "")
s = Replace(s, "企業組合)", "")
s = Replace(s, "(財団法人", "")
s = Replace(s, "(社団法人", "")
s = Replace(s, "(医療法人", "")
s = Replace(s, "(協同組合", "")
s = Replace(s, "(相互会社", "")
s = Replace(s, "(合名会社", "")
s = Replace(s, "(合資会社", "")
s = Replace(s, "(有限会社", "")
s = Replace(s, "(株式会社", "")
s = Replace(s, "(医財)", "")
s = Replace(s, "(医社)", "")
s = Replace(s, "医財団)", "")
s = Replace(s, "医社団)", "")
s = Replace(s, "(医財団", "")
s = Replace(s, "(医社団", "")
s = Replace(s, "(社福)", "")
s = Replace(s, "(社団)", "")
s = Replace(s, "特殊法人", "")
s = Replace(s, "合同会社", "")
s = Replace(s, "森林組合", "")
s = Replace(s, "生産組合", "")
s = Replace(s, "宗教法人", "")
s = Replace(s, "学校法人", "")
s = Replace(s, "企業組合", "")
s = Replace(s, "監査法人", "")
s = Replace(s, "財団法人", "")
s = Replace(s, "社団法人", "")
s = Replace(s, "医療法人", "")
s = Replace(s, "商工組合", "")
s = Replace(s, "共済組合", "")
s = Replace(s, "協業組合", "")
s = Replace(s, "協同組合", "")
s = Replace(s, "労働金庫", "")
s = Replace(s, "信用組合", "")
s = Replace(s, "信用金庫", "")
s = Replace(s, "相互会社", "")
s = Replace(s, "合名会社", "")
s = Replace(s, "合資会社", "")
s = Replace(s, "有限会社", "")
s = Replace(s, "株式会社", "")
s = Replace(s, "医財)", "")
s = Replace(s, "医社)", "")
s = Replace(s, "(医財", "")
s = Replace(s, "(医社", "")
s = Replace(s, "(社)", "")
s = Replace(s, "社福)", "")
s = Replace(s, "社団)", "")
s = Replace(s, "(社福", "")
s = Replace(s, "(社団", "")
s = Replace(s, "(農)", "")
s = Replace(s, "(宗)", "")
s = Replace(s, "(学)", "")
s = Replace(s, "(財)", "")
s = Replace(s, "(医)", "")
s = Replace(s, "(相)", "")
s = Replace(s, "(名)", "")
s = Replace(s, "(資)", "")
s = Replace(s, "(有)", "")
s = Replace(s, "(株)", "")
s = Replace(s, "NPO", "")
s = Replace(s, "事業団", "")
s = Replace(s, "社)", "")
s = Replace(s, "(社", "")
s = Replace(s, "農)", "")
s = Replace(s, "宗)", "")
s = Replace(s, "学)", "")
s = Replace(s, "財)", "")
s = Replace(s, "医)", "")
s = Replace(s, "相)", "")
s = Replace(s, "名)", "")
s = Replace(s, "資)", "")
s = Replace(s, "有)", "")
s = Replace(s, "株)", "")
s = Replace(s, "(農", "")
s = Replace(s, "(宗", "")
s = Replace(s, "(学", "")
s = Replace(s, "(財", "")
s = Replace(s, "(医", "")
s = Replace(s, "(相", "")
s = Replace(s, "(名", "")
s = Replace(s, "(資", "")
s = Replace(s, "(有", "")
s = Replace(s, "(株", "")
s = Replace(s, "??", "")
s = Replace(s, "??", "")
法人格抜き = LTrim(RTrim(s))
End Function
として、並べ変えは「かな名」という列名の部分をクリックしてみて下さい。
(ウッシ) 2016/12/26(月) 14:44
よろしくお願いします。
(take) 2016/12/26(月) 14:59
UserForm_Initialize、差し替えて下さい。
Private Sub UserForm_Initialize()
Dim r As Range
Dim t As Range
Dim k As Variant
With ListView1
'プロパティ
.View = lvwReport
.LabelEdit = lvwManual
.HideSelection = False
.AllowColumnReorder = True
.FullRowSelect = True
.Gridlines = True
''列見出し
.ColumnHeaders.Add , "_List", "社名", 150 '1列
.ColumnHeaders.Add , "_Kana", " かな名", 150 '1列
End With
If Cells(5, 24).Value <> "" Then
Set t = Range("X5", Cells(Rows.Count, "X").End(xlUp))
With Me.ListView1
.ListItems.Clear
On Error Resume Next
For Each r In t
If r.Value <> "" Then
.ListItems.Add Key:=r.Value
If Err.Number = 0 Then
With .ListItems(.ListItems.Count)
.Text = r.Value
.SubItems(1) = Application.GetPhonetic(法人格抜き(r.Value))
End With
Else
Err.Clear
End If
End If
Next
On Error GoTo 0
If .ListItems.Count > 0 Then .ListItems(1).Selected = True
End With
Else
MsgBox "データがありません", vbExclamation
End If
End Sub
(ウッシ) 2016/12/26(月) 15:11
サンプル作ってみました。
ウッシさんの「法人格抜き」関数を利用させてもらってます。
Sub Reset_ListView()
Dim rngT As Range
Dim rngB As Range
Dim c As Range
Dim i As Long
Dim s As String
With Sheets(1)
Set rngT = .Cells(5, "X")
Set rngB = .Cells(.Rows.Count, "X").End(xlUp)
End With
With Me.ListView1.ListItems
If rngT.Row <= rngB.Row Then
For Each c In Range(rngT, rngB)
If c.Value <> Empty Then
s = Application.GetPhonetic(法人格抜き(c.Value))
'=========挿入する位置の検索======
For i = 1 To .Count
If .Item(i).Key > s Then Exit For
Next
'=================================
On Error Resume Next
.Add Index:=i, Key:=s, Text:=c.Value '←挿入する位置を追加
On Error GoTo 0
End If
Next
End If
If .Count = 0 Then .Add Text:="デフォルト値"
For i = 1 To .Count
If .Item(i).Key = Sheets(1).Range("AC1").Value Then
.Item(i).Selected = True
Exit For
End If
Next
End With
End Sub
2万件くらいで試したら、
応答なしでユーザーフォームが開くまで、
20〜30分くらいかかってしまいました><
250件くらいで2〜3秒掛かりますかねぇ。。。
最初に使われている"Scripting.Dictionary"
を使えば、もう少し高速化出来るかも知れませんが、、、、
100件以上のリストから選択させるのは、
使う人にやさしくないですよねー
何文字か頭の文字を入力(または選択)して20件以内くらいにまずはリストを
絞り込む仕掛けが必要に思います。
(まっつわん) 2016/12/26(月) 16:47
あんまりデータ数が多かったら最初からシート上で重複削除して法人格抜きのデータとカナのデータを
セットしておくようにして、50音順にソートしておいた方が現実的ですよね。
「法人格抜き」もアドインにして数十件のリストで使っている感じですし。
(ウッシ) 2016/12/26(月) 16:53
(take) 2016/12/26(月) 17:53
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.