■3-7 検索操作マクロ作成で一寸見たいコマンド使用例
データを解析する場合、ある条件にあったデータがどれ位あるか調べたい
ケースがあります。条件に一致するデータを抽出方法は色々ありますが
ここでは主な検索(抽出)コマンドの使用方法を紹介します。




(1)AutoFilterメソッドで抽出データを解析例
AutoFilterメソッドの使用方法の説明は省略しますが、ここでは抽出された
データの解析例を紹介します。

[1]フィルタで抽出したセルの合計を求める
ある条件で抽出後、抽出されたデータの合計値が知りたい場合があります。
本例は抽出されたセルに入っている数量を合計するマクロ例です。
(実行例は画面61参照)

画面61フィルタで抽出した行から数量を合計例

Sub 検索1_1()
Dim ccc As Integer, sel As Object
    Range("A2").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=2, Criteria1:="D"
    Range("A2").Select
    endr = Range("B10000").End(xlUp).Row
 
    Range(Cells(3, 3), Cells(endr, 3)).SpecialCells(xlVisible).Select
 
    For Each sel In Selection
        ccc = ccc + sel.Value
    Next
MsgBox ccc
Selection.AutoFilter
End Sub


[2]フィルタで抽出した行へナンバリング
ある条件で抽出後、抽出されたセルにナンバリングを記入すると、後から
抽出されたデータの分析または処理しやすい場合があります。本マクロは
フィルタで抽出した行へナンバリングする例です。
(実行例は画面62参照)

画面62 フィルタで抽出した行へナンバリング実行例


Sub 検索1_2()
Dim ban As Integer, sel As Object
    Range("A2").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=2, Criteria1:="F"
    Range("A2").Select
    Range("A2").Select
    endr = Range("B10000").End(xlUp).Row
 
    Range(Cells(3, 3), Cells(endr, 3)).SpecialCells(xlVisible).Select
    ban = 1
    For Each sel In Selection
        sel.Select
        r = ActiveCell.Row
            Cells(r, 4) = ban
            ban = ban + 1
    Next
End Sub


【参考364】抽出解析には「Subtotal」ワークシート関数の使用が便利です
AutoFilterメソッドでは、抽出したセルの合計や抽出した件数を返すプロパティ
はありません。それらは求めるにはワークシート関数の「Subtotal」を使うと
便利です。

・抽出したセルの合計は「Subtotal」ワークシート関数でもできます。

Sub 検索1_4()
Dim ccc As Integer
    ccc = WorksheetFunction.Subtotal(9, Range("C:C"))
    MsgBox "検索した「D]の合計は⇒ " & ccc
End Sub


・「Subtotal」ワークシート関数は抽出した件数も求められます。
Sub 検索1_5()
Dim ccc As Integer
    ccc = WorksheetFunction.Subtotal(3, Range("C:C")) - 1
    MsgBox "抽出した行数は⇒ " & ccc
End Sub




(2)SumIf関数で抽出セルの合計を求める例
前述でフィルタで抽出したセルの合計のサンプルを紹介しましたが、
1個の条件に合ったセルの合計を求める場合はこちらの「SumIf関数」を
使用した方が簡単です。
(実行例は画面63参照)

画面63 SumIf関数で抽出セルの合計例


Sub 検索1_3()
Dim ccc As Integer, sel1 As Object, sel2 As Object
    endr = Range("B10000").End(xlUp).Row
    Set sel1 = Range(Cells(3, 2), Cells(endr, 2))
    Set sel2 = Range(Cells(3, 3), Cells(endr, 3))
 
    ccc = Application.WorksheetFunction.SumIf(sel1, "D", sel2)
 
   MsgBox "検索した「D]の合計は⇒ " & ccc
End Sub




(3)シート全体からFindメソッドで検索例
Excelシートから特定の文字を検索したい場合は、Findメソッドで検索し
抽出したセルをアクティブにすると見やすくなります。
日付関連の検索(1-9節)の説明でFindメソッドのサンプルを紹介しました
が、基本構成は同じですが、こちらは検索対象部分をパーツ(xlPart)にした点
と、セルを選択してアクティブにした点が異なっています(実行例は画面64参照)

画面64シート全体から検索例


Sub 検索1_3()
Dim myrng As Range, mozi As String, msg As String
Dim stadd As String, ync As Integer
 
mozi = InputBox("検索する文字を指定してください", "検索")
If mozi = "" Then Exit Sub
    Set myrng = Cells.Find(mozi, LookAt:=xlPart)
        If myrng Is Nothing Then
               MsgBox "検索文字はありません"
               Exit Sub
            Else
              myrng.Select
              stadd = ActiveCell.Address
        msg = "検索文字「" & mozi & "」は["
        ync = MsgBox(msg & ActiveCell.Address & "]にあります", 1, "検索結果")
              If ync = 2 Then Exit Sub
            End If
Do
     Cells.FindNext(After:=ActiveCell).Activate
        If stadd = ActiveCell.Address Then
            Exit Do
        End If
        ync = MsgBox(msg & ActiveCell.Address & "]にあります", 1, "検索結果")
              If ync = 2 Then Exit Sub
Loop
    MsgBox "検索が終了しました。"
End Sub




