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

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

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

ClosedXMLでマクロ付きExcelを操作する方法

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■94113 / inTopicNo.1)  ClosedXMLでマクロ付きExcelを操作する方法
  
□投稿者/ ゆ (1回)-(2020/03/16(Mon) 15:47:37)

分類:[C#] 

2020/03/18(Wed) 08:47:00 編集(投稿者)
2020/03/18(Wed) 08:16:02 編集(投稿者)
2020/03/16(Mon) 15:48:55 編集(投稿者)

知識、技術不足なため、ご助力いただきたく
何卒よろしくお願いいたします。

C#でExcelファイルに書き込みたいのですが
COMだと非常に処理時間がかかったため、ClosedXMLを使用しました。

出力対象のExcelはテンプレートが決まっており
マクロ(ボタンを押すと処理が走る)が実装されているものです。

ClosedXMLだと出力後にボタンがただのオブジェクトとなり
ボタンが押せなくなってしまいました。

どうにかマクロを実装させる方法はありませんでしょうか。

皆様のお力をお貸しいただければ幸いです。
よろしくお願い致します。

<追記>
いくつか異なる事象が発生していますので、詳細に記載します。
何分初心者なもので、説明が拙いこと、ご容赦くださいませ。

csvのデータを読込、Excelファイルにプロットする
c#のアプリケーションを作成しています。

Excelファイルのテンプレートは3種類あり
どちらもボタンにマクロが実装されています。
マクロの処理内容は同様で、3種類のテンプレートの違いはレイアウトの違いのみです。
(3種類といっても、テンプレートは別の方が作成しているため、どんどん最新版が送られてきているだけなのですが・・)

◇開発及びテスト環境
Visual Studio2012
Excel2010

c#アプリケーションより、テンプレートへのデータ出力を行い、
その後、Excelファイルを開くとマクロ実装済みボタンの上にボタンオブジェクトが生成。
1つ目のテンプレートは、再度実行すると、オブジェクトが増加。
2つ目のテンプレートは、再度実行すると、増加はしていないが、1つだけオブジェクトが生成。
3つ目のテンプレートは完全にボタンの押下が不可状態。

尚、別の環境(Excel2012)でアプリケーションの実行をしたところ
1つ目のテンプレートはオブジェクトの生成はされず、
2つ目のテンプレートでは実行毎にオブジェクトが生成されます。

単純にExcelのバージョンが違うことが原因であれば、テンプレートごとに挙動が異なることが不思議に感じています。
マクロはボタンを押下しないと動かないので、VBEのコード側でオブジェクトの生成をしてしまっていることも
考えにくいかと思っています。

長くなりましたが、何か解決の糸口となれば幸いでございます。
私も色々な事象が発生しているため、混乱している状態です。。
よろしくお願いいたします。
引用返信 編集キー/
■94114 / inTopicNo.2)  Re[1]: ClosedXMLでマクロ付きExcelを操作する方法
□投稿者/ Hongliang (972回)-(2020/03/16(Mon) 15:56:10)
2020/03/16(Mon) 16:19:47 編集(投稿者)

そんな方法はありません。
データ書き出しはClosedXMLでやって、マクロの実行だけExcelのCOM呼び出しするとかどうでしょうか。
データ書き出しとマクロ実行が交互に何度もやる必要があるとかだと無理ですが。

<追記>
あ、ごめんなさい、読み間違えていたようです。
この回答は無視してください。
引用返信 編集キー/
■94115 / inTopicNo.3)  Re[2]: ClosedXMLでマクロ付きExcelを操作する方法
□投稿者/ うんりぺ (1回)-(2020/03/16(Mon) 16:15:55)
消える理由は分かりませんが、仕様なら
ワークシートのオープン時にマクロを紐付けたらどうでしょう?

Private Sub Workbook_Open()
ActiveSheet.Shapes.Range(Array("ボタン 1")).Select
Selection.OnAction = "Macro1"
End Sub

