「……えっ、どうして? フィルタで非表示にしたはずのデータまで貼り付けられている……(泣)」
こんな経験はありませんか?
特定の顧客データだけを画面に表示させて、いつも通りにコピー&ペースト。しかし、貼り付け先確認すると、非表示だったはずの他社のデータまでずらりと並んでいる……。これはExcel初心者あるあるですよね。
実は、VBA(マクロ)を使えば、この「見えているセルだけ(可視セル)」を扱う操作は、たった1行のコードを追加するだけで解決できます。今回は、そのテクニックを紹介します。
なぜ「見えている範囲だけ」をコピーできないのか?
通常のVBAで Range(“A1:B10”).Copy と書くと、Excelは「指定された範囲内にあるセルは、非表示かどうかにかかわらず、すべてコピーする」と解釈してしまいます。
これを「画面に表示されているセルだけを対象にしてほしい」と指示するために使用するのが、SpecialCells(スペシャルセルズ)という指示になります。
【例え話で解説】お米を分ける「ふるい」のイメージ
少しイメージしてみてください。砂が混じってしまったお米から、お米だけをきれいに取り出したいとき、私たちは「ふるい」を使いますよね。
「非表示」という不要な砂を下に落とし、「可視(表示されている)」という美味しいお米だけをきれいに残してくれるのです。
コピペで使える!可視セルのみを操作するコード
では、実際に現場でそのまま使えるコードをご紹介します。
1.フィルタで抽出されたデータだけを別シートにコピーする
このコードは、オートフィルタでデータが抽出された状態で実行することで、画面に見えているデータだけを別シートへと正確に転記します。
Sub CopyVisibleCellsOnly()
' 変数の宣言
Dim wsSource As Worksheet
Dim wsTarget As Worksheet
Set wsSource = ThisWorkbook.Worksheets("データ")
Set wsTarget = ThisWorkbook.Worksheets("抽出結果")
' 万が一フィルタがかかっていなかった時のためにエラー回避
On Error Resume Next
' A1から始まる表全体のうち、「見えているセル(xlCellTypeVisible)」だけをコピー
wsSource.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _
Destination:=wsTarget.Range("A1")
' エラー処理を元に戻す
On Error GoTo 0
MsgBox "抽出データの転記が完了しました!"
End Sub
2.フィルタで抽出されたデータの合計値だけを算出する
「画面に表示されている金額だけを合計して、変数に格納したい」という場面では、VBAでWorksheetFunction.Subtotalを活用するのが最適です。
Sub SumVisibleCells()
Dim targetRange As Range
Dim totalSum As Double
' 金額が入っているB列の範囲(見出しを除く)を指定
Set targetRange = Range("B2:B100")
' WorksheetFunctionのSUBTOTAL関数を使います
' 「109」は、非表示の行を無視して合計する(SUM)という指示です
totalSum = Application.WorksheetFunction.Subtotal(109, targetRange)
MsgBox "現在表示されている金額の合計は " & Format(totalSum, "#,##0") & " 円です。"
End Sub
おわりに
今回ご紹介した SpecialCells(xlCellTypeVisible) というコードを知っているだけでも、実務においては非常に強力な武器になります。それほど実践的で価値のあるテクニックです。
大切なのは、小さな成功体験を積み重ねて「自動化の圧倒的な便利さ」を体感することです。ぜひ今回紹介したコードを試してみてください!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント