|    | 
     ▼はる さん: 
 
こんばんは 
 
コードを拝見しました。 
 
まず、コードの先頭のほうに記述されている、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 です。 
 
で、実は、アップされたコードの一番の問題点は「インデントがつけられていない」ということです。 
すべてのコードが同じ桁から記述開始されていますね。これは、中で、どんな単位の処理がされているか、 
パットみただけでは把握しにくい記述方式です。インデントについては、たとえば私がアップしたコードを 
参照願います。 
 
さて、私のコードにもコメントをつけましたが、行を削除したり、列を削除する場合の「鉄則」は 
最後から逆に処理していくということです。 
(「最終列から左に向かって処理、あるいは最終行から上に向かって) 
 
以上のことを参考にして、そちらのコードをブラッシュアップしてみませんか。 
 
 | 
     
    
   |