別物ですが、NPOIというもので同じようにマクロが消えるという事例があるようです。
http://ryoben.hateblo.jp/entry/2018/04/28/103805
引用返信 編集キー/
■94116 / inTopicNo.4)  Re[2]: ClosedXMLでマクロ付きExcelを操作する方法
□投稿者/ ゆ (2回)-(2020/03/16(Mon) 19:15:27)
No94114 (Hongliang さん) に返信
> 2020/03/16(Mon) 16:19:47 編集(投稿者)
>
> そんな方法はありません。
> データ書き出しはClosedXMLでやって、マクロの実行だけExcelのCOM呼び出しするとかどうでしょうか。
> データ書き出しとマクロ実行が交互に何度もやる必要があるとかだと無理ですが。
>
> <追記>
> あ、ごめんなさい、読み間違えていたようです。
> この回答は無視してください。

私の伝え方が拙いもので、申し訳ない限りです。
ご回答のためにお時間をいただけたこと、感謝いたします。
引用返信 編集キー/
■94117 / inTopicNo.5)  Re[1]: ClosedXMLでマクロ付きExcelを操作する方法
□投稿者/ 魔界の仮面弁士 (2613回)-(2020/03/17(Tue) 12:25:58)
No94113 (ゆ さん) に返信
> ClosedXMLだと出力後にボタンがただのオブジェクトとなり
> ボタンが押せなくなってしまいました。

不具合の可能性がありますね。(あるいは制限事項なのかもしれませんが)
ところで ClosedXML のバージョンは幾つですか?

#1203 [bug][Closed] Saving WorkBook with button and macro unlinks macro from button
https://github.com/ClosedXML/ClosedXML/issues/1203


引用返信 編集キー/
■94118 / inTopicNo.6)  Re[3]: ClosedXMLでマクロ付きExcelを操作する方法
□投稿者/ ゆ (3回)-(2020/03/17(Tue) 14:41:31)
No94115 (うんりぺ さん) に返信
> 消える理由は分かりませんが、仕様なら
> ワークシートのオープン時にマクロを紐付けたらどうでしょう?
>
> Private Sub Workbook_Open()
> ActiveSheet.Shapes.Range(Array("ボタン 1")).Select
> Selection.OnAction = "Macro1"
> End Sub
>
> 別物ですが、NPOIというもので同じようにマクロが消えるという事例があるようです。
> http://ryoben.hateblo.jp/entry/2018/04/28/103805


どうしてもマクロが解除されるようならご教授いただいた方法を
実装させていただきます。
ですが、やはり今後テンプレートが改修されることも考慮し
できればマクロとC#のアプリケーションは別物としたいのです。
何かいい方法はないでしょうか。。

ご回答下さり感謝申し上げます。
引用返信 編集キー/
■94119 / inTopicNo.7)  Re[4]: ClosedXMLでマクロ付きExcelを操作する方法
□投稿者/ KOZ (91回)-(2020/03/17(Tue) 16:58:40)
No94118 (ゆ さん) に返信

OpenXML を使ってみては?
少々面倒ですが、Excel のフル機能にアクセスできるはずです。

「Open XML SDK 2.5 for Office へようこそ」
https://docs.microsoft.com/ja-jp/office/open-xml/open-xml-sdk

「SpreadsheetML ドキュメントを操作する」
https://docs.microsoft.com/ja-jp/office/open-xml/working-with-spreadsheetml-documents

「[方法] スプレッドシート ドキュメント内のセルにテキストを挿入する (Open XML SDK)」
https://docs.microsoft.com/ja-jp/office/open-xml/how-to-insert-text-into-a-cell-in-a-spreadsheet

