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

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

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

遅延バインディングの回避策

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

■96417 / inTopicNo.1)  遅延バインディングの回避策
  
□投稿者/ 初心者 (6回)-(2020/11/21(Sat) 18:06:29)

分類:[.NET 全般] 

立て続けですが、質問させてください。

曖昧な記述が多かったので、
Option Strict On を指定してコンパイルしましたら、以下の行だけ回避できません。
回避策はあるでしょうか?
よろしくお願いいたします。

処理は、EXCELを起動するため、Shell.Applicationを利用してます。(どのバーションでも対応可能な様にするため)
遅延バインディングが3箇所あります。
ネットで、Ctypeを使用してくださいなどの記述があり、トライしまいたが惨敗です。
完成時には、EXCELの参照設定も外すつもりでしたので
どのEXCELバーションでも可能な様に、敢えてOBJECT型にしました。


Public Function Excel_Get() As Object
On Error Resume Next
Dim xlapp1 As IntPtr
Dim xlapp2 As Object 'Excel.Application
Excel_Get = Nothing

xlapp1 = Nothing
xlapp1 = FindWindow("XLMAIN", vbNullString)   
'起動していればそのExcelを使用する
If xlapp1 <> IntPtr.Zero Then
Else
With CreateObject("Shell.Application")
.ShellExecute("excel.exe")      '←遅延バインディング
End With
'スリープ
System.Threading.Thread.Sleep(1000) '10ミリ秒待ち
End If


xlapp2 = Nothing
Do While xlapp2 Is Nothing
xlapp2 = GetObject(, "Excel.Application")
System.Windows.Forms.Application.DoEvents() '割り込み
Loop
'スリープ
System.Threading.Thread.Sleep(500) '10ミリ秒待ち
If xlapp2 Is Nothing Then
MsgBox("EXCELが起動されている事は確認しましたが、ハンドルを取得することが出来ません。" & vbCrLf & _
"再度実行してみて下さい。")
End
End If
xlapp2.visible = True       '←遅延バインディング
xlapp2.ScreenUpdating = True   '←遅延バインディング
Excel_Get = xlapp2
MDIClient = Nothing
End Function
引用返信 編集キー/
■96419 / inTopicNo.2)  Re[1]: 遅延バインディングの回避策
□投稿者/ Hongliang (1117回)-(2020/11/21(Sat) 18:40:20)
> 完成時には、EXCELの参照設定も外すつもりでしたので
> どのEXCELバーションでも可能な様に、敢えてOBJECT型にしました。
それはつまり遅延バインディングするということです。
なので、少なくともその部分についてはOption Strict Onにすることはできません。
Excelの処理部分については別のvbファイルに分けてそこだけOption Strict Offで記述することになるでしょう。

ShellExecuteについては、
・そもそも「起動してGetObject」ではなく、CreateObject関数を使用する
 (アドインがどうこうなどの問題があるみたいな話も見かけましたが…)
・System.Diagnostics.ProcessクラスのStartメソッドでExcelプロセスを起動させる
などの方法が考えられます。
引用返信 編集キー/
■96440 / inTopicNo.3)  Re[2]: 遅延バインディングの回避策
□投稿者/ 初心者 (7回)-(2020/11/23(Mon) 10:16:51)
Hongliang さん 回答ありがとうございます。
Excelの処理部分については別のvbファイルに分けてそこだけOption Strict Offで記述することになるでしょう。
そんな手がありましたね。現時点この方法で進めたいと思います。

改めて、ありがとうございます。
解決済み
引用返信 編集キー/

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


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

このトピックに書きこむ