Excel串刺し計算

fourmで以前教えて頂いたexcel串刺し計算に関してです。
複数のファイルの読み込み各cellを足し算していくものです。
WFは、
1 計算対象となるexcelを指定フォルダに保存
2 assign :指定フォルダからファイルを読み込む
targetlFiles = IO.Directory.GetFiles(VpathName + VSubPath, “*.xlsx”)
targetlFilesの型はstring
3 for each でexcelファイルを1件ずつ読む
4 excel appliationで順番に読む
5 for eachでシートを読む for each sheetname in WB02.GetSheets()
6 この後の処理は
5列31行のデータ合計151回
read cell でシート名とcellを指定

null値の確認
if String.IsNullOrEmpty(vc03) or String.IsNullOrWhiteSpace(vc03)
else
assgin VC03_int = Decimal.Parse(VC03.ToString) + VC03_int
でnull値であれば計算しない

7 for each を抜けると5列31行のデータ合計151回
write cell でシート名、cell値と合計額をセットするようにしています。

動作は問題ないのですが、行列文同様のことをして非常にロジックとしては
メンテナンス性が悪いと考えています。
VBAの組み込みも考えましたがこれもメンテナンス性を考えると疑問でした。

行列に関して今後、可変することが考えられるので保守性がより簡易にできる方法を考えています。
またwfも重く、変数も多大になっています。
よりよい処理の方法あれば教えてください。excel串刺集計処理_v2.00.xaml (414.9 KB)

こんにちは。

やりたいことは同一書式のシートを複数含むファイルの、それぞれのセル番地での集計ということで理解しました。

ファイル名やシート名をリストにしてForEachで回すあたりの構造はそのままで大丈夫かと思います。
行数の指定と集計については、下記のようなやり方ではいかがでしょうか。

すべての書式が同じ前提ですが、
サンプルとして一つのExcelの一つのシートからテーブルを変数に格納したら、
Assignで 集計用テーブル変数 = サンプルテーブル変数.copy として集計用テーブルを宣言します。

集計用テーブル変数.columns.countで総列数を取得します。
そのままだと集計用テーブル変数には値が入ってしまっているので、値をかたっぱしから0に置き換えます。
ForEachRowの中にDoWhileを組み込みます。
DoWhileの中で、集計用テーブルと今読み込んでいるテーブルとを使って値を集計します。
列数のカウンター変数、行数のカウンター変数をそれぞれ用意してください。
DoWhileの条件は、 総列数 > 列数カウンター変数 です。
行数用、列数用それぞれのカウンター変数を使ってテーブルの値の書き換えをします。
行数と列数のカウンター変数はそれぞれ増加させるタイミングに気を付けてください。
行数のカウンター変数はForEachRowの1周あたり+1、
列数のカウンター変数はDoWhileの1周あたり+1です。

テーブル変数の値の書き換えはAssignで
テーブル変数(行カウンター)(列カウンター) = 0
としてやるとできるかと思います。

以上、集計用テーブルの値を0に置き換えるまでが下処理です。
あとは下処理のちょっとした改変でいけると思います。

ExcelファイルをReadRangeでテーブルに格納し、
ForEachRowのループの中で
DoWhileを使って行列それぞれのカウンター変数によって集計テーブルの現在値を取得し、
その現在値に今読み込んでいるテーブルの同位置の値を加算してやる
という仕組みですと実現できるかと思います。
テーブルの値の取得はテーブル変数(行数カウンター).item(列数カウンター)とすると読み込めます。
書き込みとは書き方がちょっと違うので注意してください。

データの列数を取得してループで回すことで、書式の改変にもある程度は対応できるかと思います。

本当はxamlファイルを添付したかったのですが、
新米にはファイルアップロードは許さんということで弾かれてしまいました。
ご了承ください。

1 Like

ありがとうございます。
集計用のexcelに加算して処理していくこと分かりました。
恐縮ですが2点お聞きしたいことがございます。

1:

Assignで 集計用テーブル変数 = サンプルテーブル変数.copy として集計用テーブルを宣言します。

最初に読み込んだexcelをコピーして集計用のdatatableを利用することになるのでしょうか。

2:
集計用テーブル変数.columns.countで総列数を取得します。
そのままだと集計用テーブル変数には値が入ってしまっているので、値をかたっぱしから0に置き換えます。

初期値を0にするということは、10行10列のシートであれば100回、0値に置換ということでしょうか。

申し訳ございませんが、教えて頂ければと思います。

>1:
全て同じ書式(行数、列数共に)の前提ですが、
集計対象のExcelファイルのシートの同じ番地それぞれを集計していくというのであれば
ご理解の通り一つをサンプルとしてコピーして、値だけ一旦ゼロにしてやったものを集計用のテーブルとしたら
比較的処理イメージにも沿っていて分かりやすいかなと考えました。

>2:
ご理解の通りですが、置換というより、既存の値を0で上書きしてやります。
ただし、懸念してらっしゃるように100回の消去操作全てをフローに記載する必要はありません。
ForEachRowとDowhileのループで処理できますので
私が組んでみたサンプルのレベルでは処理は1秒もかからない程度でした。

なんでだか昨日はできなかったファイルアップロードができるようですので
サンプルを添付します。
他にもっと賢い方法があるかもしれませんが、一例としてご参考までに。
エラーハンドリングなどは組み込んでいませんので必要に応じて設定してください。

Excel串刺し集計.xaml (37.5 KB)

1 Like