|
▼はる さん:
こんばんは
コードを拝見しました。
まず、コードの先頭のほうに記述されている、On Error Resume Next。
これは、記述してはいけません。
かなり、エキスパートの方の投稿で、このように記述しておられるのを見かけることがあります。
その人が言うには、「これはお約束です」。実際に、SIベンダーにいるプロのプログラマーにも
(古い人に多いのですが)顧客に納めるプログラムに、このような記述をしている人もいます。
昔々、「何らかの事情」で、こう欠かざるを得なかったようですが、今はそんなことはありません。
明確に、エラーが発生する可能性があることを認識した上で、そこを、あえて回避させる場合にのみ
記述すべきですし、その場合でも、用が終われば、すみやかにリセット(On Error GoTo 0)すべきです。
次に、変数は、コードの最中に記述してもいいのですが、可読性がそこなわれます。
プロシジャの先頭にまとめましょう。また、「すべてを」記述しましょう。
アップされた例では変数BBBの記述がありません。
モジュールの先頭に、Option Explict と記述しましょう。そうすると変数宣言が必須になり、
宣言がないとコンパイラーが教えてくれます。いちいち書くのは面倒でしょうから、VBE画面の
ツール->オプション の編集タブで、変数の宣言を必須にするにチェックしておきますと、自動的に
セットされます。
細かなことですが、 If ActiveCell.Value = Empty Then
数値の0もeMPTYとみなされます。認識した上でお使いなら、それでいいのですが。
空白かどうかということなら、If Len(ActiveCell.value) = 0 Then が安全ですね。
その、ActiveCell ですが、特定セルをSelect したうえで、ActiveCellとして処理するのは
実は、あまり感心しません。なぜかということを話し出すと、長くなりますので割愛しますが。
本件の場合は、処理するセルの場所を変化させていく、そのためにループの最後で
Offsetを使ってSelectしている、その工夫は、多としますが、ActiveCellを使わず、セルを特定する
別の方法がありますので、それを、早めに身につけられたらよろしいかと。
(ところで ActiveCell.Offset(-1, 1).Select これは 最初A2だったアクティブセルを、左下、左下と
動かしているんですが、その認識ですか?)
Set yyy = bbb.Address
yyy というオブジェクト変数に、格納するのは「オブジェクト」です。
BBB.Address は、BBBというオブジェクト(Range)のアドレスを表す文字列ですので、エラーになります。
yyy に bbb をいれるなら Set yyy = bbb です。
そのyyyですが、 Set r1 = Application.ActiveSheet.Range("yyy") このような記述があります。
まず、Application.は、通常つけませんん。まぁ、それはいいとして
この意味は、名前定義で "yyy" と名付けられたセル(またはセル領域)ということなんですよ。
本当は、オブジェクト変数 yyy を指定したかったのではありませんか?
であれば Set r1 = yyy です。
で、実は、アップされたコードの一番の問題点は「インデントがつけられていない」ということです。
すべてのコードが同じ桁から記述開始されていますね。これは、中で、どんな単位の処理がされているか、
パットみただけでは把握しにくい記述方式です。インデントについては、たとえば私がアップしたコードを
参照願います。
さて、私のコードにもコメントをつけましたが、行を削除したり、列を削除する場合の「鉄則」は
最後から逆に処理していくということです。
(「最終列から左に向かって処理、あるいは最終行から上に向かって)
以上のことを参考にして、そちらのコードをブラッシュアップしてみませんか。
|
|