【VBA】カット・アンド・ペースト、そして一括削除

隣から同僚が「問題発生しちゃった。」と深刻そうに言ってきたから何事かと聞いてみたら、マクロである程度解決出来たというお話。

問題となったのは、前任者の引継書に手順が記載されていなかったタスク。前任者の足跡を見る限り、どこからかデータを(恐らく)CSV形式でダウンロードし、それをもとに更新作業をしていた。後任のスタッフは、データをどのように更新するかについては何となくわかるようだったが、今回の問題はその前段階のデータ取得で発生していた。

まず、彼女は、会社で契約しているデータベースにアクセスしてデータをダウンロードしたのだという。でも、結果を見ると、数十件と明らかに少ない。そこで、データベースの会社へ連絡。すると、現行の契約内容では主だったもののデータしかダウンロードできない、ウェブページに載っている情報を見て対応してほしい、と回答されたのだという。

ウェブサイトを見ると、めちゃくちゃスクロールする必要があるものの、データは全部載っているとのことだった。

いつもなら力技(地道に一件一件目視・・・)で頑張る彼女だけど、報告期限まで時間が迫っていて、私に相談してきた。

【リクエスト】一列に並んだデータを別の行に分けて表示させたい

とりあえず、該当ページで全選択(【Ctrl】+【A】)して、空のエクセルブックに貼ってみた。(形式を選択して貼付→Unicode text) 結果はこんな感じ。

Item A -1
xxx
(blank row)
Item A -2
xxx

理想は、こんな感じ。

Item A -1 xxx
Item A -2 xxx

【解法】VBA|カット・アンド・ペーストを使って2行に分ける

10行以内の短いマクロで解決する。

おまけ【解法】VBA|3行以上に分ける

今回は、めちゃくちゃ単純な例だったけど、これがもし、以下のような感じだったらどうするか。(括弧内の数値は行番号とする)

Item A -1
Description 1
Description 2
(blank row)
Item A -2
Description 1
Description 2

あまり良くない解法かもしれないけど、私の回答は以下。

空白行の削除を最初に入れてループの回数を減らすのが良いのかな、と。 同様に、2回目の空白行の削除をループの中に入れるのも非効率な気がするけど、もしそうするのであれば、ループは下の行から順に回すこと。

おさらい

こんなのはHelpとかにまとまっているんだけど、一応。

今回のおさらい

カット・アンド・ペースト

[最初のセル].Cut [移動先のセル]

空白行の一括削除

[空白行が含まれている列].Cells.SpecialCells(xlCellTypeBlanks).EntireRow.Delete

下の行から順にループ(1行ずつ):

For i = ループする回数 to 1(もしくはゼロ)Step -1

2行おきの場合は-2

日常業務には【Go To Special】を使った処理

私の場合、空白行を削除したいと思うデータに遭遇する機会は結構ある。今回のようにデータの移動など不要の場合には、エクセルの標準機能で対応可能。所要時間は5〜10秒。マクロを作るより断然速い!(というか、上の方法は、この標準機能をマクロにさせている。)

GoToSpecial

空白行を一括削除する方法

  1. 空白を削除したい範囲を選択
  2. 【F5】(もしくは【Ctrl】+【G】)
  3. 【Alt】+【S】
  4. 【Alt】+【K】(了)

上記手順の2以降をマウスでの操作でするのはオススメしない。めちゃくちゃ奥に埋まっているから。 【Go To Special】は空白の選択以外にも便利なので、機能を調べておいて損はないと思う。私は、空白の選択のほか、可視セルのみ選択というのもよく使う。行列が非表示になっている表のコピペの際に便利(【F5】→【Alt】+【S】→【Alt】+【Y】→【Ctrl】+【C】(コピー)→【Ctrl】+【V】(ペースト))。

Advertisements