HOME > 即効テクニック > Excel VBA > その他関連のテクニック > デバッグ入門−イミディエイトウィンドウその他

即効テクニック

その他関連のテクニック

デバッグ入門−イミディエイトウィンドウその他

(Excel 97/2000)
プログラムが一見すると正常に終了しているかのように見えて、実際には意図した処理結果が得られなかった場合などにイミディエイトウィンドウなどを用いてデバッグを行う手法をサンプルを用いて考察します。

===================================

例えば・・・

1.シート上のセルA1から連続するデータを利用
2.Range("A1")からCurrentRegionプロパティーを利用してデータ範囲を取得
3.一行目の項目行を除くためにOffsetプロパティーでデータ範囲を一行下へ
  ずらし、Resizeプロパティーで一行削るという方法をとる

という流れでプログラムを作成したところ、実行時エラーで期待通りに動かない
と仮定します。

===================================

(誤りを含んだサンプル)
Private Sub GetData()

Dim Rng As Range
Set Rng = Range("A1").CurrentRegion

Rng.Offset(1, 0).Resize(Rows.Count - 1).Select '●ここで中断

End Sub
===================================

●実行中にエラーが発生し、終了かデバッグかを選ぶ選択肢でデバッグを選ぶと
問題のコードが黄色く帯状に反転しています。サンプルの場合は・・・
Rng.Offset(1, 0).Resize(Rows.Count - 1).Select

に問題があるようです。この際にとりうる問題解決法としては

1.命令を細かく分けて実行してより細かく問題点を突き止める
2.部分的に検証する。

===================================

1.細かく分けて、というのは・・・

Rng.Offset(1,0).Select
Selection.Resize(・・・

などのようにプログラムを分けて実行する方法です。

2.部分的な検証には、ローカルウィンドウやイミディエイトウィンドウを使う、ウォッチ式を追加してプログラムを途中まで実行し、ウォッチ式の内容を確認する、などの方法があります。いずれにせよ、上記コードの場合には・・・

 1)変数Rngにはセル領域が正しく確保されているかどうか、
 2)Offsetの使い方は正しいか
 3)Resizeの使い方はどうか

が検証のポイントになります。↓へ

===================================
(イミディエイトウィンドウを利用したプログラムの検証)

1)はイミディエイトウィンドウで”?Rng.Addressと入力してEnterして返された値
(eg.”$A$1:$D$11”)が正しければOKです。

2)も同様に・・・
”?Rng.Offset(1, 0).Address”とすると・・・”$A$2:$D$12”というように変数Rngのアドレスから一行下がってますから意図した動きをしていることが分かります。

残るは・・・3)のResize以下ですが、イミディエイトウィンドウで確認してみると予想どおりエラーとなります。

Resizeの使い方を再確認すると・・・

⇒  Rangeオブジェクト.Resize(新しい範囲の行数, 新しい範囲の列数)
   ※列数は省略すると元の範囲と同じ列数になる

(コード)Rng.Offset(1, 0).Resize(Rows.Count - 1)

まず、Rows.Countを確かめるため、中断状態でマウスカーソルをRows.Countの上に
持っていくと小さなポップアップウィンドウで”Rows.Count=65536”と表示されて
います。つまり、ここでは新しい範囲の行数として対象範囲の行数から1を引いて
算出しようという意図であったにもかかわらず、Activesheet.Rows.Countと同じ
結果を招いたのでした。
※中断モードでイミディエイトから”?Rows.Count”としてもOKです。

そこで修正してみると・・・

(修正後のコード)
Rng.Offset(1, 0).Resize(Rng.Rows.Count - 1).Select
となります。