【2/3回答】
No.6のコードの続きに記述願います。
////////////VBAコード(2)////////////
'▼検索ボタンクリック時
Private Sub CommandButton1_Click()
'宣言
Dim key As String, myCol As Variant, Colcnt As Integer
Dim hit As Range, bk_hit As String
Dim data() As String, flag As Boolean
Dim cnt As Long, i As Long, frm As String
Dim myRng As Range, tarRng As Range
Dim myLabel As Variant, label_w As Variant
'準備
'リストビューに表示する列を設定
myCol = Split("I,D,O,Q", ",")
'ラベルに表示する文字列を設定
myLabel = Split("行番号,項目1,項目2,項目3,項目4", ",") '1つ目は検索行番号の列見出し名を指定
Colcnt = UBound(myCol) + 1
'列幅を設定
label_w = Split("0,50,70,90,110", ",") '省略不可、1つ目は行番号の列幅で非表示の場合は0を設定
'検索値を格納・スペースの削除
key = Me.TextBox1.Value
key = Replace(Replace(WorksheetFunction.Trim(key), " ", " "), " ", "")
'空白を除外してテキストボックスに反映
Me.TextBox1.Value = key '不要であれば削除してください
If Len(key) = 0 Then
MsgBox "検索値を入力してください。"
Exit Sub
End If
'検索対象を格納
Set tarRng = Cells
'Set tarRng = Range("D:D") '特定列を検索する場合コメントアウト
'検索基点を格納
Set myRng = tarRng.Cells(tarRng.Rows.Count, tarRng.Columns.Count)
'検索値,A1セル,値,部分一致,行方向,順方向,大/小文字区別無し,半/全角区別無しで検索
Set hit = tarRng.Find( _
What:=key, _
After:=myRng, _
LookIn:=xlValues, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False, _
MatchByte:=False)
'検索が見つからなかった時の処理
If hit Is Nothing Then
MsgBox """" & key & """が見つかりません"
Exit Sub
End If
bk_hit = hit.Address
ReDim data(Colcnt, 1)
'繰り返し検索処理
Do
'データ格納
If flag Then
flag = False
Else
data(0, cnt) = hit.Row
For i = 0 To UBound(myCol)
data(i + 1, cnt) = Cells(hit.Row, myCol(i)).Value
Next i
End If
'次検索
Set hit = tarRng.FindNext(hit)
'既一致チェック
If Application.Intersect(hit, myRng) Is Nothing Then
If myRng Is Nothing Then
Set myRng = Rows(hit.Row)
Else
Set myRng = Union(myRng, Rows(hit.Row))
End If
Else
flag = True
End If
'判定処理
If flag = False Then
cnt = cnt + 1
ReDim Preserve data(Colcnt, cnt + 1)
End If
Loop Until hit.Address = bk_hit
'リストビュー表示
With Me.ListView1
.ListItems.Clear
.ColumnHeaders.Clear
'初期化
.View = lvwReport '外観表示指定
.LabelEdit = lvwManual '左端項目の編集設定
.HideSelection = False 'フォーカス移動時の選択解除設定
.AllowColumnReorder = True '列幅の変更有無
.FullRowSelect = True '行全体を選択有無
.Gridlines = True 'グリッド線表示有無
'列見出し作成
If UBound(myLabel) = -1 Then
.ColumnHeaders.Add , , "列番号", CInt(label_w(0))
Else
.ColumnHeaders.Add , , myLabel(0), CInt(label_w(0))
End If
If UBound(myCol) = UBound(myLabel) - 1 Then
For i = 0 To UBound(myLabel) - 1
.ColumnHeaders.Add , , myLabel(i + 1), CInt(label_w(i + 1))
Next
Else
For i = 0 To UBound(myCol)
.ColumnHeaders.Add , , myCol(i) & "列", CInt(label_w(i + 1))
Next
End If
'行番号の桁表示様式作成
frm = WorksheetFunction.Rept("0", Len(CStr(data(0, cnt - 1))))
'データ登録
For cnt = 0 To UBound(data, 2) - 2
With .ListItems.Add
'行番号登録
.Text = Format(data(0, cnt), frm)
'4番目の要素が空白以外なら着色
If Len(data(4, cnt)) > 0 Then
.ForeColor = RGB(255, 0, 0)
End If
'指定列項目登録
For i = 1 To UBound(myCol) + 1
.SubItems(i) = data(i, cnt)
'4番目の要素が空白以外なら着色
If Len(data(4, cnt)) > 0 Then
.ListSubItems(i).ForeColor = RGB(255, 0, 0)
End If
Next i
End With
Next cnt
End With
End Sub
お礼
eden3616さん ありがとうございます。 質問に対するアンサーとして、一番キモとなる検索部分を担うコードでしたので 回答No.7をベストアンサーとさせていただきました。 この度は、本当にたくさんお世話になりました。 今後とも、もし見かける機会がございましたらどうぞよろしくお願いいたします。 ありがとうございました。