[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/02/09(Wed) 20:45
投稿者名:アイ
Eメール:
URL :
タイトル:
既存Excelファイルの印刷
はじめまして、アイと申します。

本サイト、既存Excelファイルの操作を参考に、
印刷を実行しようとしたところ、実行時エラーが
必ず出て困っております。

エラーは2147417843で、内容を調べると
hhttp://support.microsoft.com/default.aspx?scid=kb;ja;186063
アプリケーションエラーで、
An outgoing call cannot be made since the application is
dispatching an input-synchronous call
というコメントがMicrosoftには載っておりました。

以下コードです。(ほぼそのままですが)
Private Sub Command1_Click()
  On Error Resume Next
  Dim xlApp  As Excel.Application
  Dim xlBook  As Excel.Workbook
  Dim xlSheet As Excel.Worksheet
  
  この行で必ずエラー発生
  Set xlApp = CreateObject("Excel.Application")

  Set xlBook = xlApp.Workbooks.Open("C:\Test.xls")
  Set xlSheet = xlBook.Worksheets(1)
  xlSheet.SaveAs "c:\Test.xls"

  '終了処理
  xlApp.Quit
  Set xlSheet = Nothing
  Set xlBook = Nothing
  Set xlApp = Nothing
End Sub

**以上コード**

参照設定はしてあり、何度再起動してトライしても
同じでした。

ほぼサンプルコードどおりなので、環境を。
OS:Windows2000Sp4
OFFICE2000(Excel2000)
VB5.0

何か調べてみる点などありましたらご教示ください。
よろしくお願いします。

投稿時間:2005/02/09(Wed) 21:39
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 既存Excelファイルの印刷
> 以下コードです。(ほぼそのままですが)
ほぼそのままが気になりますが、サンプルのその1をそのまま実行しても
同じでしょうか?

参照設定は何に入ってますか?
投稿されたコードは実際に使っている部分をコピーしたものですか?

>   On Error Resume Next
正常にどうさするまで上記はコメントアウトしておいて下さい。


下記を試しても同様にエラーがでますか?
Private Sub Command1_Click()
    Dim xlApp    As Excel.Application
    Dim xlBook   As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open("C:\Test.xls")
    Set xlSheet = xlBook.Worksheets(1)
    xlApp.Visible = True
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
End Sub

投稿時間:2005/02/10(Thu) 09:49
投稿者名:アイ
Eメール:
URL :
タイトル:
Re^2: 既存Excelファイルの印刷
お世話になります。
コメントありがとうございます。

> 参照設定は何に入ってますか?
> 投稿されたコードは実際に使っている部分をコピーしたものですか?
参照設定は、Microsoft Excel 9.0 Object Library にチェックが入っています。
また、投稿したコードは、コマンドボタンに貼り付けた部分でしたが、
実際には、「目的の外部信号が入ったら」というアクションで使用します。
この「目的の外部信号」というのはRS-232Cで通信している機器からのもので、
フォーム上にアイテムを貼り付けて、それを監視しているビットがONに
なったら、という感じでExcelファイルを印刷しようとおもっていました。

ただし、動作確認段階でつまづいたのはコマンドボタンのコードなので
上記の云々は関係ないかと思い、記述を省略してしまいました。

また、Error補足のために、実行時は「ON Error Resume Next」は
はずして動作確認していました。

> 下記を試しても同様にエラーがでますか?(コード記述省略)
コマンドボタンを作り、コードを書いたらうまく行きました。
ただし、上述外部信号による動作は、全く同じコードでうまくいきません。

違いはgetobjectとCreateObjectの部分、また
VBから見たExcelの参照方法が、VBAとは異なることに
留意したコードのように思われましたが、その理解で
よろしかったでしょうか?

それだけおたずねしたら、後はVBの範疇外のような
気がしますので(どちらかというと、Excelと通信外部機器の使用している
領域との話のようなので)、自分でこつこつと調べてみようと
思います。

以上、お願いします。

投稿時間:2005/02/10(Thu) 15:44
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: 既存Excelファイルの印刷
> エラーは2147417843で、内容を調べると
2147417843 ではなく、
-2147417843 ですよね? 16進数表記では 8001010D です。

> An outgoing call cannot be made since the application is
> dispatching an input-synchronous call
> というコメントがMicrosoftには載っておりました。
日本語環境においては、
  『アプリケーションが入力同期呼び出しをディスパッチしているため、呼び出せません。』
のような意味になります。

このエラーの理由としては、下記のような物ですが……。
hhttp://support.microsoft.com/kb/131056/en-us

そのアプリケーションで、Excel起動以外の動作を平行して行っていませんか?
場合によっては、Excelを操作するEXEを、別途分けた方が良いかもしれません。

投稿時間:2005/02/10(Thu) 20:23
投稿者名:アイ
Eメール:
URL :
タイトル:
Re^2: 既存Excelファイルの印刷
返信ありがとうございます。

>  2147417843 ではなく、
> -2147417843 ですよね? 16進数表記では 8001010D です。
はい、その通りです。

> このエラーの理由としては、下記のような物ですが……。
> hhttp://support.microsoft.com/kb/131056/en-us
>
> そのアプリケーションで、Excel起動以外の動作を平行して行っていませんか?
> 場合によっては、Excelを操作するEXEを、別途分けた方が良いかもしれません。

RS-232C経由で通信している機器と、データのやりとりを
しています。
その機器からの信号を受けて、表題のExcelファイルを
印刷する、というのが最終目的なのですが・・・。

花ちゃんさんのコードで、Commandボタンに貼り付けた
時はうまくいくことが判明しました。

全く同じコードを、その「外部信号を受けた」という
タイミングで行うと、前述のアプリケーションエラーが
発生しています。

#最初はそんなこと考えもせず、Excelが呼び出せないのだと
思い、投稿したものです。

投稿時間:2005/02/11(Fri) 16:38
投稿者名:アイ
Eメール:
URL :
タイトル:
Re^3: 既存Excelファイルの印刷
お世話になっております。

少し観点を変えて、
Excelの機能に頼らずに、Excelファイルを印刷することは
可能でしょうか?

投稿時間:2005/02/12(Sat) 09:08
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^4: 既存Excelファイルの印刷
> Excelの機能に頼らずに、Excelファイルを印刷することは
> 可能でしょうか?

ここの印刷関係の[関連付け起動によるファイルの印刷]ではだめですか?

投稿時間:2005/02/14(Mon) 02:45
投稿者名:Wendy
Eメール:
URL :
タイトル:
Re^5: 既存Excelファイルの印刷
夜分失礼します。
今、たまたま読んでいたのですが、その原因は初歩的なことだと思うのです。
「参照設定」で、事前バインディングしているのでしたら、CreateObject
は使いません。
「参照設定」をせずに、実行時バインディングをするなら、CreateObject
を使って、xlApp などは、すべて、Object 型になります。
ただし、Excel起動時で、開いているブックを使うなら、いずれにしても、
GetObjectで、開いているブックを取り出してください。

Private Sub Command1_Click()
  'On Error Resume Next
  Dim xlApp  As Excel.Application
  Dim xlBook  As Excel.Workbook
  Dim xlSheet As Excel.Worksheet
  Set xlApp = New Excel.Application
  Set xlBook = xlApp.Workbooks.Open("C:\Test.xls")
  'xlApp.Visible = True 'しなくても可能だと思います。
  'あまり印刷範囲の大きなシートの場合は、様子をみてください。
  Set xlSheet = xlBook.Worksheets(1)
   xlSheet.PrintOut
  'xlSheet.SaveAs "c:\Test.xls"
  '終了処理
  xlBook.Close
  xlApp.Quit
  Set xlSheet = Nothing
  Set xlBook = Nothing
  Set xlApp = Nothing
End Sub

たぶん、こういうようになるはずです。
うまく行かなかったらすみません。

>RS-232C経由で通信している機器と、データのやりとりを
>しています。
>その機器からの信号を受けて、表題のExcelファイルを
>印刷する、というのが最終目的なのですが・・・。
これについては、私には、なんとも言えません。

投稿時間:2005/02/14(Mon) 12:45
投稿者名:アイ
Eメール:
URL :
タイトル:
Re^6: 既存Excelファイルの印刷
アイです。ありがとうございます。
> 「参照設定」で、事前バインディングしているのでしたら、CreateObject
>  は使いません。
> 「参照設定」をせずに、実行時バインディングをするなら、CreateObject
> を使って、xlApp などは、すべて、Object 型になります。
> ただし、Excel起動時で、開いているブックを使うなら、いずれにしても、
> GetObjectで、開いているブックを取り出してください。
頂いたコードでも動作確認できました。
最初に花ちゃんさんから提示して頂いたコードでも、
このコードでも、なんというのでしょうか、「自分からのアクション」
(コマンドボタンをクリックする、など)であれば正常に動作します。
つまり、Excelファイルを開いて、印刷がされます。
しかしながら、件の「外部信号によるアクション」になると
同じコードが機能しなくなり、当初のエラーが発生するような
状況になってしまっています。
私の説明が悪く、最初は本質もつかめずに「出来ない出来ない」言っており、
すみませんでした。

現在は、魔界の仮面弁士さんがちらっとおっしゃってくれた
「EXE分け」と、花ちゃんさんから提案して頂いた
「関連づけ印刷」を組み合わせて、なんとかしようとしているところです。
つまり、その外部信号を切り分けて、
外部信号入力→他のEXE起動(これがExcelファイルを印刷する)にしたら
どういう挙動になるか、やってみたいと思います。

長文失礼しました。
最後まであきらめずに勉強して、完成させたいと思います。

投稿時間:2005/02/14(Mon) 14:21
投稿者名:Wendy
Eメール:
URL :
タイトル:
Re^7: 既存Excelファイルの印刷
こんにちは。
ちゃんと読んでいなくて、ごめんなさい。
「外部信号によるアクション」
これ自体、どのようになるのか、はっきりしていないのですが、それは、
フォームで、直接コマンドボタンでクリックするならともかく、参照設定の
事前バインディングに無理があるような気がしますね。

>RS-232C経由で通信している機器と、データのやりとりを
>しています。
>その機器からの信号を受けて、表題のExcelファイルを
>印刷する、というのが最終目的なのですが・・・。

もう1つは、私は、作ったことがないのですが、Excel のオートメーション・
オブジェクトを使わないで、ADO を使って、直接ファイルのデータを読む方法
はありますね。中身のオブジェクトはダメなのですが、テキストオンリーなら、
出来ます。でも、コネクションをとることだから、単独ならともかく、ADOが
どう反応するかわかりません。もしかしたら、同じことかもしれませんね。
一応、お返事まで……。

投稿時間:2005/02/14(Mon) 20:44
投稿者名:アイ
Eメール:
URL :
タイトル:
Re^8: 既存Excel・・・
こんばんは

解決しました。
というか原因は不明なのですが、色々模索しているなかで
一番はじめのコードのままで、
「Excelを起動してファイルを読み込み、
印刷する」部分をまるごとタイマーの処理にして、
通信経由でデータが変化する部分にはタイマーの
EnableをTrueにしただけなのですが。

これが直接Excelファイルの処理をData1_Changeに
書いていると、ずっとアプリケーションエラーが
出ていたのです。
違いがわからないのですが。

Private Sub Timer1_Timer()
  Dim objExcelApp  As Workbook
  Dim strExcelFile As String
  Dim strExcelSheet As String

  strExcelFile = "C:\test.xls"
  strExcelSheet = "sheet1"
  Set objExcelApp = GetObject(strExcelFile, "Excel.Sheet")
  objExcelApp.Worksheets(strExcelSheet).PrintOut
  objExcelApp.Windows(1).Visible = True
  objExcelApp.Save
  objExcelApp.Application.Quit
  Set objExcelApp = Nothing

  Timer1.Enabled = False  
End Sub

Private Sub Data1_Change()

  Timer1.Enabled = True

End Sub

投稿時間:2005/02/14(Mon) 21:44
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^9: 既存Excel・・・
だから最初に ”ほぼそのままが気になりますが、” と書いたのですが!
Data1_Change イベントは頻繁に起きていませんか?そこに書いたのでは
Excelが起動途中に又、起動をかけているようになっているのでは?(連打している)
起動中のフラグでも設定してやれば問題なかったかも。

コードを投稿する場合等は事象が再現できるコードを投稿して頂かないと下手に
例題を上げて投稿されると今回のように解決を長引かせるだけです。

投稿時間:2005/02/15(Tue) 07:55
投稿者名:アイ
Eメール:
URL :
タイトル:
Re^10: 既存Excel・・・
おはようございます。
> だから最初に ”ほぼそのままが気になりますが、” と書いたのですが!
すみませんでした。
> Data1_Change イベントは頻繁に起きていませんか?そこに書いたのでは
> Excelが起動途中に又、起動をかけているようになっているのでは?(連打している)
> 起動中のフラグでも設定してやれば問題なかったかも。
Data1_Changeイベントは、1日に3回程度しかおこりません。
テスト段階では、こちらの思うように(クリックイベントと同じように)
外部機器から「狙って」出していました。
また、これをとらえるようなコードも途中から書いていました。
Excelの起動中に再度起動するような問題ではありません。

> コードを投稿する場合等は事象が再現できるコードを投稿して頂かないと下手に
> 例題を上げて投稿されると今回のように解決を長引かせるだけです。
大変申し訳ありませんでした。が、通信状況は見ている方々では再現できないため、
一般的な(もっとも簡単な)要素で聞いてみようと思った次第でした。

ともかく、もったいぶったような尋ね方(小出しにするような)になったのは
事実です。
申し訳ありませんでした。

投稿時間:2005/02/15(Tue) 08:58
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re:既存Excel
> Excelの起動中に再度起動するような問題ではありません。

だったら、魔界の仮面弁士さんの回答された通りだったのでは。

>そのアプリケーションで、Excel起動以外の動作を平行して行っていませんか?
>場合によっては、Excelを操作するEXEを、別途分けた方が良いかもしれません。

まあ、解決されているのだからどうでもいいですけど。

投稿時間:2005/02/15(Tue) 11:05
投稿者名:アイ
Eメール:
URL :
タイトル:
Re^12: 既存Excelファイルの印刷
お世話になります。
K.J.Kさんのご意見は大変参考にさせて頂きました。
下げて書き込めないので、これまでにしますが、

>だったら、魔界の仮面弁士さんの回答された通りだったのでは。
ですので、Re~6からその方向で考えていました。
頭が足りないという話でしたら、その通りです。

>まあ、解決されているのだから ”どうでもいい” ですけど。
そうですね・・・。

投稿時間:2005/02/15(Tue) 10:49
投稿者名:K.J.K.
Eメール:akiya@koalanet.ne.jp
URL :
タイトル:
Re: 既存Excelファイルの印刷
> 「Excelを起動してファイルを読み込み、
> 印刷する」部分をまるごとタイマーの処理にして、
> 通信経由でデータが変化する部分にはタイマーの
> EnableをTrueにしただけなのですが。

結果としてPostMessageを呼び出して、処理を他のメッセージを
受け取ったときに実行させることにし、今受け取っているメッセージ
での処理を素早く終わらせることになるので、他のメッセージを
受け取る機会が与えられることになります。

ActiveX EXEをVBで作るときには、良く使われる手法だったりします。
# API関数のPostMessageの代用としてです。
## 私だったらDDEでExcelを操作するとは思うけど。

投稿時間:2005/02/14(Mon) 12:28
投稿者名:アイ
Eメール:
URL :
タイトル:
Re^5: 既存Excelファイルの印刷
おはようございます。

> ここの印刷関係の[関連付け起動によるファイルの印刷]ではだめですか?

ありがとうございます。
週末外出(仕事ですが)していて、今確認しました。

関連づけ起動によるファイルの印刷、で印刷できました。
しかし、印刷されるのは保存された状態のSheetのようでした。
印刷はできるけど、目的のシートを、という操作はできないのでしょうね。

今は理解出来ずにこの「関連づけ起動」というのを使用させていただいて
いますが、もう少しこの一連のコードについて理解したいと思い、
現在調べています。

ともかく、ご助言ありがとうございます。