3日がかりのその仕事、3分で終わらせる方法教えます!
パソコンスキルの心技体

エクセルVBA・マクロを習得すると、関数を使わなくなる?

2011年8月10日
  • このエントリーをはてなブックマークに追加
  • follow us in feedly

エクセルマクロ・VBA達人養成塾 小川です。
http://www.exvba.com/vb/index.php

今日は、よくあるご質問への簡単な答えを。

「マクロの中ではあまり関数を使わない」と言いますが、どういうことでしょうか?

ということで、お答え。

簡単に言うと、セルに関数を埋め込むマクロを作るより、マクロ内で計算し、その結果をセルに書き込むほうが楽で簡単だからです。

セルに手入力で関数を書き込むことと比べても、そのあとのメンテナンス性等を考慮すると、マクロで書いたほうがよいですね。

一例を挙げてみる。

セルB2~B11に、以下のように、氏名の情報が入っているとします。

B2 | 米子 美和
B3 | 津 篤史
B4 | 五日市 加奈子
B5 | 静岡 威宏
B6 | 呉 早希
B7 | 高知 昌浩
B8 | 兵庫 早希
B9 | 神戸 智宏
B10 | 高岡 範夫
B11 | 北海 尚広

そして、C列、D列に、苗字と名前を記入するとする。
上記の例では、苗字と名前の間には、半角スペースが入っているとしよう。

そうすると、関数で処理をすると、こんな感じ。

セルC2に入れる関数式: =LEFT(B2,FIND(” “,B2))
セルD2に入れる関数式: =MID(B2,FIND(” “,B2)+1,100)

上記の式をコピーすることになる。

VBAで同様の処理をしようとするなら、こんな感じ↓

Sub step1()
Dim basho As Long
Dim myonam As String
Dim cnt As Long
For cnt = 2 To 11
myonam = Range(“B” & cnt).Value
basho = InStr(myonam, ” “)
Range(“C” & cnt).Value = Left(myonam, basho – 1)
Range(“D” & cnt).Value = Mid(myonam, basho + 1)
Next
End Sub

これだけだと、手間としては、関数のほうが少ない。

しかし、こんなキレイなデータばかりの世の中ではない。

例えば、こんな感じ。以下の例では、B列の値の前後に余計なスペースが入っている。

B2 |      米子 美和
B3 | 津 篤史
B4 | 五日市 加奈子
B5 |   静岡 威宏
B6 | 呉 早希
B7 | 高知 昌浩
B8 |    兵庫 早希
B9 |   神戸 智宏
B10 |  高岡 範夫
B11 |  北海 尚広

すると、関数だと、さっき作った関数を加工して…。

セルC2に入れる関数式: =LEFT(TRIM(B2),FIND(” “,TRIM(B2)))
セルD2に入れる関数式: =MID(TRIM(B2),FIND(” “,TRIM(B2))+1,100)

ややこしく、なってきた。

VBAで同様の追加実装をしようとするなら、こんな感じ↓

Sub step2()
Dim basho As Long
Dim myonam As String
Dim cnt As Long
For cnt = 2 To 11
myonam = Trim(Range(“B” & cnt).Value) ‘←ココが変わっただけ
basho = InStr(myonam, ” “)
Range(“C” & cnt).Value = Left(myonam, basho – 1)
Range(“D” & cnt).Value = Mid(myonam, basho + 1)
Next
End Sub

メンテナンス性が高い。

さらに、氏名の間にある区切り文字が、半角スペースとは限らない。
例えば、「半角スペース」、「全角スペース」、「/」のいずれかの可能性があるとしよう。

B2 | 米子 美和
B3 | 津/篤史
B4 | 五日市 加奈子
B5 | 静岡 威宏
B6 | 呉 早希
B7 | 高知 昌浩
B8 | 兵庫 早希
B9 | 神戸/智宏
B10 | 高岡 範夫
B11 | 北海 尚広

そうすると、関数だと、さっき作った関数を加工して…。

セルC2に入れる関数式: =LEFT(SUBSTITUTE(SUBSTITUTE(TRIM(B2),”/”,” “),” ”,” “),FIND(” “,SUBSTITUTE(SUBSTITUTE(TRIM(B2),”/”,” “),” ”,” “)))
セルD2に入れる関数式: =MID(SUBSTITUTE(SUBSTITUTE(TRIM(B2),”/”,” “),” ”,” “),FIND(” “,SUBSTITUTE(SUBSTITUTE(TRIM(B2),”/”,” “),” ”,” “))+1,100)

こんなの、さくさく作れる人に出会ってみたい。
僕でも苦労する。

他人に引き渡したら、その他人はもう二度とこのエクセルファイルをメンテナンスしようとはしないだろう。

ところが、VBAで同様の追加実装をしようとするなら、こんな感じ↓。

Sub step3()
Dim basho As Long
Dim myonam As String
Dim cnt As Long
For cnt = 2 To 11
myonam = Trim(Range(“B” & cnt).Value)
myonam = Replace(myonam, “/”, ” “) ‘2行追加
myonam = Replace(myonam, “ ”, ” “) ‘2行追加
basho = InStr(myonam, ” “)
Range(“C” & cnt).Value = Left(myonam, basho – 1)
Range(“D” & cnt).Value = Mid(myonam, basho + 1)
Next
End Sub

メンテナンス性も高い。
例えば、このあと、上司から「関数の仕様を変更してくれ」等々言われたときのことを考えて欲しい。

VBAを使えない「関数職人」みたいな人は、セルに横書きされた複雑な文字列を目をこらして読み解きにかかるか、上司に文句を言うか、同僚に文句を言うかだろう。

だが、VBAなら、コードが縦書きされているので、どこをどうなおせばよいか分かりやすい。

本当に「エクセルが得意」と言いたければ、VBAの知識はやはり必須だろう。

ちなみに、上記のstep3くらいのマクロを自在に書けるようになるくらいは、達人養成塾の「エクセルマクロ・VBA速習コース」受講後の当然到達しているスキルレベル ヾ(´ー`)ノ

キーワード

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

最新の記事

人気記事

最新記事

カテゴリ

最新コメント

タグクラウド