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

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

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

Re[3]: VBからEXCEL形式しようとするとSAVE()でエラ-


(過去ログ 177 を表示中)

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

■101677 / inTopicNo.1)  VBからEXCEL形式しようとするとSAVE()でエラ-
  
□投稿者/ TAKE (15回)-(2023/03/29(Wed) 22:37:08)
TAKE さんの Web サイト

分類:[.NET 全般] 

いつもお世話になっています。 

Winodwes10 EXCEL2016
VisualStadio2015    参照設定 MiExcel 16.0 Object LibraryとMicrosoft Office16.0 Object Libraryをしています。 
VBでやろうとしていることはアプリ画面から入力データを元に計算処理をしてEXCELに反映するものです。
考え方として新規でEXCEL作成すると時間がかかるので所定の位置にEXCELのテンプレートファイルをコピーしてパス先でデータの追加・編集でしようと考えています。
ちなみテンプレートのEXCELファイルはフルリモート権限にして

dim ex as new Microsoft.office,Interrop.Application
dim sh as Microsoft.office,Interrop.Excel.workshee
dim wb as Microsoft.office,Interrop.Excel.workbook
dim pe as new system.Dialognostics.Process

【例】
' EXCEL形式のファイルオープンさせて
wb = ex.WorkBooks.Open("C\take\EXCEL0328.xlsx)

’シートを指定
sh= wb.sheets("工事算定表)

'EXCEL形式ファイルに実際に値を設定する
sh("D8").value = 12345678
sh("G8").value ="あいおうえお"

'下記のでデータをセーブさせようするよ1分rから下記のエラーになる!
wb.save()

※エラーの内容
!COMExceptionはユーザによってハンドルされませんでした
型system.tumtime.interopservices,COMEExceptionの例外がFicMaxLowPriceCal.dllで発生
しましたが、ユーザコールに失敗しました。(HRESULTからの例外:0X800706BE)
どう直すのか見当がつきません。よろしくお願いします。
引用返信 編集キー/
■101678 / inTopicNo.2)  Re[1]: VBからEXCEL形式しようとするとSAVE()でエラ-
□投稿者/ ぼーちゃん (42回)-(2023/03/30(Thu) 09:07:11)
誤記が多くビルド不可能なので検証ができません。
また今の方式でEXCELを操作する場合、COMオブジェクトの開放など気にする必要がありますが理解されていますか?

VB.NETでエクセルを操作するならClosedXMLなどの
ライブラリを使用するほうが色々と簡単でおすすめです
https://tm-progapp.hatenablog.com/entry/2021/03/23/215917

引用返信 編集キー/
■101679 / inTopicNo.3)  Re[1]: VBからEXCEL形式しようとするとSAVE()でエラ-
□投稿者/ 魔界の仮面弁士 (3611回)-(2023/03/30(Thu) 09:39:42)
2023/03/30(Thu) 10:32:32 編集(投稿者)

No101677 (TAKE さん) に返信
> Winodwes10 EXCEL2016

Winodwes
Windows

質問内容に、いろいろとスペルミスが多すぎるため、
記述されたコードには、まるで信頼性がありません…。

現象を再現可能な実際のコードを、そのまま貼っていただけますか?


> EXCELのテンプレートファイルをコピーして
*.xlsx は Excel ブック ファイルで、
*.xltx が Excel テンプレート ファイルですね。


> dim ex as new Microsoft.office,Interrop.Application
「,」ではなく「.」ですよね?
「Interrop.Application」ではなく、
「Interop.Excel.Application」ですよね?


> dim sh as Microsoft.office,Interrop.Excel.workshee
"," や "rr" などの誤りに目を瞑ったとしても、
workshee という型はありません。この記述では
Worksheet なのか
Worksheets なのかも曖昧です。


> dim pe as new system.Dialognostics.Process
System.Dialognostics.Process という型はありません。
System.Diagnostics.Process ですよね?

そして、Process クラスのインスタンスを作っているのに、
それを呼び出している箇所がありません。これの意味は何ですか?


