- PR -

ASP.NETでクライアントEXCELに書式設定のマクロを実行させたい

投稿者投稿内容
マサ
会議室デビュー日: 2006/02/20
投稿数: 7
投稿日時: 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>

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-20 17:05
引用:

マサさんの書き込み (2006-02-20 16:44) より:

Oracleデータを出力後に、書式設定マクロを処理できません。
また、書式設定のマクロにもいくつか処理できないものがあります。


セキュリティの関係上 (だけではないですが) いくつかサポートしていないメソッドはあります。

引用:

(4) オブジェクト解放について
 ReleaseComObjectの対応が必要が否か不明
 通常はプロセスは残りませんが、
 エラーが発生した場合に、残ってしまいます。
 例えば、マクロの途中でユーザがスペースを押してしまった場合は、
 マクロがキャンセルされるので、スクリプトエラーとなってしまいます。
 他に、起動途中でEXCELを強制終了した場合もプロセスが残ってしまいます。


絶対に ReleaseComObject メソッドを使うようにしてください。
Set obj = Nothing は、"参照" を解放しているだけです。

例外時でも確実に解放されるように、Try 〜 Finally で実装してください。
以下は参考リンクです。

  COM オブジェクトを解放する

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
マサ
会議室デビュー日: 2006/02/20
投稿数: 7
投稿日時: 2006-02-20 18:03
じゃんぬねっとさんの書き込み (2006-02-20 17:05) より:

じゃんぬねっとさん>
 早速のご返信ありがとうございます。
 色々調べてみたのですが、AとBのマクロが
 使えないような記述が見当たりませんでした。
 その為、今回質問してみることにしました。
 これについて、有力な情報をご存知でしたら、
 お教え頂けないでしょうか?

 ReleaseComObject対応は必要なのですね。
 本当にこんなことするの?と多少疑問に
 思っていたので、聞いてみました(^^;
 申し訳ありません。


 上記質問について、
 少し補足させてください。

 @のDHTMLからのDataGrid取得とVbscriptのマクロ実行は
 同じExcelシートに対して行えないのでしょうか?
 それとも記述が誤っているのでしょうか?

 大変申し訳ありませんが、
 ご教授お願い致します。m(_ _)m
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-20 18:10
引用:

マサさんの書き込み (2006-02-20 18:03) より:

ReleaseComObject対応は必要なのですね。
本当にこんなことするの?と多少疑問に
思っていたので、聞いてみました(^^;


すいません、良く見てみたら VBS なんですね。
COM オブジェクトは自動で参照カウントがデクリメントされるはずなので不要です。

VB.NET 上での COM Interop だと思っていました。orz

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
マサ
会議室デビュー日: 2006/02/20
投稿数: 7
投稿日時: 2006-02-20 19:32
引用:

すいません、良く見てみたら VBS なんですね。
COM オブジェクトは自動で参照カウントがデクリメントされるはずなので不要です。



良かったです。(笑)
try〜catch大変だなぁ〜って思ってました。。。(^^)
マサ
会議室デビュー日: 2006/02/20
投稿数: 7
投稿日時: 2006-02-21 00:41
自己レスです。
B横向きページ設定についてですが、
objExcelSheet.PageSetup.Orientation = xlLandscape
ではなく、
objExcelSheet.PageSetup.Orientation = 2
で動作しました。(1:縦、2:横)のようです。

また、@のオブジェクトが切断される件については、
あきらめて、別のシートへ作成することにしました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-21 10:24
引用:

マサさんの書き込み (2006-02-20 19:32) より:

良かったです。(笑)
try〜catch大変だなぁ〜って思ってました。。。(^^)


もともと VBS には Try 〜 Catch 〜 Finally の機構がないんですけどね。

引用:

objExcelSheet.PageSetup.Orientation = xlLandscape
ではなく、
objExcelSheet.PageSetup.Orientation = 2
で動作しました。(1:縦、2:横)のようです。


そっか、VBS だとこれらの定数が定義されていないので、自分で定義しなきゃいけないのでしたね。

ちなみに、ウインドウ枠固定って無理なような気がするのですができました?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
マサ
会議室デビュー日: 2006/02/20
投稿数: 7
投稿日時: 2006-02-21 10:37
引用:

じゃんぬねっとさんの書き込み (2006-02-21 10:24) より:
もともと VBS には Try 〜 Catch 〜 Finally の機構がないんですけどね。


そうですね(笑)
以前にじゃんぬねっとさんのHPでCOM解放拝見していました。
その後に、色々調べてたら頭がごっちゃになっちゃいました。(笑)

引用:

ちなみに、ウインドウ枠固定って無理なような気がするのですができました?


できました!ついさっき(笑)
2ちゃんねるで見つけました。

''ウインドウ枠固定
objExcelSheet.Cells(15,1).Activate
objExcel.ActiveWindow.FreezePanes = True

こんな感じです。
ずっと調べてたのに、、、調べ方悪いんですかねぇ(T-T)
昨日はActiveWindowが動かなかった気もするんですが、
上記で動作しました。

あとは、別のシートへDHTMLを出力するのが残ってますが、
なんとか、やってみます。
今回はありがとうございました。(^^)

スキルアップ/キャリアアップ(JOB@IT)