こんにちは、じゅんぱ店長(@junpa33)です。
今回は先回の記事の続きとなります。「雑誌バックナンバー検索.xlsm」を作成していきます。
先回の記事の読み直しはこちらから>>>
雑誌のバックナンバー検索を容易にするツール。送品予定表から作るエクセルVBAソフト
バックナンバー検索表作成に関連した記事はこちらになります。
コンテンツ
検索条件の種別を考える
先回は送品予定表をひとまとめにしてデータベース化しました。今回は、
検索キーワードを入力してそのキーワードに従ったデータを表示できるようにします。
検索キーワードは何種類か考えられますが、
”送品年月日”・”雑誌名”・”雑誌コード”として進めていきます。
検索条件を受け付けるVBAコードを組み立てる
少し解説が長くなってくると思いますが、各標題に従って説明していきます。
キーワードによって検索結果を表示する
それではキーワードとして、”送品年月日”・”雑誌名”・”雑誌コード”を設定しています。
検索結果を適切に表示させるためには複数の条件を加味させる必要があります。
検索項目と表示方法の設計
「まとめデータ」シートでまとめた期間分をベースとして”雑誌名”や”雑誌コード”で検索した場合、まとめた期間についてその全期間を対象として検索結果が表示されてしまいます。
そこで、送品年月日の期間を設定して前年同期などの過去比較や期間比較ができるようにします。
VBAプログラムの進行的には、まず検索として雑誌名やコードでデータを絞り込みます。
さらに設定した期間により、検索されたデータをさらに選別抽出し、検索結果を確定させる流れとなります。
最後に、次の検索をするために前の検索結果表をクリアします。
前の検索結果保存のために「メモ」シートを適宜コピペ利用します。(ユーザーサイドの作業)
コードは ”Module2” に記述していきます。
雑誌名による検索のコード
ではまずModule2を挿入します。
方法はもうご存知とは思いますが、念のため挿入方法の確認はこちら↓です。
関連記事
検索条件の入力は”検索コントロールパネル”(ユーザーフォーム)で行いますので、モジュールの最初に使用する変数を宣言します。
コード⑥
Public fdatey As Variant
Public tdatey As Variant
Public fdatem As Variant
Public tdatem As Variant
Public fdated As Variant
Public tdated As Variant
Public myKEY As Variant
Public myKEYb As Variant
Public Krow As Long
Public Drow As Long
検索のためのコードを組み立てるには、検索ワードの項目欄を指定してFindとFindNextメソッドを利用します。
入力セルの最終行を取得する方法はこちらを参考にしてください。
Findメソッドでの検索方法についてはこちらの記事を参考にできます。
エクセルVBA Findメソッドでの検索の方法とコード組み立てのコツ
「Do~Loop」の使い方についてはこちらの記事を参考にしてください。
コード⑦
Sub 雑誌名検索()
Dim Tc As Range
Dim Tcs As Range
Dim myRange As Range
Dim Frow As Long
Dim i As Long, n As Long
Worksheets("検索結果").Select
検索結果クリア
Worksheets("データまとめ").Range("A1", "L1").Copy _
Destination:=Worksheets("検索結果").Range("A1")
Worksheets("データまとめ").Select
Drow = Worksheets("データまとめ").Range("B1").CurrentRegion.Rows.Count
Set myRange = Range("I2", "I" & Drow)
H = 2
Set Tc = myRange.Find(myKEY, LookIn:=xlValues, LookAt:=xlPart, MatchByte:=False)
If Tc Is Nothing Then
Worksheets("検索結果").Select
MsgBox "「" & myKEY & "」はありませんでした"
Exit Sub
検索結果クリア
End If
Frow = Tc.Row
Set Tcs = Tc
Do
Worksheets("データまとめ").Range("A" & Tcs.Row, "L" & Tcs.Row).Copy _
Destination:=Worksheets("検索結果").Range("A" & H)
Set Tcs = myRange.FindNext(Tcs)
If Tcs Is Nothing Then Exit Do
H = H + 1
Loop Until Tcs.Row = Frow
Worksheets("検索結果").Select
Krow = Range("B1").CurrentRegion.Rows.Count
n = 1
For i = 2 To Krow
Range("A" & i) = n
n = n + 1
Next i
期間設定
End Sub
期間の設定についてのコード
期間の設定による絞り込みの方法については、送品年月日の8桁数字を「年・月・日」に分解して数字の大小比較で行います。
期間の始まりと終わり(2項目)と年月日の3項目の条件設定(変数)を考えます。
最終的に絞り込み対象外の年月日データは「検索結果」表から削除しますが、絞り込み対象内か対象外かの条件判断が複数条件のため複雑になります。
そこで、
6条件を一つずつ比較していますが、その時の対象外のデータについては対象外マークをスタンプしていきます。(”●”を付けます。)
データチェック後
”●”のついたデータを「検索結果」表から削除しますが、今回の削除方法は少し変わった方法を使います。
”●”スタンプを「普通のデータ」感覚で、同一データ重複削除メソッド「RemoveDuplicates」を使って複数個の要削除データを一挙に1つに減らしてしまいます。
最後に残りの1つの”●”のセル位置を特定して行削除すればOKです。
(以前Do~Loopを使って削除しようとしてコードをミスって暴走させてしまったことがトラウマになってしまいました。個人的に)
説明が長くなりましたが、コードはこのようになります。
コード⑧
Sub 期間設定()
Dim Y As Long
Dim M As Long
Dim D As Long
Dim Krowc As Long
Dim i As Long, j As Long, p As Long
If fdatey = "" And tdatey = "" Then
GoTo L01
End If
For j = 2 To Krow
Y = Left(Range("B" & j), 4)
If fdatey <> "" Then
If Y < fdatey Then Range("A" & j) = "●" If Y > tdatey Then Range("A" & j) = "●"
End If
If Range("A" & j) <> "●" Then
If fdatem = "" And tdatem = "" Then
GoTo L02
End If
M = Mid(Range("B" & j), 5, 2)
If fdatem <> "" Then
If M < fdatem Then Range("A" & j) = "●" If M > tdatem Then Range("A" & j) = "●"
Else
fdatem = 0
If M > tdatem Then Range("A" & j) = "●"
End If
Else
End If
If Range("A" & j) <> "●" Then
If fdated = "" And tdated = "" Then
GoTo L02
End If
D = Mid(Range("B" & j), 7, 2)
If fdated <> "" Then
If D < fdated Then Range("A" & j) = "●" If D > tdated Then Range("A" & j) = "●"
End If
Else
End If
L02:
Next j
L01:
Application.CutCopyMode = False
●削除
With Worksheets("検索結果")
.Range("A1").CurrentRegion.Sort key1:=.Range("B2"), Header:=xlYes
End With
Krowc = Range("B1").CurrentRegion.Rows.Count
p = 1
For i = 2 To Krowc
Range("A" & i) = p
p = p + 1
Next i
Range("A1").Select
Module1.シート体裁
End Sub
コード⑨
Sub ●削除()
Dim Krow As Long
Dim Krowb As Long
Dim n As Long
Krow = Range("B1").CurrentRegion.Rows.Count
Range("A2:L" & Krow).RemoveDuplicates (Array(1))
Krowb = Range("B1").CurrentRegion.Rows.Count
For n = 2 To Krowb
If Range("A" & n) = "●" Then
Rows(n).Delete
End If
Next n
End Sub
雑誌ナンバーによる検索のコード
検索のためのコードを組み立てるには、「雑誌名による検索のコード」と同様に検索ワードの項目欄を指定してFindとFindNextメソッドを利用します。
コード⑩
Sub 雑誌NO検索()
Dim Tcb As Range
Dim Tcsb As Range
Dim myRangeb As Range
Dim Frowb As Long
Dim i As Long, n As Long
Worksheets("検索結果").Select
検索結果クリア
Worksheets("データまとめ").Range("A1", "L1").Copy _
Destination:=Worksheets("検索結果").Range("A1")
Worksheets("データまとめ").Select
Drow = Worksheets("データまとめ").Range("B1").CurrentRegion.Rows.Count
Set myRangeb = Range("D2", "D" & Drow)
H = 2
Set Tcb = myRangeb.Find(myKEYb, LookIn:=xlValues, LookAt:=xlWhole, MatchByte:=False)
If Tcb Is Nothing Then
Worksheets("検索結果").Select
MsgBox "「" & myKEYb & "」はありませんでした"
Exit Sub
検索結果クリア
End If
Frowb = Tcb.Row
Set Tcsb = Tcb
Do
Worksheets("データまとめ").Range("A" & Tcsb.Row, "L" & Tcsb.Row).Copy _
Destination:=Worksheets("検索結果").Range("A" & H)
Set Tcsb = myRangeb.FindNext(Tcsb)
If Tcsb Is Nothing Then Exit Do
H = H + 1
Loop Until Tcsb.Row = Frowb
Worksheets("検索結果").Select
Krow = Range("B1").CurrentRegion.Rows.Count
n = 1
For i = 2 To Krow
Range("A" & i) = n
n = n + 1
Next i
期間設定
End Sub
検索結果のクリア
次の検索作業をするときのために、前の検索結果をクリアします。
このコードはいたって簡単です。
- 全セルを掴んでClearメソッド
- セルのUseStandardプロパティ
を使っています。
コード⑪
Sub 検索結果クリア()
Worksheets("検索結果").Cells.Clear
With Worksheets("検索結果")
.Cells.UseStandardHeight = True
.Cells.UseStandardWidth = True
End With
End Sub
少し長い画像になってしまいました。
バックナンバー検索エクセル作成のまとめ
検索のキーワードの種類として”送品年月日”・”雑誌名”・”雑誌コード”としました。
そのほかに加えたいものがあれば、追加のカスタムをしていただければと思います。
この様に、検索のためのVBAコードとしては、Findメソッドが使い易いと思います。
次回第三部は「検索コントロールパネル」をユーザーフォームで作成します。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です
エクセルVBAの独習には動画学習という方法もあります。 目と耳両方を使って学習することでさらに勉強効率を上げることもできると思います。
エクセルVBA初級者がUdemyで動画学習する講座おすすめ5選と無料講座の上手な使い方。


電子書籍版「改訂新版 てっとり早く確実にマスターできるExcel VBAの教科書」をamazonで見てみる
(著者)大村あつし(出版社)技術評論社
(税込価格)2,508円(本体2,280円+税)
30冊を超えるExcelのマクロやVBAの解説書を執筆してきた著者による考え抜かれた本書の内容と構成。
独創的な解説手法で必ずExcel VBAが理解できます!
初級からの参考書ですが、より実践的切り口での解説をしています。
QRコードから操作の流れを動画(無音です)で確認することもできるようになりました。
文章解説と動画との関係性は、主は文章での解説、サポートが動画になります。
エクセルVBAを使って業務効率を上げて行くのに、始めのうちに知っておきたい内容を纏めています。
今回の記事はここまでです。 最後までご覧いただき有難うございました。