> ' EXCEL形式のファイルオープンさせて
> wb = ex.WorkBooks.Open("C\take\EXCEL0328.xlsx)
ダブルコーテーションが閉じられていないので文法違反です。

仮に閉じられていたとしても、"C:\take\〜" ではなく "C\take\〜" なので
この指定は絶対パス指定ではなく、カレントディレクトリからの相対パス指定になります。

何より、この記述では COM オブジェクトの解放処理(Marshal.ReleaseComObject)の
呼び出し時に支障が生じてしまいますよね? 使用後に即時解放できるよう、
生成されたすべての COM オブジェクトを変数に受けるようにしましょう。

それにテンプレートというのであれば、コピーしてから .Open メソッドを呼ぶのではなく、
.Add メソッドで新規ブックとて開くようにし、ファイル名を指定して.SaveAs メソッドで保存する方法もありますね。


> ’シートを指定
> sh= wb.sheets("工事算定表)
この記述から推察するに、sh というのは Worksheet 型だったということですね。

しかしこれもダブルコーテーションが閉じられていませんし、
Sheets オブジェクトのインスタンスが保持されていないので
Marshal.RelaseComObjct できないという問題を抱えています。

それにこの記述では、右辺が As Object な型で返されてしまうため、暗黙の型変換を誘発します。
Option Strict Off であればそれでも通りますが、レイトバインドに頼ったコードにすると、
COM オブジェクトの参照カウントが予期せず増加してしまい、解放漏れに繋がりやすくなります。
そのため、できるだけ Option Strict On でも通るコーディングを心掛けることをおすすめします。
https://www.petitmonte.com/bbs/answers?question_id=25306


> 'EXCEL形式ファイルに実際に値を設定する
> sh("D8").value = 12345678
> sh("G8").value ="あいおうえお"

先ほど、変数 sh は Worksheet 型であろうと判断したばかりですが、
Worksheet 型には既定のプロパティが無いので、
sh("D8") といった呼び出しは出来ないはずです。

想像で書くのではなく、実際のコードの提示をお願いします。


> '下記のでデータをセーブさせようするよ1分rから下記のエラーになる!
> wb.save()
日本語コメントの内容が支離滅裂なのですが、
.Save を呼び出してからエラーが出るまで、1 分程度待たされるということですか?


> !COMExceptionはユーザによってハンドルされませんでした
> 型system.tumtime.interopservices,COMEExceptionの例外がFicMaxLowPriceCal.dllで発生
> しましたが、ユーザコールに失敗しました。(HRESULTからの例外:0X800706BE)
system.tumtime.interopservices,COMEException ではなく
System.Runtime.InteropServices.COMException ですよね?

0X800706BE というのは
0x800706BE でしょうか。スペルミスが多すぎるのでエラーコードを
信用できないのですが、それが間違いではないのだとしたら
 『リモート プロシージャ コールに失敗しました。』
というエラーです。何故失敗したのかという理由まではメッセージ内には含まれません。
引用返信 編集キー/
■101681 / inTopicNo.4)  Re[2]: VBからEXCEL形式しようとするとSAVE()でエラ-
□投稿者/ TAKE (16回)-(2023/03/30(Thu) 11:06:14)
TAKE さんの Web サイト
No101678 (ぼーちゃん さん) に返信
> 誤記が多くビルド不可能なので検証ができません。
> また今の方式でEXCELを操作する場合、COMオブジェクトの開放など気にする必要がありますが理解されていますか?
>
> VB.NETでエクセルを操作するならClosedXMLなどの
> ライブラリを使用するほうが色々と簡単でおすすめです
> https://tm-progapp.hatenablog.com/entry/2021/03/23/215917
>
こちらではコンパイル、ビルドまでできて他の機能は動くんですが誤字脱字多くてすみません。端末が小さく読みづらいのと注意点が足りなかった大変申し訳ないです。

仕事で開発しているもので、しかもリモート環境での限定されている(DOS窓がない、開発のためのソフトは手続きが非常にめんどうで時間がかかる)

>今の方式でEXCELを操作する場合、COMオブジェクトの開放など気にする必要がありますが理解されていますか?
理解していません。申し訳ございませんがご教授していただくとありがたいです。

引用返信 編集キー/
■101687 / inTopicNo.5)  Re[3]: VBからEXCEL形式しようとするとSAVE()でエラ-
□投稿者/ ぼーちゃん (43回)-(2023/03/31(Fri) 08:39:10)
> >今の方式でEXCELを操作する場合、COMオブジェクトの開放など気にする必要がありますが理解されていますか?
> 理解していません。申し訳ございませんがご教授していただくとありがたいです。

http://blog.livedoor.jp/akf0/archives/51331948.html
COMオブジェクトの開放についてはこちらのブログなどを参考にしてみて下さい。
ReleaseComObjectで検索すると他にも色々と情報が出てきます。

ですがやはりオススメは前に書いたようにClosedXMLなどのライブラリを使うことです。

どうしても現状のコードを直して使う必要があるということでしたら、
魔界の仮面弁士さんのご指摘を参考に、実際にビルドが通る
(問題が再現する)コードを貼る必要がありますね。
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -