• 締切済み

VBによるEXCELの書き込み

お世話になっております VB2010でのEXCEL書き込みで質問です 今、VB2010で、EXCELに書き込む処理を行っています EXCELの参照を追加はせず、Object型にEXCELをセットして、EXCEL参照がなくても使用できるようになっています 問題は、VB2010でEXCELでファイルを書き込み中にスタートメニュー等からEXCELを開き、そこから他のEXCELファイルを開くとVBで実行中のEXCELも開いてしまい、そのVB2010での実行中のEXCELを閉じるとVBの方でエラーが起きてしまいます VB2010で使用するEXCELを、スタートメニューから開いたEXCELが使用しないようにすむ方法はありますでしょうか

みんなの回答

  • tsukaps
  • ベストアンサー率33% (40/121)
回答No.7

再度tsukapsです。 検索してみたところ、 objApl.Interactive = False (処理) objApl.Interactive = True というので、この間の別のEXCELを動かしてもVB側EXCELを表示されず、干渉しないようです。 試したわけではないのですが、 質問者さんの趣旨に近ければ、詳しくは検索してみてください。

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.6

私の場合は以下のようなソースで呼び出しています。 'エクセルを起動 Set AppXl = CreateObject("Excel.Application") AppXl.Visible = False AppXl.Workbooks.Add Set objWorkingBook = AppXl.ActiveWorkbook Set objWorkingSheet = AppXl.ActiveSheet 'Excelを起動終わり これで、VBから呼び出したExcelを明示に指定できます。 ただし、エラーで止まってしまったときには、別のExcelを開くと、非表示だったExcelも表示されていまいます。 VBまで使ったシステムならば、 1.使用前に全てのExcelを閉じる。 2.作業中は、Excelの機動を含め、他の操作はしない ということを、ユーザーに徹底していただく方法もあります。 (昼休みに入る直前に起動して、昼休みが終わる頃には作業が終了しているような内容なら、できない運用でないと思います) もしくは、VBからExcelを操作せずに、Excel VBA に移植してしまうという手もあります。

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.5

こんばんは。 詳細は分かりませんので、ある程度、状況を想像しながらのアドバイスです。 >EXCELの参照を追加はせず、Object型にEXCELをセットして、EXCEL参照がなくても使用できるようになっています まず、VBからExcelを起動することをお勧めします。 Excelが開いた状態でExcelをつかうVBを起動すると、VBの側で「どのExcelを使うのか」を迷ってしまう状況が生じます。 VBからExcelを起動すれば、対象となるExcelが明確になります。

kapiba-
質問者

補足

回答ありがとうございます vbからEXCELを起動とのことですが、どのような命令のことでしょう・・・ ↓の命令とはまた違う命令なのでしょうか objApl = CreateObject("Excel.Application") objbooks = objApl.Workbooks 詳細が分かりづらくてすいません すでに、VB側でEXCEL処理をしている最中に、スタートメニューからEXCELを起動してファイルを開いた際にVB側で処理しているEXCELも一緒に開いてしまい、スタートメニューから開いたEXCELを閉じるとVBで処理中のEXCELも一緒に閉じてしまうようでVBでシステムエラーが起きます エラーの内容は 呼び出し先が呼び出しを拒否しました。 (HRESULT からの例外:0x80010001 (RPC_E_CALL_REJECTED)) です

  • tsukaps
  • ベストアンサー率33% (40/121)
回答No.4

再度 tsukapsです。 >EXCELの参照を追加はせず、Object型にEXCELをセットして、EXCEL参照がなくても使用できるようになっています 原因との関係は不明ですが、 私の場合、Microsoft.Office.Interop.Excel.dllを参照に追加しています。 office関係でその他には何も参照を追加していません。

kapiba-
質問者

補足

回答ありがとうございます No.3も含めて補足させてもらいます visible = Falseをためさせてもらいましたが、結果は同じでした・・・ 標準化の都合上、office関係のdllを追加できないのでobject型にEXCELをセットして書き込む方法しかとれません visible = Falseのように、書き込んでいるアプリを外側から隠したり、呼べなくするような命令を捜し中です

  • tsukaps
  • ベストアンサー率33% (40/121)
回答No.3

tsukapsです。 私とどうして違うのか不明なのですが、 試していませんが objApl = CreateObject("Excel.Application") のあと objApl.Visible = False と入れたらどうなりますか? 画面には表示されないと思いますが、別のEXCELを起動するとつられて出てきますか?

  • tsukaps
  • ベストアンサー率33% (40/121)
回答No.2

私、素人自己流プログラマなのですが、 自分のアプリで試したけど、他のEXCEL起動は干渉しませんでした。 ファイルを開くという形ですけど。 Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet xlApp = CreateObject("Excel.Application") xlBook = xlApp.Workbooks.Open(dirPath + "\xxxx.xlsx") (途中省略) xlSheet = xlBook.Worksheets(s) (途中省略) EXL_DATA(s, i, k) = xlSheet.Cells._Default(i, k).Value 読出し あともう一つ、 エラーだけを無くすだけなら、Try Catch ではだめですか? 開放できるときは開放し、出来ないときには例外処理ルーチンへ

kapiba-
質問者

補足

回答ありがとうございます テンプレートファイル(xls/xlsxファイル)を作成し、それを読み込み→書き込み→別名で保存する という方法を取ったのですが起動した別EXCELで、プログラムで使用中のEXCELも開いてしまいました 環境や手順が違うのでしょうか・・・ objApl = CreateObject("Excel.Application") objbooks = objApl.Workbooks '↓を、新規からファイル読込に変更 'objBook = objBooks.add objBook = objBooks.Open(ファイル名, ReadOnly:=False) objSheets = objBook.WorkSheets objSheet = objSheets(シート番号) objRange = objSHeet.Range("A1") ~~書き込みや罫線処理~~ objApl.DisplayAlerts = False objBook.SaveAs("ファイル名", フォーマット) objApl.DisplayAlerts = True 解放 今回の目的は、「こちらのプログラム起動中でもEXCELが使用でき、なおかつこちらのEXCELも正常に終わらせたい」のが目的なので、エラーも起こさせたくないのですが・・・ (こちらのEXCEL書き込みプログラムが、件数多いと2時間以上かかってしまうので(これも問題なのですが;)その間にEXCEL作業ができないため問題となりました)

  • tsukaps
  • ベストアンサー率33% (40/121)
回答No.1

過去にVB2010でExcel参照のプログラミングをした者です。 Excel.Application Excel.Workbook Excel.Worksheet この3つを分けて考えれば出来ませんか?

kapiba-
質問者

補足

素早い回答ありがとうございます 申し訳ないのですが、3つを分けて考えるというのはどういうことでしょう? 質問の場所に書くのを忘れてしまったのですが、プログラムとしては objApl = CreateObject("Excel.Application") objbooks = objApl.Workbooks objBook = objBooks.add objSheets = objBook.WorkSheets objSheet = objSheets(シート番号) objRange = objSHeet.Range("A1") ~~書き込みや罫線処理~~ objApl.DisplayAlerts = False objBook.SaveAs("ファイル名", フォーマット) objApl.DisplayAlerts = True 解放 という感じです 解放はきちんとされています