質問者
ExcelのHasFormulaプロパティ

質問
-
HasFormulaプロパティの仕様に関しての疑問です。
セル範囲に1つだけ数式があり、かつ、その数式があるセルが左上以外で、かつ、セル範囲のAreasが一つだけの場合、HasFormulaプロパティがFalseを返します。
本来はNullが返るはずと思いますが、私の勘違いでしょうか?
(Excel2000/2007/2010/2013/2016プレビューにて確認しました。)
・再現手順
1.エクセルの新規ワークブックを作成
2.B2セルに「=1」と記述
3.マクロにて「Range("A1:B2").HasFormula」がFalseになる(異常?)
4.マクロにて「Range("A1:B2,A4").HasFormula」がNullになる(正常)
5.マクロにて「Range("B2:B3").HasFormula」がNullになる(正常)
すべての返信
-
ああすいません。
再度確認したところ、
3つ目のケースが「Null(正常)」ではなく、「True(異常)」
になってました。
新規作成状態のワークシートで、下記のように確認しました。
Sub test()
Range("B2").Formula = "=1"
With Range("A1:B2")
Debug.Print IIf(IsNull(.HasFormula), "null", .HasFormula) 'Falseになる(異常)
End With
With Range("A1:B2,A4")
Debug.Print IIf(IsNull(.HasFormula), "null", .HasFormula) 'nullになる(正常)
End With
With Range("B2:B3")
Debug.Print IIf(IsNull(.HasFormula), "null", .HasFormula) 'Trueになる(異常)
End With
End Sub -
私も試しましたがTak1waさんと同じでした。
https://msdn.microsoft.com/ja-jp/library/office/ff837123%28v=office.15%29.aspx?f=255&MSPPError=-2147217396
に
「True の場合、対象セル範囲内のすべてのセルに数式が入力されています。False の場合、対象セル範囲のどのセルにも数式が入力されていません。それ以外のときは、Null 値を返します。値の取得のみ可能です。バリアント型 (Variant) の値を使用します。」
とありました。 -
まとめる意味で、以下のようなテストを行なってみました。
(Excel2000,2007,2010(32bit),2013(32bit))
まともに動くのはケース4の場合のみでした。
どうやら、HasFomulaプロパティの戻り値は、信頼性に欠けるようです。
少し話しがそれますが、そもそもこの件に気が付いたきっかけは、9/8にリリースされたOffice更新プログラムによって、HasFormulaプロパティを含むマクロブックの挙動が不安定になる現象が発生したためでした。
(Excel2013でのみ発生しています。)
こういった情報は、どこに報告すればいいのでしょうか・・
Sub test()
Application.DisplayAlerts = False
'---以下、正解は Null Null Null のはずだが・・・
'ケース1:
'B2セルにのみ数式を代入した場合
With ThisWorkbook.Worksheets.Add
.Range("B2").Formula = "=1"
Debug.Print .Range("A1:B2").HasFormula, _
.Range("A1:B2,A4").HasFormula, _
.Range("B2:B3").HasFormula
.Delete
End With
'→False Null True
'ケース2:
'A1,B2セルに数式を入力した状態からA1セルの数式を削除し、
'B2セルにのみ数式がある状態にした場合
With ThisWorkbook.Worksheets.Add
.Range("A1").Formula = "=1"
.Range("A1").ClearContents
.Range("B2").Formula = "=1"
Debug.Print .Range("A1:B2").HasFormula, _
.Range("A1:B2,A4").HasFormula, _
.Range("B2:B3").HasFormula
.Delete
End With
'→Null Null True
'ケース3:
'B2,B3セルに数式を入力した状態からB3セルの数式を削除し、
'B2セルにのみ数式がある状態にした場合
With ThisWorkbook.Worksheets.Add
.Range("B3").Formula = "=1"
.Range("B3").ClearContents
.Range("B2").Formula = "=1"
Debug.Print .Range("A1:B2").HasFormula, _
.Range("A1:B2,A4").HasFormula, _
.Range("B2:B3").HasFormula
.Delete
End With
'→False Null Null
'ケース4:
'A1,B2,B3セルに数式を入力した状態からA1,B3セルの数式を削除し、
'B2セルにのみ数式がある状態にした場合
With ThisWorkbook.Worksheets.Add
.Range("A1").Formula = "=1"
.Range("A1").ClearContents
.Range("B3").Formula = "=1"
.Range("B3").ClearContents
.Range("B2").Formula = "=1"
Debug.Print .Range("A1:B2").HasFormula, _
.Range("A1:B2,A4").HasFormula, _
.Range("B2:B3").HasFormula
.Delete
End With
'→Null Null Null
End Sub- 編集済み minmin312 2015年9月25日 9:32