引用返信 編集キー/
■94126 / inTopicNo.8)  Re[1]: ClosedXMLでマクロ付きExcelを操作する方法
□投稿者/ shu (1221回)-(2020/03/18(Wed) 06:53:50)
No94113 (ゆ さん) に返信
> 2020/03/16(Mon) 15:48:55 編集(投稿者)
>
> 知識、技術不足なため、ご助力いただきたく
> 何卒よろしくお願いいたします。
>
> C#でExcelファイルに書き込みたいのですが
> COMだと非常に処理時間がかかったため、ClosedXMLを使用しました。
>
テンプレートがあって各セルに値をいれていくだけなら
range.valueで範囲内の配列を取得して
取得した配列に値を設定し
range.valueに戻す
とすればよい気がしますが、どうでしょう?

https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.value
引用返信 編集キー/
■94127 / inTopicNo.9)  Re[2]: ClosedXMLでマクロ付きExcelを操作する方法
□投稿者/ ゆ (4回)-(2020/03/18(Wed) 07:54:19)
No94117 (魔界の仮面弁士 さん) に返信
> ■No94113 (ゆ さん) に返信
>>ClosedXMLだと出力後にボタンがただのオブジェクトとなり
>>ボタンが押せなくなってしまいました。
>
> 不具合の可能性がありますね。(あるいは制限事項なのかもしれませんが)
> ところで ClosedXML のバージョンは幾つですか?
>
> #1203 [bug][Closed] Saving WorkBook with button and macro unlinks macro from button
> https://github.com/ClosedXML/ClosedXML/issues/1203
>
>
バージョンは0.94.2です。
お教え下さったissueの内容と同様のバージョンなのですが、少し事象が異なりました。

私の確認不足だったのですが、
マクロが実装されたボタンの上にボタンのオブジェクトが追加されていくような動きでした。
質問内容にも追記し、修正させていただきます。申し訳ありません。
引用返信 編集キー/
■94129 / inTopicNo.10)  Re[3]: ClosedXMLでマクロ付きExcelを操作する方法
□投稿者/ 魔界の仮面弁士 (2617回)-(2020/03/18(Wed) 10:11:30)
No94127 (ゆ さん) に返信
> マクロが実装されたボタンの上にボタンのオブジェクトが追加されていくような動きでした。

なるほど。 #1203 でサンプルとして提供されている
"Button working.xlsm" → "Button not working.xlsm" を見ても、
btRowfilter という名の OLEControlObject なシェイプに重なって、
btRowfilter という同名の Picture なシェイプが配置されてしまっていますね。
同様に、Comment オブジェクトの Name も変化しているという問題もあるようです。

この点は、プルリク #1227 によって develop ブランチにマージ済みのようです。
https://github.com/ClosedXML/ClosedXML/pull/1227


No94113 の障害解消に至るかは分かりませんが、駄目元で
ver0.94.2 [Latest release] を
ver0.95.0-beta1 [Pre-release] あるいは
ver0.95.0-beta2 に置き換えてみて、
結果が変わるかどうか試してみては如何でしょうか。


そして、ClosedXML 側の処理に不具合がありそうならば、
xlsm から機微情報を除去した上で、「現象を再現可能な最低限のサンプル」と共に
本家に Issue を投稿しておくことをお奨めします。


バージョン変更でも回避できない(あるいは、バージョンを変更できない事情がある)場合は、残念ながら
(1) ClosedXML を使うのを諦め、他の方法を検討する(OpenXML あるいは Excel オートメーションなど)
(2) ClosedXML の公開ソースをみて自分で修正する
(3) 誰かが不具合を修正してくれるのを気長に待つ
になってしまうかもしれません。
引用返信 編集キー/
■94133 / inTopicNo.11)  Re[2]: ClosedXMLでマクロ付きExcelを操作する方法
□投稿者/ うんりぺ (2回)-(2020/03/18(Wed) 14:48:56)
魔界の仮面弁士さんが記載されているように

最新バージョンのソースコード(gitからzipダウンロードしたもの)で試したところ
https://github.com/ClosedXML/ClosedXML/issues/1203
は解消しているようでした。

ただ、別の問題が出ていてVML要素の不要なチェックのせいで、ボタンオブジェクトやらをシートに貼っていると例外が出ます。
それは #1293の修正を手動で取り込んで ClosedXML をリビルドすることで対処できそうです。

