13

編集: わかりやすくするためにタイトルを変更しました。

簡単な要約:ワークブック スコープのワークシート依存の名前付き数式 (以下で説明します) の動作が Excel の文書化された機能であるかどうかを知りたいです。もしそうなら、どこかのドキュメントの方向性を教えてください - 私はこれについてオンラインで何も見つけられないようです (おそらく私は悪い検索用語を使用しています..?) そして実際に何かを使用したくありません.バグであり、後のバージョンで消える可能性があります!

厳密に言えば、これは実際には VBA に関する問題ではありません。ただし、名前付きの数式は、私や他の人が VBA コードで常に使用するものであるため、私が考える主題にはまだ適用できます。

編集: 以下の VBA コードは正確に正しくない可能性があることに注意してください。テストしていません。

通常の方法

工学/科学計算では、同じ名前の数式/範囲を同じワークブックで複数回使用する必要がありましたが、ワークシートは異なります。簡単な例として、円の領域に次のようなものを実装します。

Dim sht as Worksheet
For Each sht In ThisWorkbook
    Call sht.Names.Add(Name:="AreaCircle",RefersTo:="=PI()*'" & _
            sht.Name & "'!Radius^2")
Next sht

次の名前付き範囲/数式のセットが得られます (各ワークシートにスコープが設定されています)。

=PI()*Sheet1!Radius^2        <--- scoped to Sheet1
=PI()*Sheet2!Radius^2        <--- scoped to Sheet2
etc. etc.

これはもちろん問題なく機能しますが、将来の変更が難しいという大きな欠点があります。したがって、たとえば、数式が変更された場合 (もちろん、円の面積は変更されません! しかし、AASHTO LRFD 高速道路設計コードの数式は、たとえば、ほぼすべてのエディションを変更します!)、すべてのインスタンスを編集する必要があります。すべての名前式の。これは、VBA プロシージャを作成しても面倒です。

代替方法

先日、Excel 2013 で偶然に以下を発見しましたが、オンラインのどこにもそれについて何も見つけることができませんでした。これは私がそれを使い始めるのをためらわせます。

代わりに、次の 1 行のコードを実行するとします。

Call ThisWorkbook.Names.Add(Name:="AreaCircle",RefersTo:="=PI()*!Radius^2")

これにより、次の単一の名前付き範囲/式が生成されます (ワークブックにスコープが設定されています)。

=PI()*!Radius^2<--- 数式は Workbook にスコープされます。注!Radius、ありませんRadius

これは次のものと同じではないことに注意してください (感嘆符はありません)。

=PI()*Radius^2<--- ここでRadiusは、スコープが Workbook であることに注意してください。

これで、AreaCircle上記の最初のメソッドとまったく同じ動作が生成されます。ローカルのワークシートで定義された Radius の値に基づいて結果が生成されます。したがって、名前付き範囲が 2 つある場合Radius(1 つは 用Sheet1、もう 1 つは 用Sheet2) は、それが使用されているシートAreaCircleの の値に応じて計算されます。Radiusさらに、新しいワークシートを追加するたびに、この (および他のすべての) 数式の新しいバージョンを追加する必要がなくなるという追加の利点もあります (これは非常に大きいです!)。

これは説明が難しい動作です。私の説明に混乱している場合は、次の手順を実行してこの動作を再現できます。

  1. ワークブックで複数のワークシートを作成し、 のセルに「1」、シート 2 のセルA1Sheet1「2」、シートA13 のセルに「3」A1などを入力します。
  2. 名前付き範囲CellA1(Workbook スコープを使用) を作成し、式に次のように入力します。=!$A$1
  3. =CellA1任意のセルに入力すると、 では「1」 Sheet1、 では「2」Sheet2などになります。

ドキュメンテーション?

やあ、あなたはそれを作りました - ここで私に固執してくれてありがとう!

それで、私が上で言ったように、誰かがこの「機能」のドキュメントを教えてもらえますか? もっと複雑なプロジェクトでこれを実装したいと思っています。他に何もないとしても、Name Manager のナビゲートが約 20 倍簡単になります (すべての重複した名前はありません)。

4

2 に答える 2

5

ドキュメントについては、名前およびその他のワークシートの数式の評価を参照してください。

  • =A1現在のシートのセル A1 を参照します
  • =!A1アクティブシートのセル A1 を参照します

ワークシート参照と併せて

  • 現在とは、Excel が再計算しているものを指します...
  • アクティブとは、ユーザーが見ているものを指します...

これは、チャールズ・ウィリアムズが実証したことです。ユースケースに関しては、VBAなどのユーザー定義関数をお勧めします。

于 2014-05-26T22:53:21.697 に答える
3

Names で !References を使用する場合は注意が必要です:
= で始まる refer-to を含む名前 計算が VBA から呼び出されると、誤った結果が返される場合があります。それらは、それらが使用されているシートではなく、常にアクティブなワークシートを参照するかのように計算されます: Sheet1 の

セル A1 に 1 を入力します a
) =CellA1Sheet1 の A2 に入力します。CellA1 は次のように定義されています=!$A$1
b) 手動計算に切り替えます
c ) Sheet2 をアクティブ化
d) この VBA コードを実行

Sub Testing()
Worksheets("Sheet1").Range("a1") = 8
Application.Calculate
End Sub

e) Sheet1 に戻ると、Sheet1!A2 に Sheet2!A1 にあったものが含まれていることがわかります。

indirect() を使用すると、この問題を回避できます
。Name Manager アドインは、この種の構文の使用を検出して警告します。

于 2014-04-07T22:32:13.203 に答える