こんにちは良です。
本当にいつもお世話になっております。
環境はVB.NET2003 WinXP です。
エクセルの画面を起動してエクセルのプレビューを表示してから始めて
Visible をTrueにしたいのですがVB.NET側からのエクセルプレビュー画面の
操作がわかりません。「マクロの記録」で
ActiveWindow.SelectedSheets.PrintOut(Copies:=1, Preview:=True, Collate:=True)
というのが出てきたんですがこれを貼り付けたら「ActiveWindowが宣言
されていません」と変数扱いになってしまったんですよ。
すいませんがご教授のほうよろしくお願いいたします。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200606/06060055.txt
↑同じ方と考えて良いですか?(IPが違う。)
基本的な操作とCOMオブジェクトの解放は分かっていると解釈します。
[VB.NET]
Dim xlWindow As Excel.Window
xlWindow = xlApplication.ActiveWindow
お返事ありがとうございます!
>特攻隊長まるるうさん
そうです。同じ人です。すみません家と会社で両方でアクセスしていますのでIPアドレスが二つあるんですよ。
混同させてしまってすみません。
Dim xlWindow As Excel.Window
xlWindow = xlApplication.ActiveWindow
'印刷プレビュー画面を表示する
xlWindow.SelectedSheets.PrintOut(Preview:=True)
という風に変えてみましたがエクセル画面は起動しますが
プレビュー画面にならなかったです。
もしかしてシートに何もない場合はプレビュー画面に行かないんですか?
すみません。会社内でもパソコン変えたので
IPアドレス変わっています。なのでたぶん良の名前のIPアドレスは
三つ(会社で二つ、家で一つ)あると思います。
混同させてしまってすみません。
あと
Dim xlWindow As Excel.Window
xlWindow = xlApplication.ActiveWindow
'''印刷プレビュー画面を表示する
xlWindow.PrintPreview()
も試してみたんですが、
「System.Runtime.InteropServices.COMException' のハンドルされていない例外が mscorlib.dll で発生しました。
追加情報 : Window クラスの PrintPreview メソッドが失敗しました。」
と出てしまいました。
これはまずいでしょうか?
もしかしてシートの中身が空だから失敗したのでしょうか?
SelectedSheets も Sheets を返すので解放処理が必要な気がしますが。。。
まぁ、本題から外れるので省略します。
>もしかしてシートに何もない場合はプレビュー画面に行かないんですか?
思い当たることがあるなら質問の前に自分で実行してください。
セルに何か書き込んで、プレビュー画面に行くなら、それが原因と考えて
いいのでは?
回答者も実行結果から類推して回答しています。公式な文章が存在する
場合もありますが、エクセルの内部処理がどうなっているかはマイクロソフト
でないと分からないことですよね?質問掲示板で質問しても意味が無いと
言うか。。。マイクロソフトに聞けば?ってなります。
VBからエクセルを操作する時(というか参照設定するものは普通そうですが)は、
エクセルに用意されている既存の関数を呼び出すだけなので、エクセル側で
出来ないことは、VBからも出来ないことが多いです。
手作業で新規Bookを印刷プレビューしようとすると、
『印刷できるものはありません』
のメッセージが出て実行できないようです。その可能性は高いでしょう。
>特攻隊長まるるうさん
お返事ありがとうございます。
確かにそのとおりです。
わざわざ回答していただいてるのに
余計な手間をかけさせてしまって申し訳ございません。
質問してから自分で実行していました。
確かにエクセルで何もない状態で
プレビューを表示するを設定すると
印刷できるものはありません。
って出ました。
もう少し考えてみます。
ありがとうございました。
>もう少し考えてみます。
いや、考える必要ないって(^^;)
>セルに何か書き込んで、プレビュー画面に行くなら、それが原因と考えて
>いいのでは?
質問のプログラムを作っている人なら、デバッグする環境になってるんだから、
30秒くらいでテスト実行できるのでは???
その程度の事をやってくれないのを怒ってるだけであって、質問は
どんどんすればいいと思うよ。
Dim xlApplication As New Excel.Application
Dim xlBooks As Excel.Workbooks = xlApplication.Workbooks
'新規のファイルを開く場合
Dim xlBook As Excel.Workbook = xlBooks.Add
Dim xlSheets As Excel.Sheets = xlBook.Worksheets
Dim xlSheet As Excel.Worksheet = xlSheets.Item(1)
'xlApplication から WorkBooks を取得する
xlBooks = xlApplication.Workbooks
Dim xlRange As Excel.Range
Dim strData(3, 0) As Object
xlRange = xlSheet.Range("A8:A10") 'データの入力セル範囲
strData(0, 0) = "1000" 'データの作成
strData(1, 0) = "20000"
strData(2, 0) = "205"
strData(3, 0) = "=Sum(A8:A10)" '計算式
xlRange.Value = strData 'セルへデータの入力
☆ Dim xlWindow As Excel.Window
☆xlWindow = xlApplication.ActiveWindow
'印刷プレビュー画面を表示する
☆xlWindow.PrintPreview()
' Excel を表示する
xlApplication.Visible = True
' COM オブジェクトを解放する (正しくは COM オブジェクトを解放する を参照)
ComObjectRelease(xlSheet) 'xlSheet の解放
ComObjectRelease(xlSheets)
ComObjectRelease(xlBook)
ComObjectRelease(xlBooks)
Private Sub ComObjectRelease(ByRef objCom As Object)
明示的に COM オブジェクトへの参照を解放
Try
If Not objCom Is Nothing AndAlso System.Runtime.InteropServices. _
Marshal.IsComObject(objCom) Then
Dim I As Integer
Do
I = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
Loop Until I <= 0
End If
Catch
Finally
'参照を解除する
objCom = Nothing
End Try
End Sub
>特攻隊長まるるうさんへ
お返事ありがとうございます。
たくさん質問させていただきます!(もちろん自分で調べるだけ調べて
どうしてもわからないときに限りますが)
今おこなっているソースを乗せます。
☆のところをコメントアウトしたらちゃんとエクセルが起動して
セルに値が入っているんですが☆を解除すると
「System.Runtime.InteropServices.COMException' のハンドルされていない例外が mscorlib.dll で発生しました。
追加情報 : Window クラスの PrintPreview メソッドが失敗しました。」
がまた出てしまいました。
PrintPreviewは使えないのでしょうか?
それとも引数が必要なのでしょうか?
試しに
PrintPreview(xlsheet)
PrintPreview(xlsheets)
PrintPreview(xlbook)
とやってみましたが全部上記と同じエラーが出てしまいました。
こんばんは良です。
’エクセルを表示する
xlApplication.Visible = True
'エクセルウィンドウの生成
Dim xlWindow As Excel.Window
xlWindow = xlApplication.ActiveWindow
xlSheet.PrintOut(From:=1, Preview:=True)
にしたらできました。
でも一瞬エクセルの画面が
立ち上がってからプレビュー画面に
移動したんですがエクセル画面を一瞬立ち上がるのを
なくすことは出来ますか?
とりあえずプレビュー画面は出ましたので解決といたします。
> Dim xlBooks As Excel.Workbooks = xlApplication.Workbooks
> 〜
> 'xlApplication から WorkBooks を取得する
> xlBooks = xlApplication.Workbooks
Dim xlBooks As Excel.Workbooks = xlApplication.Workbooks
は
Dim xlBooks As Excel.Workbooks
xlBooks = xlApplication.Workbooks
のことだから
Dim xlBooks As Excel.Workbooks
xlBooks = xlApplication.Workbooks
xlBooks = xlApplication.Workbooks
ってやってる。。。(^^;)1個目の xlBooks が解放漏れとかになるかも。。。
> ComObjectRelease(xlSheet) 'xlSheet の解放
> ComObjectRelease(xlSheets)
> ComObjectRelease(xlBook)
> ComObjectRelease(xlBooks)
xlRange と xlWindow の解放をしていない。解放漏れ。
> 'エクセルウィンドウの生成
> Dim xlWindow As Excel.Window
> xlWindow = xlApplication.ActiveWindow
> xlSheet.PrintOut(From:=1, Preview:=True)
>にしたらできました。
xlWindow 必要なくなっちゃったね。削除していいんじゃない?
上にあげた所が気にならないと、[VB.NET]でエクセルは扱えません。
> '印刷プレビュー画面を表示する
> ☆xlWindow.PrintPreview()
>PrintPreviewは使えないのでしょうか?
同じ現象を確認しました…が、引数は関係なさそうです。
ヘルプに解説が無かったので、引数名の EnableChanges でWEB検索すると
> プレビューの[設定]と[余白]ボタンのみを使用不可にする場合は引数EnableChangesが利用出来ます。
という記述に行き当たりました。Boolean 型を指定するだけのようです。
エラーの原因は分かりませんでした。良さんが引数で試されているように、
確かに印刷する対象が分からないのかとも思いましたが、xlWindow で
指定できるのが本来の処理です。
http://homepage.mac.com/hideo_ito/maclib/ExcelNoCompatible.html
とか見ると、結構不明瞭なバージョン更新が行われてて、使えない関数が
あるのかも?ここはマイクロソフトに聞かないと分からないですね。
>エクセル画面を一瞬立ち上がるのをなくすことは出来ますか?
多分、できない…かなぁ。プレビューって、単独での起動は出来なくって、
エクセルブックのダイアログみたいな動きをしてるようです。手作業でプレビュー
見てる時にシート(またはブック)の編集ってできないですよね?
プログラムからの操作も似たような感じで、エクセル画面を非表示にするには
xlApplication.Visible = False
だけど、それでプレビューすると、今度は表示する処理が実行できなくなります。
…難しいと思います。
>特攻隊長まるるうさん
いつもご返事ありがとうございます!m(__)m
確かに上記のソースだと二回xlbooksを生成して
しまっていて解放作業は一回だけしか行っていないので
解放していない一回分(画面には何も表示されていないですが)
が残ってしまってパソコンを終了するときに
「エクセルを終了できません」というエラーに
なってしまったんだと思います。
xlRangeは解放作業忘れていましたので解放しました。
xlWindowは使っていないので削除しました。
プレビューを表示する作業
xlSheet.PrintOut(From:=1, Preview:=True)
の後にVisibleをtrueにしたら
やはりエラーが生じてしまいました。
いつもご回答していただきありがとうございます!
>エクセル画面を一瞬立ち上がるのをなくすことは出来ますか?
私もつい最近まったく同じことでハマリました。(VB6ですが・・・)
私の場合は、以下の手順で対応?しました。
Excel.Visible = False
〜処理〜
Excel.WindowState = 最小化 ←ポイント
Excel.Visible = True
Excel.PrintPreview
↑の手順でプレビューを行うと、Excel画面が立ち上がっていることには
変わりは無いのですが、最小化しているため、「Visible = True」でも
ユーザからは見えなくなります。(ユーザから見えないのでOKもらいました
最小化されたExcelは、PrintPreview時に最大化されます。
以上。お役に立てれば幸いです。
こんにちは良です。
>旅芸人さん
ありがとうございます!
なるほど!そういう手がありましたね。
まだ試していないのですが試しにやってみます。
ありがとうございましたm(__)m
ツイート | ![]() |