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

わんくま同盟

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

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

ツリー一括表示

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
              └ Re[8]: vbからExcelの計算式が書かれた帳票を出力したい。 /魔界の仮面弁士 (24/04/19(Fri) 10:19) #103080
                └ Re[9]: vbからExcelの計算式が書かれた帳票を出力したい。 /ヒノザル (24/04/22(Mon) 14:32) #103085 解決済み


親記事 / ▼[ 103058 ]
■103056 / 親階層)  vbからExcelの計算式が書かれた帳票を出力したい。
□投稿者/ ヒノザル (1回)-(2024/04/11(Thu) 14:45:58)

分類:[VB.NET/VB2005 以降] 

2024/04/11(Thu) 15:31:28 編集(投稿者)
2024/04/11(Thu) 15:31:18 編集(投稿者)

vb.netはvisualstudio2015です。 使用しているDBはSQLserver Excelはxltxファイルからxlsxファイルを作成したいです。


流れとしては、vbからストアドをコールして、データを取得し、vbに返してvbがExcelテンプレートに書き出して
Excel帳票を作成する流れです。

今回の質問内容としては、タイトルにもある通りvbがExcelの書き出しを行う際に、Excelの計算式(=SUM(I9,I10,I11,I12,I13,I14,I15)や=SUM(I8:N8,P8:U8)など)
がセルに入力されたEXCEL帳票の作成の仕方がわからないというものです。

手法として考えたのが、@EXCELテンプレートに直接計算式を入力する方法 Avbで数値を出力する代わりにExcelの計算式を出力する方法
の二つです。

@の手法の問題点はExcel出力時に「オブジェクト参照がオブジェクトインスタンスに設定されていません。」というエラーメッセージが出ます。
テンプレートを「計算式記入前」→「計算式記入後」に変更して、vbは「何も手を加えず変更なし」の時と、
テンプレートを「計算式記入前」→「計算式記入後」・vbを「EXCELテンプレートに計算式を入れた箇所にデータを出力する部分をコメントアウトした」時の
2パターンともに発生していました。
テンプレートを「計算式記入前」・vbを「EXCELテンプレートに計算式を入れた箇所にデータを出力する部分をコメントアウトした」ものをそのまま使用した
時には、エラーメッセージが出ず、Excel帳票を出力させることができました。

Aの手法では、Excelの計算式で使用したいセルをPos(x,y)を使って座標で指定し、指定した座標を文字型で宣言した変数に代入して、
Excelに出力したい場所へデータを出力する部分をExcelの計算式を出力するように変更して実行しました。
結果としては、「型'BB.XlsxCell'のオブジェクトを型'System.String'にキャストできません。」
とエラーメッセージが出力されます。


以上の結果から質問としては、
@とAの手法でそれぞれのエラーを発生させないようにするにはどうすればよいのかと、
他の手法でvbからExcelの計算式が書かれた帳票を出力する方法が聞きたいです。

よろしくお願いいたします。
[ □ Tree ] 返信 編集キー/

▲[ 103056 ] / ▼[ 103059 ]
■103058 / 1階層)  Re[1]: vbからExcelの計算式が書かれた帳票を出力したい。
□投稿者/ 魔界の仮面弁士 (3759回)-(2024/04/11(Thu) 17:01:57)
No103056 (ヒノザル さん) に返信
> 使用しているDBはSQLserver Excelはxltxファイルからxlsxファイルを作成したいです。

xlsx ではなく、xml スプレッドシート形式を使えば、Microsoft Excel を呼び出すことなく、
XSLT 等を使ってワークブックを作れますね。まぁ、今更 XML 操作というのも使いにくそうですが。
https://atmarkit.itmedia.co.jp/fxml/tanpatsu/15mssql/mssql04.html
https://learn.microsoft.com/en-us/sql/relational-databases/sqlxml-annotated-xsd-schemas-xpath-queries/net-framework-classes/applying-an-xsl-transformation-sqlxml-managed-classes?view=sql-server-ver16


> 今回の質問内容としては、タイトルにもある通りvbがExcelの書き出しを行う際に、Excelの計算式(=SUM(I9,I10,I11,I12,I13,I14,I15)や=SUM(I8:N8,P8:U8)など)
> がセルに入力されたEXCEL帳票の作成の仕方がわからないというものです。

