9

問題を次のテストケースに減らしました。

  1. 新しいワークブックを作成します。

  2. 定数値を入力します。たとえば、 ;に入力123します。Sheet1!A1

  3. foo式を参照する名前を定義します。たとえば、 =CHOOSE(!$A$1, Sheet1!$A$1);

  4. 定数値1Sheet2!A1;に入力します。

  5. =foo上の他のセルに数式を入力しますSheet2。たとえば、次のようになります。Sheet2!B1予想どおり、結果がSheet1!A1上記の手順2で入力した値であることに注意してください。

  6. 次のコードを含むVBAプロシージャを作成して実行します。

    Sheets("Sheet1").Outline.ShowLevels 1
    

手順5のセルに#VALUE!エラーが含まれていることがわかります。

さらに、単純なシートの再計算(F9キーまたはApplication.Calculateメソッドを使用するかどうか)では問題は解決されません。代わりに、VBAからの完全なApplication.CalculateFull再計算(メソッドを使用)またはインタラクティブUIからの完全な再構築CTRL( + ALT+を使用)を実行する必要があります。 SHIFT+F9キーの組み合わせ)。

試行錯誤の結果、この状態が発生することを確認しました。

  • index引数には、相対シートセル参照(定数または絶対シート参照ではない)が含まれてCHOOSE()いる必要があります。

  • インデックス付けされるCHOOSE()value引数には、別のシートへの参照が含まれている必要があります。

  • 表示されるアウトラインレベルの変更は、VBAプロシージャ内から発生する必要があります(インタラクティブUIまたはVBAイミディエイトウィンドウのアウトラインコントロールからではありません)。と

  • メソッド呼び出し(引数は無関係)は、ShowLevelsへの値(インデックスではない)引数のいずれかで参照されるシートに適用する必要がありますCHOOSE()

どうしたの?

CHOOSE()実際のワークブックを完全に再計算すること(まだ数秒)はUXの観点から望ましくないため、このエラーをトリガーせずに、値の引数の中で参照しているワークシートを最高のアウトラインレベルに折りたたむことを強く望んでいます。

回避策の提案(関数を含む定義済みの名前CHOOSE()と相対シートのインデックス引数を使用している場合)は大歓迎です。

私のプラットフォーム:Windows 7 Home Premium(SP1、64ビット)上のExcel 2010(14.0.6123.5001、32ビット)。

4

2 に答える 2

1

問題はあなたの名前の付いた式にあります:=CHOOSE(!$A$1, Sheet1!$A$1)具体的には!A1

先頭!が無効です(前のシート名がない場合、たとえばSheet1!$A$1 有効です)。シートを指定するだけで問題は解決します。

そもそもなぜ使ったのかによっては、満足できないかもしれません!A1シート上の=fooインデックス値を使用する場合は、数式の代わりに数式使用されますA1 =fooINDIRECT("A1")!A1


=CHOOSE(!$A$1, Sheet1!$A$1)ところで、数式が無効であり、常にエラーを返すはずであるという点で、バグ、または少なくとも未定義の動作を見つけた可能性があると思います#Value

于 2012-11-02T08:40:36.057 に答える
0

このUDFを含めると、正しい動作が得られますか?

Public Function fooUDF(inCell As Range)
    fooUDF = ThisWorkbook.Worksheets(inCell.Value).Range("A1").Value
End Function

定義された名前/式の代わりにUDFを使用すると、パフォーマンスに影響を与える可能性があります。また、元のアプローチでは採用されていないinパラメータを採用することも問題になる可能性があります。これは、マクロを実行して、次のようにシートごとにワークシートで定義された式を導入することで回避できます:(必要なすべてのシートをループする部分は含まれていません)

Public Sub InsertName()
    ThisWorkbook.Worksheets("Sheet2").Names.Add Name:="fooformula", _
        RefersToR1C1:="=fooudf(Sheet2!R1C1)"
End Sub
于 2012-11-02T09:25:03.810 に答える