みなさん、こんにちは。よろしくお願いします。
複数のシートの合計を取るためだけの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
これはうまくいきました!素晴らしいですよね?しかし、いくつかの使用とテストの後、それは完全に一貫していないようです。他のシートを開いている場合、常に評価されるとは限りません(他のシートも開いています)。volatile
UDFでの使用に関して読んだ他のいくつかの矛盾がありますが、それらを見つけることができません。
ですから、私の理想としては、VBAをまったく使用せずにこれを実行したいのですが、それは不可能だと思います。ワークシートを手動で再計算することをユーザーに依存したくない(理由の一部volatile
)。最後に、一貫した方法でそれを実行したいsum()
ので、ユーザーがドキュメントを開いて印刷を押した場合、ユーザーは関数が正しく評価されていることを確認する必要はありません(#REFエラーを確認するか、値を手動で合計して確認してください)それらは正しいです)。eval()
方程式を使用する代わりの方法を見つけたいと思っています。
以下の追加情報を編集してください
3D配列を使って実験しましたが、いくつか問題が発生しました。ワークブックに8枚のシートがあるとします。これらの8枚のシートのうち、この合計シートにフィードできるのは2枚だけです。setup
シート、total
シート、シート、data entry
シートがありdata analysis
ます。シートはtotal
シートから合計されdata analysis
ます。通常、data entry
シートはシートと一致しdata analysis
ます。したがって、ユーザーはdata entry
とdata analysis
シートの両方のコピーを作成できます。シートの最も論理的な順序は、シートから始まり、次にシートとシートsetup
の各ペア、そしてdata entry
data analysis
total
シート。明らかに、このセットアップは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アレイ構成では、追加がほとんど動的になりすぎると思いました。私はむしろ明示的なリストを持ち、適切な合計を得るためにシートを移動することに自信を持っているユーザーに依存したいと思います。