Excel を COM 参照してオートメーション操作しているのであれば、
Range オブジェクトの
 Formula プロパティ
 FormulaR1C1 プロパティ
で、セルの【数式】を読み書きできます。
前者は、A1 方式の 『=SUM(I8:N8,P8:U8)』
後者は、R1C1 方式の『=SUM(R[7]C[8]:R[7]C[13],R[7]C[15]:R[7]C[20])』です。

また、配列数式の場合は FormulaArray プロパティを使います。


計算によって算出されたセルの【値】は Value プロパティ や Value2 プロパティで読み書きします。

Value プロパティは 浮動小数点型(double) / 文字列型(string) / 通貨型 / 日付型を扱いますが
Value2 プロパティは、通貨型と日付型を扱わず、それらを double 型で返すという違いがあります。


そして 計算値の更新が「即時反映」なのか「手動反映」なのかは、
Application オブジェクトの Calculation プロパティで切り替わります。
手動計算時は、Calculate メソッドまたは CalculateFull メソッドを呼び出すことで再計算します。


計算式が複雑な場合や、計算するセルが多くて時間がかかる場合は、
 一時的に手動計算モードに変更
  ⇒ 各種セルを編集
   ⇒ 編集が終わったら一括再計算
    ⇒ 自動計算モードに戻しておく
とすることで、セル編集時のパフォーマンスが向上します。




> @の手法の問題点はExcel出力時に「オブジェクト参照がオブジェクトインスタンスに設定されていません。」というエラーメッセージが出ます。
それは実装が間違っているのだと思いますが、
実際のコードを見せてもらわないと、修正すべき場所を指摘できません。


> Aの手法では、Excelの計算式で使用したいセルをPos(x,y)を使って座標で指定し、
おぉぅ…?

> 結果としては、「型'BB.XlsxCell'のオブジェクトを型'System.String'にキャストできません。」
> とエラーメッセージが出力されます。
'System.String' 型というのは分かりますが、
'BB.XlsxCell' 型というのは何ですか? 自作ライブラリ?


座標指定という話もあったので、(Microsoft の) Excel への COM 参照を使っているのではないのかな…。
XlsxCell という名で検索してみると、MESCIUS 社の製品がヒットしたものの、なんか違うような。
[ 親 103056 / □ Tree ] 返信 編集キー/

▲[ 103058 ] / ▼[ 103066 ]
■103059 / 2階層)  Re[2]: vbからExcelの計算式が書かれた帳票を出力したい。
□投稿者/ 魔界の仮面弁士 (3760回)-(2024/04/11(Thu) 17:50:28)
No103058 (魔界の仮面弁士 さん) に返信
>>Aの手法では、Excelの計算式で使用したいセルをPos(x,y)を使って座標で指定し、
> おぉぅ…?

もしかして:
Pos って座標では無く、セルの指定ですかね?

Excel を COM オートメーション操作する場合、セル指定は
「Cells プロパティ」や「Range プロパティ」を使いますが、
ExcelCreator という製品の場合は
「Cell プロパティ」や「Pos プロパティ」を使うはずなので、
もしかしたらそっち?


ExcelCreator と仮定した場合、数式の指定は Func メソッドのはずです。
でも、ExcelCreator が 'BB.XlsxCell' 型という型を持っているかは把握していません。
(私は、ActiveX 版の ExcelCreator 3.6 しか使ったことが無い)

もしも ExcelCreator の使い方に関する話題だとしたら、
メーカーサポートに問い合わせるのも手かと思います。
https://www.adv.co.jp/contact/contact_userform.php
[ 親 103056 / □ Tree ] 返信 編集キー/

▲[ 103059 ] / ▼[ 103067 ]
■103066 / 3階層)  Re[3]: vbからExcelの計算式が書かれた帳票を出力したい。
□投稿者/ ヒノザル (3回)-(2024/04/17(Wed) 10:08:06)
2024/04/17(Wed) 15:52:17 編集(投稿者)

自己解決できました。

結果として、Aの修正方法を採用しました。

Posで座標情報をもとにExcelのセルの名称を取得することはメソッドがないので不可能です。
座標取得の際に使う変数の値をもとにセルの名称のアルファベット部分を指定する変数を宣言して
名称を指定し、Funcで計算式を設定する手法で実装できました。
列がその後の処理でColumnDeleteなどで削除されても、
計算式で参照したいセルがずれることはなかったです。
[ 親 103056 / □ Tree ] 返信 編集キー/

