2009年08月12日
エクセルマクロ(VBA):マクロと関数
昨日の記事で、例えが悪かったのか
「SUM関数ですぐ計算できるよ」って
言われてしまいました。
たしかにその通りです。
でも私が言いたかったのは、計算そのものではなく
変数の指定についてちょっと書いてみたかったので
経験が少ないものですからこんな例えになってしまい
ました。あしからず。
そこで今日は、
「エクセル関数を使うと便利な時」
「マクロを使うと便利な時」について
書いてみたいと思います。
データの集計によっては、
エクセルの関数で簡単に出来るものを
わざわざマクロでつくる必要のないものがあります。
昨日のご指摘にあったように、
「SUM関数」で済むものをマクロで作っては
かえって効率が悪くなります。
例えば、次の表ですと
収入合計と支出合計と残高を表の中で関数を使い
自動計算させています。
この表は、合計を表示する欄が決まっているので
エクセル関数で作る方が便利な使い方だと思います。
次の場合はどうでしょう。
合計を最後のデータの下に表示したい。
データが増えたり減ったりしてその都度行数が
変わっていきます。
予め合計の関数を入れておいて、行挿入、行削除を
繰り返してもいいと思いますが何らかの操作が必要に
なります。
ボタン一つで合計が自動的に表示できる
そんな機能がほしくなりますよね。
そこがマクロの得意とするところです。
それでは作ってみましょう。
Sub Macro2()
Dim 最終行
Dim 合計行
最終行 = Range("h65536").End(xlUp).Row
If Range("h" & 最終行) = "合計" Then
Range("H" & 最終行 & ":k" & 最終行).Select
Selection.ClearContents
Selection.Interior.ColorIndex = 34
最終行 = Range("h65536").End(xlUp).Row
合計行 = 最終行 + 1
Else
合計行 = 最終行 + 1
End If
Range("H" & 合計行 & ":k" & 合計行).Select
Selection.Interior.ColorIndex = 38
Range("h" & 合計行) = "合計"
Range("i" & 合計行) = WorksheetFunction.Sum(Range("i4:i" & 最終行))
Range("j" & 合計行) = WorksheetFunction.Sum(Range("j4:j" & 最終行))
Range("k" & 合計行) = WorksheetFunction.Sum(Range("k3") + Range("i" & 合計行) - Range("j" & 合計行))
End Sub
合計を表示するプログラムです。
合計を表示した後、次に入力したい場合
合計をクリアしてあげます。
そのプログラムが
Sub Macro1()
Dim 最終行
Dim 合計行
最終行 = Range("h65536").End(xlUp).Row
合計行 = Range("h65536").End(xlUp).Row + 1
If Range("h" & 最終行) = "合計" Then
Range("H" & 最終行 & ":k" & 最終行).Select
Selection.ClearContents
Selection.Interior.ColorIndex = 34
合計行 = 最終行
End If
End Sub
です。合計クリアのボタンを押すと
空白になり入力が出来ます。
それでは動きをテストしてみましょう。
合計ボタンを押します。
合計が表示されました。
クリアボタンを押してみます。
合計行がクリアされました。
7番目のデータを消して合計が
正しく表示されるか見てみます。
合計ボタンを押します。
正しく表示されました。
次に、7番目から3件データを追加してみます。
合計ボタンを押します。
正しく表示されました。
これが、「ボタン一つで!」という
便利な所ですよね。
エクセル関数とマクロを使い分けて・・・と、言うか
良い所を組み合わせて作業の効率化をどんどん
図っていきましょう。
「SUM関数ですぐ計算できるよ」って
言われてしまいました。
たしかにその通りです。
でも私が言いたかったのは、計算そのものではなく
変数の指定についてちょっと書いてみたかったので
経験が少ないものですからこんな例えになってしまい
ました。あしからず。
そこで今日は、
「エクセル関数を使うと便利な時」
「マクロを使うと便利な時」について
書いてみたいと思います。
データの集計によっては、
エクセルの関数で簡単に出来るものを
わざわざマクロでつくる必要のないものがあります。
昨日のご指摘にあったように、
「SUM関数」で済むものをマクロで作っては
かえって効率が悪くなります。
例えば、次の表ですと
収入合計と支出合計と残高を表の中で関数を使い
自動計算させています。
この表は、合計を表示する欄が決まっているので
エクセル関数で作る方が便利な使い方だと思います。
次の場合はどうでしょう。
合計を最後のデータの下に表示したい。
データが増えたり減ったりしてその都度行数が
変わっていきます。
予め合計の関数を入れておいて、行挿入、行削除を
繰り返してもいいと思いますが何らかの操作が必要に
なります。
ボタン一つで合計が自動的に表示できる
そんな機能がほしくなりますよね。
そこがマクロの得意とするところです。
それでは作ってみましょう。
Sub Macro2()
Dim 最終行
Dim 合計行
最終行 = Range("h65536").End(xlUp).Row
If Range("h" & 最終行) = "合計" Then
Range("H" & 最終行 & ":k" & 最終行).Select
Selection.ClearContents
Selection.Interior.ColorIndex = 34
最終行 = Range("h65536").End(xlUp).Row
合計行 = 最終行 + 1
Else
合計行 = 最終行 + 1
End If
Range("H" & 合計行 & ":k" & 合計行).Select
Selection.Interior.ColorIndex = 38
Range("h" & 合計行) = "合計"
Range("i" & 合計行) = WorksheetFunction.Sum(Range("i4:i" & 最終行))
Range("j" & 合計行) = WorksheetFunction.Sum(Range("j4:j" & 最終行))
Range("k" & 合計行) = WorksheetFunction.Sum(Range("k3") + Range("i" & 合計行) - Range("j" & 合計行))
End Sub
合計を表示するプログラムです。
合計を表示した後、次に入力したい場合
合計をクリアしてあげます。
そのプログラムが
Sub Macro1()
Dim 最終行
Dim 合計行
最終行 = Range("h65536").End(xlUp).Row
合計行 = Range("h65536").End(xlUp).Row + 1
If Range("h" & 最終行) = "合計" Then
Range("H" & 最終行 & ":k" & 最終行).Select
Selection.ClearContents
Selection.Interior.ColorIndex = 34
合計行 = 最終行
End If
End Sub
です。合計クリアのボタンを押すと
空白になり入力が出来ます。
それでは動きをテストしてみましょう。
合計ボタンを押します。
合計が表示されました。
クリアボタンを押してみます。
合計行がクリアされました。
7番目のデータを消して合計が
正しく表示されるか見てみます。
合計ボタンを押します。
正しく表示されました。
次に、7番目から3件データを追加してみます。
合計ボタンを押します。
正しく表示されました。
これが、「ボタン一つで!」という
便利な所ですよね。
エクセル関数とマクロを使い分けて・・・と、言うか
良い所を組み合わせて作業の効率化をどんどん
図っていきましょう。
Posted by ミール at 16:08│Comments(0)
│VBA