読者です 読者をやめる 読者になる 読者になる

アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

ExcelVBA入門 #8:ググらずマニュアル見ずスピード解決する方法

Excel VBA ExcelVBA入門シリーズ

はじめに

「こういうとき、どう書けばいいの?」となったとき。
ネットで調べれば大抵答えが出ます。
マニュアルや参考書を見てもよいでしょう。
しかし、ちょっとしたことでそれよりも早く解決できることもありますので、その事例と方法を紹介したいと思います。

事例その1

「列をコピーして隣の行に挿入したいが、どう書けばいい?」

こういうとき。
こういう、Excelでならやり方が分かるけど、VBAでどう表現すればよいのか分からないというとき。

実は、Excelでの操作をマクロとして記録してくれる機能があります。
ちょっと試してみましょう。

Excel側で、
 開発タブ>マクロの記録
をクリック。
出てきたウインドウは何も変更せずに「OK」で構いません。

A列を選択して、コピー(Ctrl+C)、B列を右クリックして、「コピーしたセルの挿入」。
(A列選択やB列選択は、1行目より上の、「A」「B」と書かれているマスですよ)

そして
 開発タブ>記録終了
をクリック。

VBA側を見てみると…
こんなコードが出来上がっているはずです。

Sub Macro1()
'
' Macro1 Macro
'

'
    Columns("A:A").Select
    Selection.Copy
    Columns("B:B").Select
    Selection.Insert Shift:=xlToRight
End Sub

簡単に補足すると、
「セル.Select」でセルを選択した状態(マウスでぽちっとセルをクリックした状態と同じ
)になり、
「Selection.操作」で選択した範囲に対する操作です。

つまり、「A列を選択、選択した範囲をコピー、B列を選択、選択したところに挿入(右側にずらす)」と、操作した通りのコードが書かれていることを察することができると思います。

これは本当に手で操作したままで、ちょっと無駄なコードなので、必要に応じて整理します。
こういうときはだいたい「セル.操作」の書き方にまとめることができるのです。

'※中身だけ抜粋
Columns("A:A").Copy
Columns("B:B").Insert Shift:=xlToRight

これで動くことを確認したら、本来書きたかったプログラムに(必要に応じてさらに書き変えつつ)埋め込めばOKです。

慣れないうちは「必要に応じて整理」「必要に応じて書き変え」が難しいかもしれませんが、書き変えてみて動かなかったり違う動きをしたら戻して…の繰り返しですね。
慣れるとネットで調べるより断然早いですし、思いもよらないところで理解が深まったりもします。

事例その2

「あるセルが何行目の何列目にあるかを取得したいが、どう書けばいい?」

こういうとき。
こういう、オブジェクトについての何かを取得したいんだけど…というとき。

これは、前回紹介したウォッチウインドウを使えばOKです。

例えば、セルA1に入っている値を取りたい時は「Range("A1").Value」なので、他の情報を取りたいときも「Range("A1").○○」という形式なのではないか? と推測できます。
なので、とりあえず「Range("A1")」をウォッチウインドウに入れてみます。

展開して見てみるとたくさんの値がありますが、A1セルなので行も列も1のはず。
値が1になっているものに絞って眺めてみると、「Column」「Row」ではないかと想像が付きます。
実際に「Range("A1").Column」「Range("A1").Row」で求めるものが取得できることを確認できればOK。

ただし、あくまで推測なので、どちらかというと「ド忘れしたとき」や「記憶があやふやなとき」向けという感じです。
全く知らずに試したときは、アタリを付けたモノで改めて検索して調べてみるのがよいかもしれません。
(そういう感じで、何で検索したらいいか分からないときにも使えるかも?)

次回予告

ExcelVBA入門 #8:パブリック?プライベート?プロシージャの使い方! - アナログCPU:5108843109
次回は複雑なプログラムを切り分けて分かりやすくする方法について。