3

みなさん、こんにちは。よろしくお願いします。

複数のシートの合計を取るためだけのExcelシートがあります。最良かつ最も簡単に言えば、式はのようなもの=sum(Sheet1!A1,Sheet2!A1,Sheet3!A1,Sheet4!A1)です。ただし、問題を複雑にする問題がいくつかあります。まず第一に、私は合計するシートの数や順序を知りませんし、それらの名前も知りません。この数式は他の約150個のセルにコピーされるため、毎回約150個のセルにシートを物理的に追加するのではなく、合計を動的にする必要があります。(また、シートの構成と名前付けでは、数式を簡単にドラッグすることはできません。)

なので、まずはリファレンスを使って書けると思いましたindirect()。各セルに追加されるすべてのシート名を一覧表示する列を作成しました。残念ながら、concatenate()アレイでは使用できないため、以下に示すUDFを使用する必要がありました。

Function CONCAT(Delimiter As Variant, ParamArray CellRanges() As Variant) As String
Dim Cell As Range, Area As Variant
If IsMissing(Delimiter) Then Delimiter = ""
For Each Area In CellRanges
If TypeName(Area) = "Range" Then
For Each Cell In Area
If Len(Cell.Value) Then CONCAT = CONCAT & Delimiter & Cell.Value
Next
Else
CONCAT = CONCAT & Delimiter & Area
End If
Next
CONCAT = Mid(CONCAT, Len(Delimiter) + 1)
End Function

UDFを使用すると、などの適切な構文で大きな文字列を取得できます=CONCAT("'!A"&(B1+1)&",'",Array_of_Sheets)&"'!A"&(B1+1)。はCONCAT()、最初のパラメーターとしてセパレーターを取り、2番目のパラメーターとして配列を取ります。次に、文字列の最後に「区切り文字」を追加して、などの出力を行いますSheet1'!A1,'Sheet2'!A1=sum(indirect(STRING))この時点では、単純なもので十分だと思いましたが、コンマを処理できないように見える=sum(indirect("Sheet1!A1,Sheet2!A1,Sheet3!A1,Sheet4!A1"))ため、機能しません。indirect()

=CONCAT()そこで、これを解決するために、を=CONCAT("'!A"&(B1+1)&"+'",Array_of_Sheets)&"'!A"&(B1+1)出力に切り替えましたSheet1'!A1+'Sheet2'!A1。次に、別のUDFを作成して、以下に示すように評価を強制します。

Function EVAL(RefCell As String)
Application.Volatile
EVAL = Evaluate(RefCell)
End Function

これはうまくいきました!素晴らしいですよね?しかし、いくつかの使用とテストの後、それは完全に一貫していないようです。他のシートを開いている場合、常に評価されるとは限りません(他のシートも開いています)。volatileUDFでの使用に関して読んだ他のいくつかの矛盾がありますが、それらを見つけることができません。

ですから、私の理想としては、VBAをまったく使用せずにこれを実行したいのですが、それは不可能だと思います。ワークシートを手動で再計算することをユーザーに依存したくない(理由の一部volatile)。最後に、一貫した方法でそれを実行したいsum()ので、ユーザーがドキュメントを開いて印刷を押した場合、ユーザーは関数が正しく評価されていることを確認する必要はありません(#REFエラーを確認するか、値を手動で合計して確認してください)それらは正しいです)。eval()方程式を使用する代わりの方法を見つけたいと思っています。

以下の追加情報を編集してください

3D配列を使って実験しましたが、いくつか問題が発生しました。ワークブックに8枚のシートがあるとします。これらの8枚のシートのうち、この合計シートにフィードできるのは2枚だけです。setupシート、totalシート、シート、data entryシートがありdata analysisます。シートはtotalシートから合計されdata analysisます。通常、data entryシートはシートと一致しdata analysisます。したがって、ユーザーはdata entrydata analysisシートの両方のコピーを作成できます。シートの最も論理的な順序は、シートから始まり、次にシートとシートsetupの各ペア、そしてdata entrydata analysistotalシート。明らかに、このセットアップは3Dアレイでは機能しません。シートを並べ替えて、シートの順序が実際に重要であることをユーザーが認識していることを確認する必要があります(非定型の構成)。また、1枚または2data analysis枚のシートが含まれない場合もありますtotal。したがって、シート構成が。になる可能性がありsetup \ data entry (1) \ data entry (2) \ START \ data anaylsis (1) \ data analysis (2) \ END \ totals \ data entry (3) \ data entry (4) \ data anaylsis (3) \ data analysis (4)ます。私の感じでは、3Dアレイ構成では、追加がほとんど動的になりすぎると思いました。私はむしろ明示的なリストを持ち、適切な合計を得るためにシートを移動することに自信を持っているユーザーに依存したいと思います。

4

2 に答える 2

14

朗報です!3D数式を使用することで、生活をよりシンプルにすることができます。

次の数式を使用する=SUM(Sheet1:Sheet3!$A$1:$B$2)と、A1:B2のすべてのセルが合計されます-Sheet1からSheet3までのすべてのシートにわたって!

多くの場合、開いている/変化する数のワークシートを処理するには、2つの「ヘルパー」シートを使用すると便利です。

  1. STARTENDという2つのワークシートを挿入します
  2. 3D数式をこれら2つのシートにまたがる
  3. すべてのシートをそれらの間で移動するか、STARTシートとENDシートをそれらのシートの周りに移動します(もちろん、これはステップ1でも実行できます)
  4. 2つのヘルパーシートを非表示にする

詳細な手順については、このリンクを確認してください。

于 2013-02-05T21:49:15.387 に答える
2

別のアプローチは次のとおりです。

ユーザーのデータ入力シートが、厳密に遵守する必要のあるある種のシステム(たとえば、「データ入力1」、「データ入力2」など)に従ってラベル付けされていると仮定すると、INDIRECT-を使用して要約テーブルを作成できます。代わりに、このテーブルを合計してください。

詳細には、「合計」シートに次のようなヘルパーテーブルがあります。

   コルAコルBコルCコルD
1 C5 X7
2シート名はありますか?値1値2
3データ入力1TRUE10 20
4データ入力2FALSE0 0
5データ入力3TRUE20 30
6..。
。
。
。
20確かに、これまでにないほど多くのシート名があります。
  • セルC1と次の列に、合計するセルのアドレスを入力します。テンプレートがあり、参照を動的に保ちたい場合(通常、アドレスの静的な性質がここでのバグの原因です)、を使用=ADDRESS(ROW(Template!C5);COLUMN(Template!C5))して動的アドレスを取得します。
  • 列Bでは、次の式を使用します。=NOT(ISERROR(INDIRECT(ADDRESS(1,1,,,A3))))
  • 列Cおよび次の列では、これを使用します。=IF(B3,INDIRECT("'"&A3&"'!"&C$1),0)

これで、列Cなどを合計するだけで済みます。

于 2013-02-06T00:00:03.000 に答える