▲[ 103066 ] / ▼[ 103068 ]
■103067 / 4階層)  Re[4]: vbからExcelの計算式が書かれた帳票を出力したい。
□投稿者/ 魔界の仮面弁士 (3762回)-(2024/04/17(Wed) 12:34:10)
2024/04/17(Wed) 12:51:20 編集(投稿者)

No103066 (ヒノザル さん) に返信
> Posで座標情報をもとにExcelのセルの名称を取得することはメソッドがないので不可能です。

「セルの名称」という表現が、この場合、何を指すのかちょっと曖昧なので再確認…。
「セルの名前」(いわゆる定義名)のことでは無いのですね?


「セルの名前」と呼ばれるものは、Excel の [数式] タブの [定義された名前] のことを指すことが多いです。
Excel VBA でいうところの Name オブジェクトのこと。


一方、ここでいう「セルの名称」というのはもしかして、
A1 とか A1:C4 といった表記のことを言っておられたのでしょうか?


今回の質問が、仮に 『ExcelCreator』の話であったのならば、
A1参照形式には .Pos ではなく、.Cell プロパティを用います。
この .Cell プロパティには「セルの名前」を指定することもできます。


下記は ActiveX 版のコードですが、おそらくは
.NET 版でも同じような感じになると思います。


Xlsx1.Pos(0, 2).Str = "Visual Basic" '0番目の列(A列)、2番目の行(行3)に対するセル指定
Xlsx1.Pos(1, 2, 2, 5).Attr.Format = ";[赤]-0.0" '範囲指定

' A1:B2 セルを指定して値を設定
'Xlsx1.Pos(0, 0, 1, 1).Str = "abc" 'Pos プロパティを使った場合
'Xlsx1.Cell("A1:B2").Str = "abc" 'Cell プロパティを使った場合

Xlsx1.Cell("A1").Str = "C#" 'A1 形式文字列でのセル指定
Xlsx1.Cell("D10", -2, 5).Long = 1234 'オフセット指定でB10 セルを指定(D10 のセルから左に2、下に5の位置)

' セルの名前(定義名)を指定する方法
Xlsx1.Cell("CompanyName").Str = "わんくま同盟"

' セルの定義名ではなく、二重アスタリスクで始まる「変数名」を指定する方法
' ★これは ActiveX 版の話であり、.NET 版で使えるかは当方未確認です。
Xlsx1.Cell("**Variable1").Str = "わんくま同盟"
'
' 上記は、セルやテキストボックスに「**Variable1」という値が書かれている箇所に、文字列を設定します。
' 既定では、頭に半角アスタリスク「*」が2つついた文字列が変数名として認識されますが、
' KeyWordプロパティを使用すると、半角アスタリスク以外の半角文字に変更することもできます。
' (関連:VarInsertMode プロパティ)
解決済み
[ 親 103056 / □ Tree ] 返信 編集キー/

▲[ 103067 ] / ▼[ 103069 ]
■103068 / 5階層)  Re[5]: vbからExcelの計算式が書かれた帳票を出力したい。
□投稿者/ ヒノザル (4回)-(2024/04/17(Wed) 16:04:52)
2024/04/18(Thu) 17:58:07 編集(投稿者)

No103067 (魔界の仮面弁士 さん) に返信
>
> 一方、ここでいう「セルの名称」というのはもしかして、
> A1 とか A1:C4 といった表記のことを言っておられたのでしょうか?
→その通りです。記載漏れがありすみません。

現在はFuncメソッドで14行1列で1グループとして出力しています。
グループ内で一つでも0以外の値がストアドプロシージャで取得した値がvbからExcelに出力されると、
Excelの計算式がFuncで設定した計算式が出力されるのですが、すべて0だと計算式ではなく、0が出力されているのが現状です。

全て計算式を出力するようにvbでFuncで設定しているところは計算式を出力するようにしたいのですが、どこでコーディングのミスをしているかがわからず、
詰まっているのが現状です。


---vb.net サンプル
ExcelCreator.Pos(iCol, 7 + iRow * 14).Func("=SUM(" & Cel & 1 + 4 + iRow * 14 & ":" & Cel & 1 + 6 + iRow * 14 & ")", "")

[ 親 103056 / □ Tree ] 返信 編集キー/