https://github.com/ClosedXML/ClosedXML/pull/1293/

引用返信 編集キー/
■94136 / inTopicNo.12)  Re[5]: ClosedXMLでマクロ付きExcelを操作する方法
□投稿者/ ゆ (5回)-(2020/03/19(Thu) 08:39:40)
No94119 (KOZ さん) に返信
> ■No94118 (ゆ さん) に返信
>
> OpenXML を使ってみては?
> 少々面倒ですが、Excel のフル機能にアクセスできるはずです。
>
> 「Open XML SDK 2.5 for Office へようこそ」
> https://docs.microsoft.com/ja-jp/office/open-xml/open-xml-sdk
>
> 「SpreadsheetML ドキュメントを操作する」
> https://docs.microsoft.com/ja-jp/office/open-xml/working-with-spreadsheetml-documents
>
> 「[方法] スプレッドシート ドキュメント内のセルにテキストを挿入する (Open XML SDK)」
> https://docs.microsoft.com/ja-jp/office/open-xml/how-to-insert-text-into-a-cell-in-a-spreadsheet
>

確かに、openXMLならばclosedXMLのラップされる前段階なので
不具合かのような事象は解消されるかもしれません。
ですが、仰る通り「少々面倒」という点が気にかかっているのも事実です。。
1つの解決方法として、一度試してみます。

ご回答くださりありがとうございます。

引用返信 編集キー/
■94137 / inTopicNo.13)  Re[2]: ClosedXMLでマクロ付きExcelを操作する方法
□投稿者/ ゆ (6回)-(2020/03/19(Thu) 08:45:38)
No94126 (shu さん) に返信
> ■No94113 (ゆ さん) に返信
>>2020/03/16(Mon) 15:48:55 編集(投稿者)
>>
>>知識、技術不足なため、ご助力いただきたく
>>何卒よろしくお願いいたします。
>>
>>C#でExcelファイルに書き込みたいのですが
>>COMだと非常に処理時間がかかったため、ClosedXMLを使用しました。
>>
> テンプレートがあって各セルに値をいれていくだけなら
> range.valueで範囲内の配列を取得して
> 取得した配列に値を設定し
> range.valueに戻す
> とすればよい気がしますが、どうでしょう?
>
> https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.value

comを使用してお教えいただいた通りの実装も試したのですが
処理時間が改善されなかったためにclosedxmlの使用を検討していました。

私も調べる中で、Excelの範囲を指定してデータを一気にプロットすると
処理が早いという記事等も拝見したのですが。。
私のソースの書き方が悪かったのかもしれません。
再度検討してみます。ご回答ありがとうございます。
引用返信 編集キー/
■94153 / inTopicNo.14)  Re[4]: ClosedXMLでマクロ付きExcelを操作する方法
□投稿者/ ゆ (7回)-(2020/03/20(Fri) 18:27:40)
No94129 (魔界の仮面弁士 さん) に返信
> ■No94127 (ゆ さん) に返信
>>マクロが実装されたボタンの上にボタンのオブジェクトが追加されていくような動きでした。
>
> なるほど。 #1203 でサンプルとして提供されている
> "Button working.xlsm" → "Button not working.xlsm" を見ても、
> btRowfilter という名の OLEControlObject なシェイプに重なって、
> btRowfilter という同名の Picture なシェイプが配置されてしまっていますね。
> 同様に、Comment オブジェクトの Name も変化しているという問題もあるようです。
>
> この点は、プルリク #1227 によって develop ブランチにマージ済みのようです。
> https://github.com/ClosedXML/ClosedXML/pull/1227
>
>
> No94113 の障害解消に至るかは分かりませんが、駄目元で
> ver0.94.2 [Latest release] を
> ver0.95.0-beta1 [Pre-release] あるいは
> ver0.95.0-beta2 に置き換えてみて、
> 結果が変わるかどうか試してみては如何でしょうか。
>
>
> そして、ClosedXML 側の処理に不具合がありそうならば、
> xlsm から機微情報を除去した上で、「現象を再現可能な最低限のサンプル」と共に
> 本家に Issue を投稿しておくことをお奨めします。
>
>
> バージョン変更でも回避できない(あるいは、バージョンを変更できない事情がある)場合は、残念ながら
> (1) ClosedXML を使うのを諦め、他の方法を検討する(OpenXML あるいは Excel オートメーションなど)
> (2) ClosedXML の公開ソースをみて自分で修正する
> (3) 誰かが不具合を修正してくれるのを気長に待つ
> になってしまうかもしれません。


