C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■103080 / 8階層)  vbからExcelの計算式が書かれた帳票を出力したい。
□投稿者/ 魔界の仮面弁士 (3767回)-(2024/04/19(Fri) 10:19:13)
2024/04/19(Fri) 11:47:54 編集(投稿者)

No103077 (ヒノザル さん) に返信
> →はい。内容としては、Funcで指定式ではなく0が出力されている件です。

.Func(数式) あるいは .Func(数式, "") を呼び出したときに、
セルに数式ではなく、固定値 0 が出力される、ということでしょうか。

それとも、数式はセットされているが、計算結果が 0 になるということでしょうか。
あるいは、Excel で見ると正しい値になるのに、ExcelCreator で得た値が 0 になるという意味でしょうか。


>>> グループ内で一つでも0以外の値がストアドプロシージャで取得した値がvbからExcelに出力されると、
>>ストアドプロシージャと Excel の関係性が説明されていないので、なんのことだか分からないです。
> →処理の流れとしては、
>  vbからストアドをコール→ストアドでDBからデータを取得
>  →ストアドで取得したデータをvbに返す→vbでExcelの出力
>  というものです。大雑把なものになってしまいますが、ご了承ください。

まず、VB にとってみれば、「取得元」となるデータが
 データベースから得た値であろうと
 テキストファイルから読み取った値であろうと
 画面が手入力されてきた値であろうと
VB 側で受け取った時点では、単なる String や Integer や Double や Deciaml や Date に過ぎないわけで、
取得元によって ExcelCreator の処理が変わるとは思えません。

まぁ、データの入手経路が変わることで、データ型が異なっているとか、
非同期処理の処理タイミングに依存した話が生じることはありますが、
今回はそういう話では無いのですよね。

ですから、先の投稿の
>>> グループ内で一つでも0以外の値がストアドプロシージャで取得した値がvbからExcelに出力されると、
にある「ストアドプロシージャで取得した」という情報には、あまり意味が無いと思っています。

重要なのは、「0以外の値」が VB に渡されて Excel に出力された場合の流れです。

その値がどういうデータ型であるのか、それをどのように Excel に引き渡していているのか、
結果はどのように確認しているのか、といった具体的な話が無ければ、
実際の画面を見ていない第三者には状況が分かりません。


データ取得部とか細かい点は取っ払って構いませんので、新規プロジェクトに貼って試せるような、
第三者が検証可能な形に単純化したソースコードを提示できませんか?


> →はい。出力されている部分の計算式は正しく記載されていました。
ということは、Excel のセルには、固定値では無く計算式が出力されているのですね。

Excel のセルには、計算式とは別に計算結果というものが内部的に保持されています。
Excel は通常、この計算結果を必要に応じて再計算して、自動的に最新値に自動更新してくれますが、
再計算されるまでの間は、計算式をもつセルの値は、古い値が保持されたままになります。
https://www.pc-koubou.jp/magazine/65472

Microsoft Excel では [F9] キーを押すと再計算できます。

そして自動的に再計算されるかどうかを、Excel の [ファイル]-[オプション] メニューから
[数式] タブにある 計算方法の設定:ブックの計算で、自動/手動を切り替えられます。

大抵の場合は自動で運用しているかと思いますが、計算モードの手動/自動は、
前回開いたワークブックの設定が引き継がれるため、意図せず手動になっていないかも確認してみましょう。
https://www.helpforest.com/excel/1_book/ex010043.htm

なお、「=NOW()」などと書かれた セルの場合、自動計算モードであって毎秒更新されるわけではないので、
手動計算モードではない場合も、[F9] キーなどで再計算させることはあったりします。


> 値が上書きされなかったので、0のままになっており、
プログラムから意図的に上書きした場合は、期待する値になるということでしょうか。

ExcelCreator の場合、Func メソッドの第二引数にて
そのセルの「計算結果」を明示指定できるようになっていたはずです。

ただ、具体的な計算結果値を渡さずに
・第二引数を省略した場合
・第二引数に Nothing を渡した場合
・第二引数に "" を渡した場合
・第二引数に 0 を渡した場合
でどうなるのかは、.NET 版を使ったことが無いので分かりません。


>  (例:2023年9月のみの契約の為その月だけDBにデータがあるが、
>   Excelの出力対象は年間となっているので、9月以外の他の月の部分)
>  の場合どのようにしてExcelの計算式を出力させるかがわかりません。
そう言われましても、掲示板を見ている第三者にとっては、
そちらのワークブックがどういうシート構造なのか知らないので、
どのように操作すれば良いのか、具体的な答えは出せません。


とはいえ、.Pos や .Cell で各セルの内容は調べられるので、泥臭い方法でも構わないのであれば、
ループ処理で「9月以外の他の月の部分」にアクセスして上書きする、ということはできそうです。
それが望ましい方法かどうかは別にして。


これが Excel VBA の場合は、先の No103058 にて書いた通り、
明示的に再計算するためのメソッドもあるので話が早いですが….NET 版の ExcelCreator に、
ブック全体を強制的に再計算させる機能があるかは分かりません。

ExcelCreator 自体の機能については、アドバンスソフトウェア社様のサポートにお尋ねください。
ゴールデンウィーク前なので、聞くなら早めの方が良いかと。
https://www.adv.co.jp/contact/contact.htm


なお、セルの数式の解析は、それぞれのライブラリが行うものです。

本家の Excel であっても、古いバージョンで読み込めば、最近搭載された新しいワークシート関数を
処理できないこともありますし、それ以外のライブラリ(たとえば ClosedXml) であっても、
うまく再計算できないパターンがあり得ます。ExcelCreator の場合も、計算式の内容によっては
対応できない可能性があるかもしれませんね。
https://qiita.com/m-isik/items/95b778c3131cd467978b
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[7]: vbからExcelの計算式が書かれた帳票を出力したい。 /ヒノザル →Re[9]: vbからExcelの計算式が書かれた帳票を出力したい。 /ヒノザル
 
上記関連ツリー

vbからExcelの計算式が書かれた帳票を出力したい。 / ヒノザル (24/04/11(Thu) 14:45) #103056
Re[1]: vbからExcelの計算式が書かれた帳票を出力したい。 / 魔界の仮面弁士 (24/04/11(Thu) 17:01) #103058
  └ Re[2]: vbからExcelの計算式が書かれた帳票を出力したい。 / 魔界の仮面弁士 (24/04/11(Thu) 17:50) #103059
    └ Re[3]: vbからExcelの計算式が書かれた帳票を出力したい。 / ヒノザル (24/04/17(Wed) 10:08) #103066
      └ Re[4]: vbからExcelの計算式が書かれた帳票を出力したい。 / 魔界の仮面弁士 (24/04/17(Wed) 12:34) #103067 解決済み
        └ Re[5]: vbからExcelの計算式が書かれた帳票を出力したい。 / ヒノザル (24/04/17(Wed) 16:04) #103068
          └ Re[6]: vbからExcelの計算式が書かれた帳票を出力したい。 / 魔界の仮面弁士 (24/04/17(Wed) 18:33) #103069
            └ Re[7]: vbからExcelの計算式が書かれた帳票を出力したい。 / ヒノザル (24/04/19(Fri) 09:34) #103077
              └ vbからExcelの計算式が書かれた帳票を出力したい。 / 魔界の仮面弁士 (24/04/19(Fri) 10:19) #103080 ←Now
                └ Re[9]: vbからExcelの計算式が書かれた帳票を出力したい。 / ヒノザル (24/04/22(Mon) 14:32) #103085 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信