▲[ 103068 ] / ▼[ 103077 ]
■103069 / 6階層)  Re[6]: vbからExcelの計算式が書かれた帳票を出力したい。
□投稿者/ 魔界の仮面弁士 (3763回)-(2024/04/17(Wed) 18:33:23)
No103068 (ヒノザル さん) に返信
> どこでコーディングのミスをしているかがわからず、
> 詰まっているのが現状です。
「解決済み」マークが外されたということは、追加の質問が生じたということですかね?



>>一方、ここでいう「セルの名称」というのはもしかして、

セル範囲に名前を付けるには、Excel ではこのようにします。
https://swri.jp/article/1180#nav1


>>A1 とか A1:C4 といった表記のことを言っておられたのでしょうか?
> →その通りです。記載漏れがありすみません。

その表記は、"A1 参照形式" と呼ばれています。
 A1 とか $A$1 とか A$1 とか $A1 とか A1:C4 などといったおなじみの表記法。
 列がアルファベット、行が数値で指定。
 $ 付きが絶対参照、$ 無しが相対参照。

対を成すのが、"R1C1 参照形式" です。
 こちらは RC とか R[-1]C[0] とか R2C3:R4C5 などといった表記です。
 行と列を数値で指定するモード。Rが行でCが列。
 [] 付きが絶対参照、[] 無しが相対参照。

今回の質問内容からは少し外れますが、Excel で複数範囲のセルに計算式を入れるような場合には、
R1C1 参照形式を使った方が、分かりやすいかもしません。

Excel で A1 参照と R1C1 参照を切り替える場合は、
[ファイル]-[オプション] 設定の [数式]-[数式の処理] です。
頻繁に切り替える場合は、RelaxTools アドインなどを併用すると便利かも。


> 現在はFuncメソッドで14行1列で1グループとして出力しています。
> ---vb.net サンプル
> .Pos(iCol, 7 + iRow * 14).Func("=SUM(" & Cel & 1 + 4 + iRow * 14 & ":" & Cel & 1 + 6 + iRow * 14 & ")", "")

グループという用語から、Excel の [データ]リボンにある [アウトライン]-[グループ化] の方を
想像してしまいましたが、それはさておき。


ここでいう「Func メソッド」というのは、ExcelCreator のメソッドのことだと思って良いのですよね?
何度か確認しているつもりなのですが、肯定も否定もしてもらえていないので、回答に困ります。


ひとまず ExcelCreator について知らない掲示板参加者向けに、
ExcelCreator の Func メソッドのサンプルを抜粋しておきます。

Xlsx1.Cell("A2").Long = 1000 'A2セルには1000が入る

' Func メソッドの第2引数(計算結果)は省略可能
Call Xlsx1.Cell("A4").Func("=A2+999") 'A4セルには=A2+999が入る
Call Xlsx1.Cell("C1").Func("=A2+999", "1999") 'C1セルには=A2+999と計算結果1999が入る
Call Xlsx1.Cell("C3").Func("=A2+777", "1777") 'C3セルには=A2+777と計算結果1777が入る

' 関数式を取得する機構は用意されていない(Excel VBA なら Formula や FormulaR1C1 で得られるのに!)
' 下記のプログラム例では、C1セルの関数結果のみ取得できる
nData = Xlsx1.Cell("C1").Long 'nLongには関数の結果値1999が入る
vData = Xlsx1.Cell("C1").Value 'vDataには関数の結果値1999が入る


上記は ActiveX 版の ExcelCreator を想定したコードです。
上記コメントの「関数式を取得できない」という制限が
.NET 版の ExcelCreator でも引き継がれているかは把握していません。

注意点として:
計算式や関数式を設定した後に、その式が参照する範囲の列や行の挿入、削除、クリアをした場合、
Excel の場合と違って、ExcelCreator では変更内容が答えに反映されないそうです。
(ActiveX 版のヘルプで Func メソッドの項を読むと、そのように書かれている)


> グループ内で一つでも0以外の値がストアドプロシージャで取得した値がvbからExcelに出力されると、

ストアドプロシージャと Excel の関係性が説明されていないので、なんのことだか分からないです。


> Excelの計算式がFuncで設定した計算式が出力されるのですが、すべて0だと計算式ではなく、0が出力されているのが現状です。

計算式が正しいかどうかは、確認済みなのですよね?


> .Pos(iCol, 7 + iRow * 14).Func("=SUM(" & Cel & 1 + 4 + iRow * 14 & ":" & Cel & 1 + 6 + iRow * 14 & ")", "")

