アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になっております
VB2010でのEXCEL書き込みで質問です


今、VB2010で、EXCELに書き込む処理を行っています
EXCELの参照を追加はせず、Object型にEXCELをセットして、EXCEL参照がなくても使用できるようになっています

問題は、VB2010でEXCELでファイルを書き込み中にスタートメニュー等からEXCELを開き、そこから他のEXCELファイルを開くとVBで実行中のEXCELも開いてしまい、そのVB2010での実行中のEXCELを閉じるとVBの方でエラーが起きてしまいます

VB2010で使用するEXCELを、スタートメニューから開いたEXCELが使用しないようにすむ方法はありますでしょうか

A 回答 (7件)

再度tsukapsです。


検索してみたところ、

objApl.Interactive = False

(処理)

objApl.Interactive = True

というので、この間の別のEXCELを動かしてもVB側EXCELを表示されず、干渉しないようです。
試したわけではないのですが、
質問者さんの趣旨に近ければ、詳しくは検索してみてください。
    • good
    • 0

私の場合は以下のようなソースで呼び出しています。



'エクセルを起動
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 に移植してしまうという手もあります。
    • good
    • 0

こんばんは。


詳細は分かりませんので、ある程度、状況を想像しながらのアドバイスです。
>EXCELの参照を追加はせず、Object型にEXCELをセットして、EXCEL参照がなくても使用できるようになっています

まず、VBからExcelを起動することをお勧めします。
Excelが開いた状態でExcelをつかうVBを起動すると、VBの側で「どのExcelを使うのか」を迷ってしまう状況が生じます。
VBからExcelを起動すれば、対象となるExcelが明確になります。

この回答への補足

回答ありがとうございます

vbからEXCELを起動とのことですが、どのような命令のことでしょう・・・
↓の命令とはまた違う命令なのでしょうか
objApl = CreateObject("Excel.Application")
objbooks = objApl.Workbooks

詳細が分かりづらくてすいません
すでに、VB側でEXCEL処理をしている最中に、スタートメニューからEXCELを起動してファイルを開いた際にVB側で処理しているEXCELも一緒に開いてしまい、スタートメニューから開いたEXCELを閉じるとVBで処理中のEXCELも一緒に閉じてしまうようでVBでシステムエラーが起きます
エラーの内容は
呼び出し先が呼び出しを拒否しました。 (HRESULT からの例外:0x80010001 (RPC_E_CALL_REJECTED))
です

補足日時:2014/12/29 10:11
    • good
    • 0

再度 tsukapsです。



>EXCELの参照を追加はせず、Object型にEXCELをセットして、EXCEL参照がなくても使用できるようになっています

原因との関係は不明ですが、
私の場合、Microsoft.Office.Interop.Excel.dllを参照に追加しています。
office関係でその他には何も参照を追加していません。

この回答への補足

回答ありがとうございます
No.3も含めて補足させてもらいます

visible = Falseをためさせてもらいましたが、結果は同じでした・・・
標準化の都合上、office関係のdllを追加できないのでobject型にEXCELをセットして書き込む方法しかとれません

visible = Falseのように、書き込んでいるアプリを外側から隠したり、呼べなくするような命令を捜し中です

補足日時:2014/12/29 09:52
    • good
    • 0

tsukapsです。


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

私、素人自己流プログラマなのですが、


自分のアプリで試したけど、他の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 ではだめですか?
開放できるときは開放し、出来ないときには例外処理ルーチンへ

この回答への補足

回答ありがとうございます

テンプレートファイル(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作業ができないため問題となりました)

補足日時:2014/12/22 10:38
    • good
    • 0

過去にVB2010でExcel参照のプログラミングをした者です。


Excel.Application
Excel.Workbook
Excel.Worksheet
この3つを分けて考えれば出来ませんか?

この回答への補足

素早い回答ありがとうございます
申し訳ないのですが、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
解放

という感じです
解放はきちんとされています

補足日時:2014/12/16 11:19
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています