■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 でしょうか。スペルミスが多すぎるのでエラーコードを 信用できないのですが、それが間違いではないのだとしたら 『リモート プロシージャ コールに失敗しました。』 というエラーです。何故失敗したのかという理由まではメッセージ内には含まれません。
|
|