検索条件を受け付けるVBAコードを組み立てる。雑誌バックナンバー検索エクセル

zassibackno02eyecatchaaa

こんにちは、じゅんぱ店長(@junpa33)です。

 

今回は先回の記事の続きとなります。「雑誌バックナンバー検索.xlsm」を作成していきます。

 

先回の記事の読み直しはこちらから>>>

雑誌のバックナンバー検索を容易にするツール。送品予定表から作るエクセルVBAソフト

 

バックナンバー検索表作成に関連した記事はこちらになります。

「バックナンバー検索表」の記事一覧を開く

 

検索条件の種別を考える

 

先回は送品予定表をひとまとめにしてデータベース化しました。今回は、

 

検索キーワードを入力してそのキーワードに従ったデータを表示できるようにします。

検索キーワードは何種類か考えられますが、

”送品年月日”・”雑誌名”・”雑誌コード”として進めていきます。

 

検索条件を受け付けるVBAコードを組み立てる

boder82-01a

少し解説が長くなってくると思いますが、各標題に従って説明していきます。

キーワードによって検索結果を表示する

 

それではキーワードとして、”送品年月日”・”雑誌名”・”雑誌コード”を設定しています。

検索結果を適切に表示させるためには複数の条件を加味させる必要があります。

 

検索項目と表示方法の設計

 

「まとめデータ」シートでまとめた期間分をベースとして”雑誌名”や”雑誌コード”で検索した場合、まとめた期間についてその全期間を対象として検索結果が表示されてしまいます。

そこで、送品年月日の期間を設定して前年同期などの過去比較や期間比較ができるようにします。

 

VBAプログラムの進行的には、まず検索として雑誌名やコードでデータを絞り込みます。

さらに設定した期間により、検索されたデータをさらに選別抽出し、検索結果を確定させる流れとなります。

 

最後に、次の検索をするために前の検索結果表をクリアします。

前の検索結果保存のために「メモ」シートを適宜コピペ利用します。(ユーザーサイドの作業)

 

コードは ”Module2” に記述していきます。

 

雑誌名による検索のコード

 

ではまずModule2を挿入します。

方法はもうご存知とは思いますが、念のため挿入方法の確認はこちら↓です。

VBE(ビジュアルベーシックエディター)を起動する

関連記事

エクセルVBA 始めての起動。VBEの立ち上げ、保存と終了

変数の宣言方法で適用範囲をコントロールするVBA記述

 

検索条件の入力は”検索コントロールパネル”(ユーザーフォーム)で行いますので、モジュールの最初に使用する変数を宣言します。

コード⑥

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メソッドを利用します。

 

MEMO

入力セルの最終行を取得する方法はこちらを参考にしてください。

データ入力済セルの最終行番号を取得するVBAコード

Findメソッドでの検索方法についてはこちらの記事を参考にできます。

エクセルVBA Findメソッドでの検索の方法とコード組み立てのコツ

「Do~Loop」の使い方についてはこちらの記事を参考にしてください。

VBA 回数不定のループ処理はDo LoopとFor Each

 

コード⑦

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

backnoken2001a

 

期間の設定についてのコード

 

期間の設定による絞り込みの方法については、送品年月日の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メソッドを利用します。

MEMO

Findメソッドでの検索方法についてはこちらの記事を参考にできます。

エクセルVBA Findメソッドでの検索の方法とコード組み立てのコツ

 

コード⑩

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プロパティ

を使っています。

 

MEMO

シートのクリアのためのエクセルVBAコードの作り方については、この記事が参考になります。

エクセルVBA シートのクリアーを目的のメソッド別に最速理解

 

コード⑪

Sub 検索結果クリア()

    Worksheets("検索結果").Cells.Clear
    With Worksheets("検索結果")
        .Cells.UseStandardHeight = True
        .Cells.UseStandardWidth = True
    End With

End Sub

少し長い画像になってしまいました。

backnoken2005a

 

バックナンバー検索エクセル作成のまとめ

 

検索のキーワードの種類として送品年月日”・”雑誌名”・”雑誌コード”としました。

そのほかに加えたいものがあれば、追加のカスタムをしていただければと思います。

この様に、検索のためのVBAコードとしては、Findメソッドが使い易いと思います。

 

次回第三部は「検索コントロールパネル」をユーザーフォームで作成します。

 

 

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

 

エクセルVBAの独習には動画学習という方法もあります。 目と耳両方を使って学習することでさらに勉強効率を上げることもできると思います。
エクセルVBA初級者がUdemyで動画学習する講座おすすめ5選と無料講座の上手な使い方。

 

改訂新版 てっとり早く確実にマスターできるExcel VBAの教科書
定番参考書の改定新版が、動画付きになりもっと分かり易くなった
vbastudy022a
vbastudy023a

電子書籍版「改訂新版 てっとり早く確実にマスターできるExcel VBAの教科書」をamazonで見てみる

(著者)大村あつし
(出版社)技術評論社
(税込価格)2,508円(本体2,280円+税)

30冊を超えるExcelのマクロやVBAの解説書を執筆してきた著者による考え抜かれた本書の内容と構成。
独創的な解説手法で必ずExcel VBAが理解できます!
初級からの参考書ですが、より実践的切り口での解説をしています。
QRコードから操作の流れを動画(無音です)で確認することもできるようになりました。
文章解説と動画との関係性は、主は文章での解説、サポートが動画になります。

 

エクセルVBAを使って業務効率を上げて行くのに、始めのうちに知っておきたい内容を纏めています。

「VBA最速理解」の記事一覧を開く

 

今回の記事はここまでです。   最後までご覧いただき有難うございました。

<記事内容についての告知>VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。