技術とか戦略とか

SIerで証券レガシーシステムを8年いじってからSESに転職した普通の文系SEによる技術ブログ。

Excel・VBA:表のデータの部分のみ選択する

このように、項目名とデータに分かれている表が存在している場合に

f:id:akira2kun:20200621200103j:plain

データの部分だけ選択するマクロの紹介です。

f:id:akira2kun:20200621200113j:plain

データの部分だけ消したいような場合に使えます。
 
マクロの記述は以下の通りです。
記述内容は7行のみですが、内容を理解すれば類似処理(最終行にデータを追加する、特定のデータの個数を数える、等)にも活かせます。
 
【記述内容】
Sub ボタン1_Click()
 Worksheets("Sheet1").Range("A2").Select
 Dim i As Integer
 Do While IsEmpty(ActiveCell.Value) = False
  i = i + 1
  ActiveCell.Offset(1, 0).Select
 Loop
 Range("A2:B" & Format(i + 1)).Select
End Sub
 
【解説】
・データの部分の一番左上を選択
 Worksheets("Sheet1").Range("A2").Select
 
・データの部分が何行あるのかをカウント
 Dim i As Integer
 Do While IsEmpty(ActiveCell.Value) = False
  i = i + 1
  ActiveCell.Offset(1, 0).Select
 Loop
 
 「Dim i As Integer」でInteger型(数値型)の変数iを宣言します。
 Integer型は宣言した時点で0に初期化されるため、
 明示的に初期値を入れる必要はありません。
 
 その後の4行はループ処理です。
 現在選択されているセルは「ActiveCell」、その値は「Value」で取れます。
 「IsEmpty()」は引数のセルが空か否かを返す関数であり、
 この関数の引数に「ActiveCell.Value」を与えることで、
 現在選択されているセルが空ならTrue、空でなければFalseを返すようになります。
 この関数の結果を用いて「Do While」~「Loop」文でループを回しています。
 ループ内で「ActiveCell.Offset(1, 0).Activate」を記述することで、
 「現在選択されているセル(ActiveCell)の1行下(Offset(1, 0))に
  選択セルを移す(Select)」
 ということができるようになり、
 「A2が空でないか→A3が空でないか→A4が空でないか…」
 というループを回すことが可能になります。
 この際、変数iをカウントアップしていくことで、
 何行存在するのかをカウント可能になります。
 
・データを範囲選択
 Range("A2:B" & Format(i + 1)).Select
 
 Range関数の引数の部分を変数iを用いて可変としています。
 &演算子とFormat関数を用いることで、
 このように文字列結合することができます。