こんにちは、質問お願いします。
ExcelVBAであらかじめ作ってあるマクロをVB.NETで動かすにはどうすればいいでしょうか??
'エクセル起動
Dim oExcel As Object
Dim oBook As Object
Dim oBooks As Object
Dim oSheets As Object
Dim oSheet As Object
lotNo = Trim(txtSeizolot.Text) + "ロット"
oExcel = CreateObject("Excel.Application")
oExcel.Visible = False
oBooks = oExcel.Workbooks
oBook = oBooks.Open(FilePach)
”ここに入る処理はなんでしょうか???”
System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheets)
System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheet)
oSheet = Nothing
System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks)
oBook.Close(False)
System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook)
oBook = Nothing
oExcel.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel)
oExcel = Nothing
GC.Collect()
oSheets = oExcel.worksheets
osheet = oSheets(Trim(lotNo))
oExcel.UserControl = False
RunAutoMacrosって使えたかなぁ〜
' Auto_Openマクロの実行
Workbooks.Open XlsFilePath
Workbooks(XlsBookName).RunAutoMacros xlAutoOpen
たしか、VBAで他のマクロを実行する時には
こうやって走らせることできたけど.Netではどうやるんだろう、ゴミレススマソ。
Auto_Open関数に記述しておけば
Excel開いた時に走らないかなぁ〜。
マクロを有効にしますか?の確認ダイアログが出るけど・・・。
oExcel.Run("'" & oBook.Name & "'!Macro名")
でいけますが、その Object 型を多用したコードは嫌いですねぇ。
インテリセンス(『.(ピリオド)』を打った時点で入力候補の表示)も
使えませんし、型宣言はキッチリやった方が良くないですか?。
みなさん返信有難うございます。
返事遅くなって申し訳ありません。
>型宣言はキッチリやった方が良くないですか?
まだ力不足でどうやっていいか分かりません。
これでもきっちりやったつもりなのですが、どうやったらよいのでしょうか??
マクロの実行なんですが、
oExcel.Run("'" & oBook.Name & "'!Sheet3.Update")
↑マクロ名
これを実行すると
'System.Runtime.InteropServices.COMException' のハンドルされていない例外が microsoft.visualbasic.dll で発生しました。
追加情報 : HRESULT からの例外です : 0x800A03EC。
このようなエラーがでてしまいます。
oBook.Nameのところにファイル名を入れても同じエラーがでてしまいます。
なにか間違っているのでしょうか??
VB6世界しか知りませんが(調べたら.Netでもそうでした)
型宣言は、文字列ならString
整数ならLong や Integerという型があるように
エクセルにもExcel.Applicationというオブジェクトや
Excel.Workbookなどというオブジェクトなど、専用の宣言が用意されています
(参照設定が必要だと思われますが)←要確認!
きっちり型宣言を行うことで間違ったメソッド実行やプロパティの設定を
未然に防ぐこともできます
返信有難うございます。
返信内容を元に
Dim oExcel As Excel.Application
Dim oBook As Excel.Workbook
Dim oBooks As Excel.Workbooks
Dim oSheets As Excel.Worksheets
Dim oSheet As Excel.Worksheet
この用に宣言しなおしました。
これでいいと思うのですがどうでしょう??
マクロの実行なんですが
①・・・・oExcel.Run("'" & oBook.Name & "'!Sheet1.Update")
②・・・・oExcel.Run("'" & oBook.Name & "'!Sheet2.Update")
①はこの記述でうまくいったのですが、②の処理が別シートのマクロのためうまくいきません。
現在アクティブなシートを切替える方法はどうやるのでしょうか??
あれぇぇ?
○○○オブジェクトが
アクティブなシートを切り替える▲▲▲プロパティとかもってなかったっけ?
そのために明示的に宣言したはずなのに・・・
oExcel、oBook、oBooks、oSheets、oSheet
がエクセル絡みのオブジェクトとして宣言したのだから
特攻隊長まるるうさんが示してるように
ピリオド打ってみればいやでも見つかる気がするんだが・・・
オブジェクトを手当たり次第でも見つかるはず
そういうことって試してみました?
試してメソッドや、プロパティ候補が出なかったから質問してる?
(あえてオブジェクト名とプロパティ名は伏せてみました・・・)
まぁ、エクセルのオブジェクトってごちゃごちゃしてるから
慣れないとぱっと見つけるのは難しい部分はあるかもしれません。
しかし、そーゆー時の為にエクセルには『マクロの記録』なるものが
あるわけです。現在アクティブなシートを切替える方法はこれを使えば
すぐに分かるでしょう。それでもダメな場合はそのコードに対する
ヘルプを読んで下さい。関連したキーワードが見つかるはずです。
『マクロの記録』と『ヘルプ』。あと『オブジェクトブラウザ』を活用すれば、
エクセルに関してはほとんどの事が、それほど苦労せずに調べられると
思いますよ。
ツイート | ![]() |