2008.07.10 Thursday
Excelのバグ
たまにはExcelネタを。それもVBAのバグネタです。
つい先日、私自身がこれにハマりました。 まず「前提」の1つめ。 Excel VBAではプロパティを省略することが許されています。 プロパティを省略すると、そのオブジェクトの"既定のプロパティ"が指定されたものとします。 たとえばセルに値を代入するとき、セルの値はValueプロパティですから、本来なら次のように書くのがセオリーです。 Range("A1").Value = "tanaka" これを、プロパティを省略して、次のように書いてもOKです。 Range("A1") = "tanaka" 次に「前提」の2つめ。 VBAの変数にはバリアント型という型があります。 バリアント型にセル(Rangeオブジェクト)を格納すると、変数を介してセルを操作できます。 次のコードで確認してみましょう。 Sub Sample1() Dim c Set c = Range("A1") c.Font.ColorIndex = 3 End Sub 以上の「前提」から、次のコードは何も問題がないように思えます。 選択したセル範囲(Selection)の各セルに対して、セルの値(数値とします)を10倍します。 Sub Sample2() Dim c For Each c In Selection c = c * 10 Next c End Sub ところがコレ、まったく機能しませんし、エラーも発生しません。 いったい、どうしたことでしょう。 あれこれと試した結果、回避策はわかったのですが、そもそも原因は何なのでしょう。 調べてみたら、Excelのバグでした。 詳しくは、次のサポート情報(機械翻訳)に書かれています。 ■XL98: Value プロパティがバリアント種類の For Each ループに unchange しました。 http://support.microsoft.com/kb/191176/ja Excel 97とExcel 2007で確認しましたが、確かにおかしいです。 回避策は次の2点です。 ・セルを格納する変数は、バリアント型ではなくObject型やRange型を使う Sub Sample3() Dim c As Range For Each c In Selection c = c * 10 Next c End Sub ・代入される側のプロパティを省略しない Sub Sample4() Dim c For Each c In Selection c.Value = c * 10 Next c End Sub どうせプロパティを省略しないのなら「c.Value = c.Value * 10」と書くべきでしょうけど。 また、Microsoftのサポート情報では「For Eachループ内で発生する」ように書かれていますが、次のようなコードでも同じバグが発生します。 Sub sample5() Dim c Set c = ActiveCell c = c * 10 End Sub これは、遭遇する機会の多いバグだと思います。十分に注意してくださいな。 |