iCol や iRow は Integer 、Cel というのは String 型と思えば良いのでしょうか。

そしてそれぞれの変数には、具体的にはどんな値が入るのでしょうか。
たとえば仮に
 Cel = "F"
 iCol = 0
 iRow = 3
だと仮定すると、上記は
 .Pos(0, 49).Func( "=SUM(F47:F49)", "" )
 'Excel VBA でいうところの「.Range("A50").Formula = "=SUM(F47:F49)"」に相当。
という処理になるわけですが、この認識であっていますか?


で……先ほどの「すべて0だと」や「一つでも0以外の値」というのは、
iCol や iRow の値のことを言っておられるのでしょうか。

「取得した値を VB から Excel に出力」ということは、
計算結果の話では無いのですよね?
[ 親 103056 / □ Tree ] 返信 編集キー/

▲[ 103069 ] / ▼[ 103080 ]
■103077 / 7階層)  Re[7]: vbからExcelの計算式が書かれた帳票を出力したい。
□投稿者/ ヒノザル (5回)-(2024/04/19(Fri) 09:34:31)
No103069 (魔界の仮面弁士 さん) に返信

>>どこでコーディングのミスをしているかがわからず、
>>詰まっているのが現状です。
> 「解決済み」マークが外されたということは、追加の質問が生じたということですかね?
→はい。内容としては、Funcで指定式ではなく0が出力されている件です。


> ここでいう「Func メソッド」というのは、ExcelCreator のメソッドのことだと思って良いのですよね?
> 何度か確認しているつもりなのですが、肯定も否定もしてもらえていないので、回答に困ります。
→その認識で合っています。私も返答しているつもりになっていました。すみません。


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


>>Excelの計算式がFuncで設定した計算式が出力されるのですが、すべて0だと計算式ではなく、0が出力されているのが現状です。
>
> 計算式が正しいかどうかは、確認済みなのですよね?
→はい。出力されている部分の計算式は正しく記載されていました。


> iCol や iRow は Integer 、Cel というのは String 型と思えば良いのでしょうか。
> そしてそれぞれの変数には、具体的にはどんな値が入るのでしょうか。
> たとえば仮に
>  Cel = "F"
>  iCol = 0
>  iRow = 3
> だと仮定すると、上記は
>  .Pos(0, 49).Func( "=SUM(F47:F49)", "" )
>  'Excel VBA でいうところの「.Range("A50").Formula = "=SUM(F47:F49)"」に相当。
> という処理になるわけですが、この認識であっていますか?
→上記の項目ですが、その認識で合っています。


> で……先ほどの「すべて0だと」や「一つでも0以外の値」というのは、
> iCol や iRow の値のことを言っておられるのでしょうか。
→上記の二つではないです。
 vbで一度数値を出力する部分に0を出力するコードがあるので、
 その際に出力された0になります。
 DBにデータがないため、vbでExcelへ出力するコードに遷移せず、
 値が上書きされなかったので、0のままになっており、
 計算式が出力されていないという状態になっています。

 DBにデータはないけどExcelに出力されているデータ
 (例:2023年9月のみの契約の為その月だけDBにデータがあるが、
  Excelの出力対象は年間となっているので、9月以外の他の月の部分)
 の場合どのようにしてExcelの計算式を出力させるかがわかりません。
[ 親 103056 / □ Tree ] 返信 編集キー/

▲[ 103077 ] / ▼[ 103085 ]
■103080 / 8階層)  Re[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
[ 親 103056 / □ Tree ] 返信 編集キー/

▲[ 103080 ] / 返信無し
■103085 / 9階層)  Re[9]: vbからExcelの計算式が書かれた帳票を出力したい。
□投稿者/ ヒノザル (7回)-(2024/04/22(Mon) 14:32:58)
No103080 (魔界の仮面弁士 さん) に返信
Excelの計算式を出力するvbのコードを通っていなかったのが原因でしたので、
Excelの計算式を出力するコード自体に問題はなかったです。

初期値として0を出力るコードがあったので、そちらをコメントアウトし、
If.Pos(X,Y).Value is Nothig
で空白のセルを取得し、取得したセルに0やExcelの計算式を出力することで、
解決できました。

お忙しいところ、ご協力ありがとうございました。
解決済み
[ 親 103056 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -