|
おはようございます。
>Σをマクロで実施しようとするとこんなにも
>難しいコードになるのですね。
いえ、そうではありません。
tantanさんが記述された仕様だけを満足させれば良いのであれば・・、
Sub Macro1()
Dim i As Long, j As Long, k As Long
Dim target As Range
With ActiveCell
If .Row > 1 Then
k = .Column
i = .Row - 1
If Range(Cells(1, k), Cells(i, k)).Count > 1 Then
Set target = Range(Cells(1, k), Cells(i, k)).Find("=", Cells(1, k), xlFormulas, xlPart, , xlPrevious)
If target Is Nothing Then
Set target = Cells(1, k)
ElseIf target.Address <> Cells(i, k).Address Then
Set target = target.Offset(1, 0)
End If
Else
Set target = Cells(1, k)
End If
.Formula = "=sum(" & Range(target, Cells(i, k)).Address & ")"
End If
End With
End Sub
上記のコードでも同じように作動すると思いますよ!!
つまり、get_findcellというコードはなくても動作はします。
では何故わざわざ長いコードを??? ですよね!!
理由1 汎用サブルーチンの品質向上のため
get_findcellと言うコードは、かなり以前に作成したプロシジャーです。
tantanさんが記述された仕様のために作成したコードではありません。
もっともMacro1の方も直前の投稿コードを1/3ぐらい引用させてもらいましたので
私がtantanさんの仕様のために新たに書いたコードはMacro1の2/3ぐらいなんです。
get_findcellは、
Findメソッド関連の処理を私自身が使いやすいインターフェースにしたものです。
RangeオブジェクトのFindメソッドを使うと、
指定セル範囲内の特定の文字列があるセルを複数取得することができますが、
そのアルゴリズムを毎回記述するのが面倒で、この処理を汎用的 且つ、簡単な
インターフェースで行いたかったのです。
HelpにFindメソッドを使って複数のセルを取得するコード例がありますから
調べてみてください。
このget_findcellを作成後は、Findメソッド関連の処理には、このFunctionを使うようにしています。
今回のようにもっと簡単に記述できる仕様でも・・・です。
だって、色んな事象に使えば、get_findcellのテストをより多く行えるので
それによって完成度が増すでしょう?
言ってみれば、汎用Functionのデバッグをしてもらうためです。
理由2 拡張性の考慮
私は、プログラミングするときには、拡張性ということにかなり重点をおいて
プログラム構造を考えているつもりなんです。
つまり、将来こんな仕様の変更にも対応できるように とか、
今はないけど、将来こんな機能追加も考えられるなあ なんて、考えた時に
それを視野に入れたプログラム構造を考えると言うことです。
今回の仕様って、
言わば、Sum関数からSum関数の間の小計をとる仕様ですよね?
本来のExcelの仕様では、
小計を算出したら、中計、大計も算出できるようになっています。
これも実現できるようになんて、機能追加が発生した場合は、
関数が入っている複数のセルを取得可能にしなければならないなあ・・
と考えました。
その時のためにたいしたコード量でもないのでget_findcellで処理しておけば、
変更が楽かなあ と考えたためです。
シンプルなコードが駄目とは思いませんが、
シンプル IS Best だとは、私は思っていないんです。
|
|