ver0.95.0-beta2 を再度参照しなおしてみましたが、解消には至りませんでした。
むしろ、今度はオブジェクトのサイズが大きくなって複製されたり
マクロが全て外れていたり、と毎度同じ事象になるわけではないため余計に混乱してしまいました。

助言いただいたように、(1)の通りほかの方法を検討しようと思います。
ご回答のために貴重なお時間を頂戴し、ありがとうございました。
引用返信 編集キー/
■94154 / inTopicNo.15)  Re[3]: ClosedXMLでマクロ付きExcelを操作する方法
□投稿者/ ゆ (8回)-(2020/03/20(Fri) 18:33:33)
No94133 (うんりぺ さん) に返信
> 魔界の仮面弁士さんが記載されているように
>
> 最新バージョンのソースコード(gitからzipダウンロードしたもの)で試したところ
> https://github.com/ClosedXML/ClosedXML/issues/1203
> は解消しているようでした。
>
> ただ、別の問題が出ていてVML要素の不要なチェックのせいで、ボタンオブジェクトやらをシートに貼っていると例外が出ます。
> それは #1293の修正を手動で取り込んで ClosedXML をリビルドすることで対処できそうです。
>
> https://github.com/ClosedXML/ClosedXML/pull/1293/
>

ご助言いただいた通り、#1293の修正を手動で取り込んで ClosedXML をリビルドを行ってDLLの参照をし直したのですが
DLLの適用の方法が悪かったのか、解消には至りませんでした。

お時間を頂戴したのに申し訳ありませんが、別の方法を検討しようと思います。
ご回答いただきありがとうございました。

引用返信 編集キー/
■94155 / inTopicNo.16)  Re[3]: ClosedXMLでマクロ付きExcelを操作する方法
□投稿者/ ゆ (9回)-(2020/03/20(Fri) 18:38:35)
No94137 (ゆ さん) に返信
> ■No94126 (shu さん) に返信
>>■No94113 (ゆ さん) に返信
> >>2020/03/16(Mon) 15:48:55 編集(投稿者)
> >>
> >>知識、技術不足なため、ご助力いただきたく
> >>何卒よろしくお願いいたします。
> >>
> >>C#でExcelファイルに書き込みたいのですが
> >>COMだと非常に処理時間がかかったため、ClosedXMLを使用しました。
> >>
>>テンプレートがあって各セルに値をいれていくだけなら
>>range.valueで範囲内の配列を取得して
>>取得した配列に値を設定し
>>range.valueに戻す
>>とすればよい気がしますが、どうでしょう?
>>
>>https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.value
>
> comを使用してお教えいただいた通りの実装も試したのですが
> 処理時間が改善されなかったためにclosedxmlの使用を検討していました。
>
> 私も調べる中で、Excelの範囲を指定してデータを一気にプロットすると
> 処理が早いという記事等も拝見したのですが。。
> 私のソースの書き方が悪かったのかもしれません。
> 再度検討してみます。ご回答ありがとうございます。



皆様にご回答いただいた内容をいろいろと試してみたのですが
私の技術不足もあり、解決に至ることができませんでした。

貴重なお時間を頂戴し、ご回答いただけたこと感謝申し上げます。
今回はリリースまでの期限が間近なので、別の方法を検討し対応することといたします。

また私の力では解決に至れない際には
皆様のご助力をいただければ幸いでございます。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