Excel VBAで初心者が躓くポイント解説
てんこです。Excelで始めるプログラミング講座その②では、プログラミングで正規分布の成り立ちを解説しました。コード自体は簡単なのですが、複合的な知識が必要になるため、結構難易度高かったんじゃなかろうかと、反省しました。
と言うことで、今回は初心者がVBAを諦めてしまうポイントを紹介しようと思います。プログラム走らせていちいち止まってると、やる気が萎えますからね。
【名前に変数を使う】
➡ボタンポチっとで全て終わらせるためには、データ参照先のエクセルのファイル名を変数を使って指定する必要があります。例えば参照先のファイル名が「4月実績.xlsx」で、マクロを保存しているファイル名が「4月マクロ.xlsm」だったら、以下のような感じです。
dim tuki as string '文字列はstirng
dim name as string
tuki = thisworkbook.name '4月マクロ.xlsmの名前をtukiに代入
tuki = left(tuki, 2) '「4月」取り出す。
tuki = Replace(tuki, "月", "") '1月から9月の場合に数字だけ除外する
name = tuki & "月実績.xlsx"
&の両サイドには半角スペースが必要なので注意。
【エクセル関数を使う時の色々注意】
➡VBAではエクセル関数が使えますが、エクセル上で使用する時と勝手が違います。
①殆どの関数は、頭に「worksheetfunction.」を付ける必要がある。
②例えばvlookupで、参照データが見つからずエラーしたら止まる。iserror使っても無理。
③範囲指定する関数の場合、範囲はrangeで指定する必要がある。
rangeの範囲を変数で変えたいときは、以下の感じにすると良いです。
dim i as long '整数はlong
dim goukei as double '小数を含む場合はdouble
i = 1
goukei = sum(range(cells(i, 1), cells(i+3, 4))) 'A1からD4を足して、goukeiに代入
【vlookupをVBAで使うコツ】
➡エラーを回避する技もありますが、エラーした時に何か処理したい事もあると思います。そんな場合、私は以下のようにして、セルに直接数式を打ち込みます。
dim name as string
name = "名前"
cells(1, 1) = "=if(iserror(vlookup(""" & name & """ , B1:C10, 2, false)) = true, ""x"", ""o "")"
if cells(1, 1) = "o " then
Msgbox "名前ある"
else
Msgbox "名前ない"
endif
上記のように書くと、セルB1からB10に「名前」と入力されているセルがある場合には「名前ある」というメッセージボックスが表示されます。
ここでのポイントは、VBAでは""で囲った間は文字列として認識されますが、セルに直接数式を入力するとき等で数式中に"を使いたい場合、"を文字として認識させる場合には""のように連続させる事です。
【rangeを使うときの注意】
➡例えば、デスクトップにあるエクセルファイル「練習.xlsx」を開いて、一番左のシートのA1からA10の値を持ってきたい時は以下のように書きます。
dim wb as workbook
workbooks.open ("C:¥user¥Desktop¥練習.xlsx")
Set wb = Activeworkbook '開いたワークブックはアクティブになるので、ワークブック名をwbとして保存しておく。
Thisworkbook.Activate '元のエクセルをアクティブにする。
Range("A1:A10").value = wb.Sheets (1).Range("A1:A10").value
ここで大事なのは、別のエクセル同士でやり取りする場合にはワークブックとシートの指定をする必要があります。マクロを起動しているワークブックは「Thisworkbook」でOKです。また、rangeの後に.valueを入れておかないと、値が上手く入りません。
【終わりに】
どうでしょうか。VBA初心者が躓いて嫌になるポイントは大体網羅していると思います。ありがちなのは名前ですね。一文字でも違ったらエラーですから。皆さんも、上記がスラスラ出来るようになったら、エクセルの単純作業はほぼ無くせますので、精進してください。後の細かい点は思い付いたらまた記事にします。それではまた。