(4)リンクを張ったセルを検索するマクロ例
他人または他社から送られてきたファイルで、別ブックを参照するような
計算式が入っており、送り手は自分のPCに入っているファイルの参照で
問題ないでしょうが、受け取り側では不具合が発生するケースがありました。
本マクロは、不要なリンクを削除したい場合、そのセルの位置を検索して
表示できます(実行例は画面65参照)。

画面65リンクを張ったセルを検索例


Sub 検索2()
Dim linname As Variant, linn As String, actv As Object
Dim i As Integer, msg As String, yn As Integer
Application.ScreenUpdating = False
ReDim chk(3, 100) As String
i = 0
    snam = ActiveSheet.Name
    Sheets(snam).Copy
Do
  linname = ActiveWorkbook.LinkSources()
  If IsEmpty(linname) Then
     Exit Do
  Else
  linn = Right(linname(1), 6)
  ActiveSheet.UsedRange.Select
  Set actv = Selection.Find(linn, , , xlPart)
        If actv Is Nothing Then
              Exit Do
        Else
            actv.Select
            chk(0, i) = snam
            chk(1, i) = linname(1)
            chk(2, i) = ActiveCell.Row
            chk(3, i) = ActiveCell.Column
            i = i + 1
       Cells(ActiveCell.Row, ActiveCell.Column).ClearContents
       End If
  End If
Loop
    ActiveWorkbook.Saved = True
    ActiveWorkbook.Close
    Application.ScreenUpdating = True
If i = 0 Then
  MsgBox "チェックしたブックにはリンクを張ったセルはありません。"
Else
  msg = "このブックにはリンクを張ったセルが「" & i & "」個あります。" & _
  Chr$(10) & "リンクを張ったセルをアクティブにしますか"
 yn = MsgBox(msg, 36, "セルの表示 ")
  If yn = 7 Then
     Exit Sub
  End If
End If
i = i - 1
For j = 0 To i
 Worksheets(chk(0, j)).Activate
    Cells(Val(chk(2, j)), Val(chk(3, j))).Select
    msg = "シ−ト名は " & chk(0, j) & Chr(10) & _
   "リンク元は " & chk(1, j) & Chr(10) & _
   "リンクの記述セル(" & chk(2, j) & "行、" & chk(3, j) & "列)" & _
        Chr(10) & "次を表示しますか"
   yn = MsgBox(msg, 4, "リンク場所 ")
   If yn = 7 Then
     Exit Sub
  End If
Next
  MsgBox "表示は終了しました。"
End Sub


【参考365】エラー処理マクロ:On Error Resume Nextの使用例
マクロ実行中にエラーが発生するとエラーメッセージが表示されマクロは止まってしまいます。自分で
作ったマクロを1人で使用する場合は問題ないが、不特定多数の方が使うマクロを作成の場合は、
可能な限りエラー発生防止策を織り込む必要があります。それでも想定外のエラーは起こるので、
通常はエラーが発生した場合の処置を「On Errorステートメント」でマクロに組み込みます。
On Errorステートメント処理の使い分けを説明します。

エラーが発生しても、次のステートメントから処理を実行します。
普通本例のようにErr番号で条件分岐し、特定のエラーに対して対処方法を記述する方法があります。
なお、「On Error GoTo 0」でエラー処理を無効にしますが、このステータスが無くてもプロシージャ終了
でエラー処理は無効になります。

Sub エラー1()
On Error Resume Next
    Sheets("Sheet10").Select
    If Err = 9 Then
        MsgBox "エラーが発生しました。"
    Else
        ActiveCell.FormulaR1C1 = "abc123"
    End If
On Error GoTo 0
End Sub


【参考366】エラー処理マクロ:On Error GOTo ラベルの使用例
エラー発生時にラベル行以降を実行します。普通処理方法のステータスは
プロシージャの最後に書きますが、正常な進行でもそのラベル行を実行しな
いようにラベルの前に「 Exit Sub」記入を忘れないようにして下さい。

Sub エラー2()
On Error GoTo shoti
    Sheets("Sheet10").Select
        ActiveCell.FormulaR1C1 = "abc123"
 
 Exit Sub
shoti:
    MsgBox "エラーが発生しました。"
End Sub


【参考367】漢字のフリカナを別セルへ記入例
索引作成で50音順の並べ替えをおこなったが、先頭文字が漢字のケースが上手く並べ替えることがで
きませんでした。下図のB列のようにフリカナに直して並べ替えで解決できました。

・Excel上で記入した文字は問題ないが、別の場所からのコピーペーストのケースでは
  フリ仮名をふれないので、SetPhonetic メソッドで新Phonetic オブジェクトを作成します。
・表示をひらがなの場合は"CharacterType = xlHiragana"
・カタカナ半角の場合は"CharacterType = xlKatakanaHalf" を指定すればよい。
・B列のふりがなサイズについては、B列へフォントサイズを指定する。


Sub ふりかな()
カタカナ指定
    Range(Cells(2, 1), Cells(20, 1)).Select
    Selection.SetPhonetic
    Selection.Phonetics.CharacterType = xlKatakana
ふりがな入力
    Range(Cells(2, 2), Cells(20, 2)).Formula = "=PHONETIC(a2)"
    Range("a1").Select
End Sub



【戻る】    【Top画面】   【HPへ】