さて、これが私が達成したいことです。この例では、4 つのデータ シートと合計シートで構成される 1 つのワークブックがあります。4 つのデータ シートのそれぞれには、同じパターンに従って類似した名前が付けられており、唯一の違いは日付です。(例: 9854978_1009_US.txt。1009 は変更日で、残りのファイル名は同じです)。これらのドキュメントのそれぞれで、列 F には合計を求めたい一連の数値が含まれていますが、実際に数値が含まれている F のセルの数はわかりません。(ただし、数字の下に追加情報が表示されることはないため、理論的には F 列全体を足し合わせることができます)。また、時間の経過とともに新しいファイルをワークブックに追加し、列 F からデータを収集するコードを書き直す必要はありません。基本的に、私が達成したいのは ' totals' ドキュメントを使用して、'9854978_????_US.txt' という名前のブック内のドキュメントからすべての列 F を取得します。疑問符はファイル名に基づいて変化します。純粋なExcelコードでこれを行うにはどうすればよいですか?
2 に答える
このような場合、VBA を使用することをお勧めしますが、Excel の数式のみを使用した (明らかに非効率的な) ソリューションを見つけました。
新しいシートのセル A1 に 1 を書き、次に下のセルに 2 を書きます。2 つのセルを選択し、下にドラッグします。オートコンプリート機能は、1 からドラッグの最後までの数値を生成します。9999になるまで続けて
セル B1 に数式を入力し=TEXT(A1,"000#")
ます。数式を下にドラッグして、0001から9999までのテキストを取得します。
セル C1 に数式を入力し="9854978_"&B1&"_US.txt"
ます。式を下にドラッグして、テキストを 9854978_0001_US.txt から 9854978_9999_US.txt に取得します
セル D1 に次の式を入力します
=if(ISERROR(SUM(INDIRECT(C1&"!F:F"))),0,SUM(INDIRECT(C1&"!F:F")))
。数式を下にドラッグして合計を取得します。
解決策は、可能な数のセットを減らすと、はるかに非効率になる可能性があります。年がない場合、可能な日付は 365 しかありません。
PS: ローカライズ版の Excel から数式を翻訳したため、数式が少し間違っている可能性があります。
この計算を行う関数は次のとおりです。
Function TotalColF() As Double
Dim wks As Worksheet
For Each wks In ThisWorkbook.Worksheets
If left(wks.name,7) = "9854978" then
TotalColF = TotalColF + Application.WorksheetFunction.Sum(wks.Range("F:F"))
End If
Next wks
End Function
これは揮発性関数ではないため、別のシートを追加するか、列 F の値を変更すると、Ctrl + Alt + F9 を実行して再計算を強制するまで、修正された合計は表示されません。
常に正しい合計を表示する揮発性関数が必要な場合は、お知らせください。揮発性関数は再計算時間を遅くすることがありますが、それは問題にならないかもしれません。
VBA 経由で新しいシートを追加する場合、再計算を強制するために使用できる VBA 命令があります: Application.CalculateFull