- - PR -
ASP.NETでクライアントEXCELに書式設定のマクロを実行させたい
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-02-20 16:44
はじめまして。いつも参考にさせて頂いています。
ASP.NET/vbscriptの開発を行っています。 OracleのデータをクライアントのEXCELに出力し、 書式設定をマクロで行おうと思っています。 OracleデータをEXCEL出力するのみなら、できていますが、 Oracleデータを出力後に、書式設定マクロを処理できません。 また、書式設定のマクロにもいくつか処理できないものがあります。 その他、エラー時の処理もわかりません。 ご存知の方いらっしゃいましたら、何卒ご教授願います。 -- 実現できていないこと -------------------------------------------------------- @DataGrid取得後のオブジェクト生成 エラー内容:起動されたオブジェクトはクライアントから切断されました。 Aウインドウ枠固定 FreezePanesを使用すると、以下のエラーが表示されます。 エラー内容:オブジェクトでサポートされていないプロパティまたはメソッドです。 B横向きページ設定 Orientationを使用すると、以下のエラーが表示されます。 エラー内容:PageSetupクラスのOrientationプロパティを設定できません。 Cオブジェクト解放について ReleaseComObjectの対応が必要が否か不明 通常はプロセスは残りませんが、 エラーが発生した場合に、残ってしまいます。 例えば、マクロの途中でユーザがスペースを押してしまった場合は、 マクロがキャンセルされるので、スクリプトエラーとなってしまいます。 他に、起動途中でEXCELを強制終了した場合もプロセスが残ってしまいます。 -------------------------------------------------------------------------------- -- 環境 -------------------------------------- OS :Windows2000(CL)/Windows2003(SV) DB racle9i(SV) 言語 :ASP.NET/vbscript EXCEL :EXCEL2000 9.0.6926 SP3(CL) CL:クライアント、SV:サーバ --------------------------------------------- <script language="vbscript"> On Error Resume Next Dim sHTML set objExcel = CreateObject("Excel.Application") set objBook = objExcel.WorkBooks.Add ''DHTMLでDataGridの値をクライアントで取得 objBook.HTMLProject.HTMLProjectItems("Sheet1").Text = window.parent.frames("contents").document.forms("Form1").children("dataDataGrid1").outerhtml objBook.HTMLProject.RefreshDocument ''更新ボタンを表示しない objExcel.Visible = true ''EXCEL表示設定 ''objExcel.UserControl = True '' @ ''ワークシートオブジェクトの生成 set objExcelSheets = objBook.Worksheets set objExcelSheet = objBook.Sheets(1) objExcelSheet.Activate objExcel.DisplayAlerts = False ''確認メッセージを出さない ''レイアウト設定 ''列の幅 objExcelSheet.Columns("A:A").ColumnWidth = 3.88 ''行の高さ objExcelSheet.Rows("1:10").RowHeight = 13.5 ''色設定 objExcelSheet.Range("A11:L14").Interior.ColorIndex = 15 A ''ウインドウ枠固定 → 実現できていない objExcelSheet.Range("A15").Select objExcelSheet.ActiveWindow.FreezePanes = True ''objExcelSheet.FreezePanes = True ''ActiveWindow.FreezePanes = True ''フォントサイズ設定 ''objExcelSheet.Application.StandardFontSize = "10" ''不採用 objExcelSheet.Range("A1:L14").Font.Size = 9 objExcelSheet.Range("A15:L4010").Font.Size = 10 ''印刷設定 B ''横向き印字 → 実現していない objExcelSheet.PageSetup.Orientation = xlLandscape ''ヘッダ/フッタ設定 objExcelSheet.PageSetup.CenterHeader = "&""MS Pゴシック,太字""&14帳票タイトル" objExcelSheet.PageSetup.CenterFooter = "&P/&N" objExcelSheet.PageSetup.RightHeader = "&D &T" ''シート(行タイトル)設定 objExcelSheet.PageSetup.PrintTitleRows = "$1:$14" ''余白設定 objExcelSheet.PageSetup.LeftMargin = objExcel.CentimetersToPoints(1) objExcelSheet.PageSetup.RightMargin = objExcel.CentimetersToPoints(1) objExcelSheet.PageSetup.TopMargin = objExcel.CentimetersToPoints(2) objExcelSheet.PageSetup.BottomMargin = objExcel.CentimetersToPoints(2.5) objExcelSheet.PageSetup.HeaderMargin = objExcel.CentimetersToPoints(1.3) objExcelSheet.PageSetup.FooterMargin = objExcel.CentimetersToPoints(1.3) ''印刷、プレビュー設定 ''objExcelSheet.PrintPreview 'プレビュー 'objExcelSheet.PrintOut '印刷 ''処理終了 ''objExcel.Quit C ''オブジェクトの解放 set objExcelsheets = nothing set objExcelsheet = nothing set objBook = nothing set objExcel = nothing ''エラー処理 If Err.Number <> 0 Then Call MsgBox("下記のエラーが発生しました。管理者に通知して下さい" & Chr(13) & Chr(10) & _ " No :" & Err.Number & Chr(13) & Chr(10) & _ " 内容 :" & Err.Description & Chr(13) & Chr(10) & _ " 発生元 :" & Err.Source) End If On Error GoTo 0 </script> | ||||||||
|
投稿日時: 2006-02-20 17:05
セキュリティの関係上 (だけではないですが) いくつかサポートしていないメソッドはあります。
絶対に ReleaseComObject メソッドを使うようにしてください。 Set obj = Nothing は、"参照" を解放しているだけです。 例外時でも確実に解放されるように、Try 〜 Finally で実装してください。 以下は参考リンクです。 COM オブジェクトを解放する _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-02-20 18:03
じゃんぬねっとさんの書き込み (2006-02-20 17:05) より:
じゃんぬねっとさん> 早速のご返信ありがとうございます。 色々調べてみたのですが、AとBのマクロが 使えないような記述が見当たりませんでした。 その為、今回質問してみることにしました。 これについて、有力な情報をご存知でしたら、 お教え頂けないでしょうか? ReleaseComObject対応は必要なのですね。 本当にこんなことするの?と多少疑問に 思っていたので、聞いてみました(^^; 申し訳ありません。 上記質問について、 少し補足させてください。 @のDHTMLからのDataGrid取得とVbscriptのマクロ実行は 同じExcelシートに対して行えないのでしょうか? それとも記述が誤っているのでしょうか? 大変申し訳ありませんが、 ご教授お願い致します。m(_ _)m | ||||||||
|
投稿日時: 2006-02-20 18:10
すいません、良く見てみたら VBS なんですね。 COM オブジェクトは自動で参照カウントがデクリメントされるはずなので不要です。 VB.NET 上での COM Interop だと思っていました。orz _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-02-20 19:32
良かったです。(笑) try〜catch大変だなぁ〜って思ってました。。。(^^) | ||||||||
|
投稿日時: 2006-02-21 00:41
自己レスです。
B横向きページ設定についてですが、 objExcelSheet.PageSetup.Orientation = xlLandscape ではなく、 objExcelSheet.PageSetup.Orientation = 2 で動作しました。(1:縦、2:横)のようです。 また、@のオブジェクトが切断される件については、 あきらめて、別のシートへ作成することにしました。 | ||||||||
|
投稿日時: 2006-02-21 10:24
もともと VBS には Try 〜 Catch 〜 Finally の機構がないんですけどね。
そっか、VBS だとこれらの定数が定義されていないので、自分で定義しなきゃいけないのでしたね。 ちなみに、ウインドウ枠固定って無理なような気がするのですができました? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-02-21 10:37
そうですね(笑) 以前にじゃんぬねっとさんのHPでCOM解放拝見していました。 その後に、色々調べてたら頭がごっちゃになっちゃいました。(笑)
できました!ついさっき(笑) 2ちゃんねるで見つけました。 ''ウインドウ枠固定 objExcelSheet.Cells(15,1).Activate objExcel.ActiveWindow.FreezePanes = True こんな感じです。 ずっと調べてたのに、、、調べ方悪いんですかねぇ(T-T) 昨日はActiveWindowが動かなかった気もするんですが、 上記で動作しました。 あとは、別のシートへDHTMLを出力するのが残ってますが、 なんとか、やってみます。 今回はありがとうございました。(^^) |