none
ExcelのHasFormulaプロパティ RRS feed

  • 質問

  • 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になる(正常)
    2015年9月20日 14:33

すべての返信

  • こんにちは。

    とりあえず確認結果を。
    Excel2013 32bitでためしてみました。

    • Range("A1:B2").HasFormula → NULL
    • Range("A1:B2,A4").HasFormula → NULL
    • Range("B2:B3").HasFormula → True

    質問者さんとはずいぶん結果が異なりましたが…。
    再現手順はあってますでしょうか。

    2015年9月24日 10:22
    モデレータ
  • ああすいません。

    再度確認したところ、

    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

    2015年9月24日 20:07
  • 私も試しましたがTak1waさんと同じでした。

    https://msdn.microsoft.com/ja-jp/library/office/ff837123%28v=office.15%29.aspx?f=255&MSPPError=-2147217396

    「True の場合、対象セル範囲内のすべてのセルに数式が入力されています。False の場合、対象セル範囲のどのセルにも数式が入力されていません。それ以外のときは、Null 値を返します。値の取得のみ可能です。バリアント型 (Variant) の値を使用します。」
    とありました。

    2015年9月25日 0:12
  • 回答ではありませんが私も確認してみました。

    Excel2010, Excel2013(共に32bit)両方で下記の結果となりました。
    ※B2セルにシート上で=1をセットの上で検証
    ・Range("A1:B2").HasFormula      → False
    ・Range("A1:B2,A4").HasFormula → Null
    ・Range("B2:B3").HasFormula      → True

    ・・・御二方両方とも違う結果に

    2015年9月25日 0:17
  • 今朝再確認してみると、今度は質問者さんと同じ動きになりました。(昨日私が確認した手順にて)
    昨日確認後にWindowsUpdateなどをした記憶もないですが…。

    何か条件があるのかもしれませんので気づいた点があれば報告します。

    2015年9月25日 0:25
    モデレータ
  • 昨日私は最初手順を誤ってA1セルに数式を入れていました。

    で、それを思い出して再度検証させてみたのですが、
    A1セル、B2セル共に数式を入力した状態からA1セルのみ数式を削除すると
    昨日確認した結果と同様になりました。(以下の手順)

    1. B2セルのみ数式入力 → False(おかしい)
    2. A1セルにも数式入力 → Null
    3. A1セルの数式のみ削除 → True

    なんか動きが怪しい気がします。

    2015年9月25日 0:47
    モデレータ
  • もう一度試してみました

    Sub test()
    Dim x, y, z
        x = Range("A1:B2").HasFormula
        y = Range("A1:B2,A4").HasFormula
        z = Range("B2:B3").HasFormula
        Debug.Print x, y, z
    End Sub

    今度は

    Null Null Null

    となりました。

    2015年9月25日 0:49
  • まとめる意味で、以下のようなテストを行なってみました。

    (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
    2015年9月25日 9:31