講師コラム

Excel VBA小技コラム – セルの連続移動

  • このエントリーをはてなブックマークに追加

表計算ソフトのExcelは非常に便利なソフトですね。数字の計算からグラフ・抽出まで簡単な操作で出来ます。こんな便利なソフトですが、複雑な計算をさせたり、多くの条件で分けて計算をする際には、さすがに標準の数式では限界があります。
その限界を突破するためにあるのが、VBA(Visual Basic for Application)です。平たく言ってしまうとExcelで行うプログラミングです。
そう言ってしまうと構えてしまう方も多いかもしれませんが、実際にやってみるとコツをつかめば心強い機能になります。

このコラムでは、よく使うコードを紹介していきたいと思います。

紹介するコードは下記環境で動作確認をしておりますので、あらかじめご了承ください。
OS:Windows7 および Windows10
Officeバージョン:MicrosoftOffice2013 および 2016

今回紹介するのは「セルの連続移動」です。
数字の取り込みや代入(書き出し)の際に、必ずと言っていいほど利用することになります。慣れている方はサラサラっと書かれるかと思いますが、特に始めたばかりの方は「なにをどうすればいいの?」となる方が多いのではないでしょうか。
私も始めたばかりの頃はその一人でした。
一回理解してしまえば様々なことに応用が利くコードですので、ぜひ覚えてみてください。

早速、コードを見てみましょう。

Sub sample()

‘①変数宣言
Dim i As Integer, ii As Integer
Dim row1 As Integer, col1 As Integer

‘②変数に初期値を代入
row1 = 1
col1 = 1

‘③縦に10個の移動
For i = 0 To 9
Cells(row1 + i, col1) = 1
Next i

‘④横に10個の移動
For i = 0 To 9
Cells(row1, col1 + i) = 1
Next i

‘⑤縦と横を行単位で移動(10×10)
For i = 0 To 9
For ii = 0 To 9
Cells(row1 + i, col1 + ii) = 1
Next ii
Next i

‘⑥縦と横を列単位で移動(10×10)
For i = 0 To 9
For ii = 0 To 9
Cells(row1 + ii, col1 + i) = 1
Next ii
Next i

End Sub

コードの解説 - セルの連続移動

いきなりズラリと書いてしまいましたが、一個ずつ見てみましょう。

‘①変数宣言
Dim i As Integer, ii As Integer
Dim row1 As Integer, col1 As Integer

ここは変数の宣言をしているのみですね。
「,(カンマ)」で区切ってあげれば、一行で複数の変数が宣言できます。
注意点として、データ型をしてする場合には、一つの変数単位毎に指定をして下さい。

‘②変数に初期値を代入
row1 = 1
col1 = 1

ここでは起点となるセルの位置を指定しています。row1は行、col1は列となりますので、A1を起点に動き始めることになります。
なので、実際に利用する場合には、そのセルに合わせてここを編集することになります。

‘③縦に10個の移動
For i = 0 To 9
Cells(row1 + i, col1) = 1
Next i

さぁ来ました。本題部分に突入です。
今回はFor Next構文を利用します。Do Loop構文でも代用できます。
ここの肝となるのが、変数の「i」です。For Next構文内で繰り返すことで、自動的に数字が変わっていきます。この性質を利用してセルを移動します。
具体的には、0Cellsプロパティに組み込むことで繰り返し移動ができるようになります。

Cells(row1 + i, col1) = 1

ここの行を指定するrow1にForのカウンタ変数であるiをプラスしています。
つまり、Forの繰り返し1回目は「1+0=1」、2回目は「1+1=2」といった具合に数字を動的に変化させることができます。あとは繰り返した回数分だけ移動することになります。
サンプルのコードではセルに値を代入(書き込み)しましたが、同じ要領で下記の様に読み込みもできます。

num = Cells(row1 + i, col1)
同じ方法で次の横移動も実現できます。
‘④横に10個の移動
For i = 0 To 9
Cells(row1, col1 + i) = 1
Next i

変わったのはiをプラスする場所だけです。列番号を指定するcol1にiを指定することで繰り返した回数分だけ横に移動することになります。

では複数行にまたがるセルの範囲を移動する場合にはどうでしょうか。

‘⑤縦と横を行単位で移動(10×10)
For i = 0 To 9 ’(行移動)
For ii = 0 To 9 ’(列移動)
Cells(row1 + i, col1 + ii) = 1
Next ii
Next i

ここの肝はForのネスト(入れ子)です。
1つ目の行移動をする為のForと2つ目の列移動をする為のForにそれぞれカウンタ用変数として「i」と「ii」の2つが設定されています。この2つの変数をそれぞれrow1とcol1に足してあげることで、繰り返すタイミングで1個ずつ移動する仕掛けとなっています。

よく混乱するポイントとして、どのように変数が変わっていくのかがわからなくなる方が多いようです。
それぞれ分けて考えてみてください。For Next構文は、中の処理を設定した回数だけ繰り返す関数です。

それぞれ言葉にすると
①1つ目のForは中にある2つ目のForを設定した回数分だけ実行
②2つ目のForは中にあるCellsプロパティを設定した回数分だけ実行
ということになります。

別の表現をすると
①1つ目のForを実行
②2つ目のForを実行
Cellsプロパティを実行(10回)
①に戻る(①を10回実行して終了)
となります。

実際にステップインを使用して、一行ずつ動きを見てみると、より分かりやすいと思いますので、試してみてください。

最後の列単位で移動するパターンを見てみましょう

‘⑥縦と横を列単位で移動(10×10)
For i = 0 To 9
For ii = 0 To 9
Cells(row1 + ii, col1 + i) = 1
Next ii
Next i

変わった個所は、iとiiを足す位置だけですね。位置を変えると動く方向が変わりますので、入れ替えるだけで縦移動と横移動が入れ替えられます。

初回から少し長くなりましたが、いかがでしたでしょうか。
次回以降もサンプルを交えながらコードを紹介していきたいと思います。

  • このエントリーをはてなブックマークに追加

話題をチェック!

2017年8月10日

ランサムウェアとは? 対策と感染時の対処方法

今年に入って急激にランサムウェア(Ransomware)が猛威を振るっています。ランサムウェアはこれまでの“コンピュータの情報をこっそり盗み出そうとするコンピュータウィルス”とは違い、コンピュータの情報を暗号化等すること …続きを読む