天使と悪魔選手権

VB初心者です。
VB2010からExcel操作をして帳票印刷をするコードを考えています。
色々調べた結果、下記のようなコードに行き着きました。

(その他のExcel操作コード)

'罫線設定

Dim xlBorders As Excel.Borders
Dim xlBorder As Excel.Border

xlBorders = xlSheet.Range(xlCells(2, 5), xlCells(3, 20)).Borders
xlBorder = xlBorders(Excel.XlBordersIndex.xlEdgeBottom)
xlBorders.LineStyle = Excel.XlLineStyle.xlDouble

xlSheets.PrintOut()
If Not xlBorder Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBorder)
If Not xlBorders Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBorders)

(その他のExcel開放コード)
このままですと選択された範囲全てのセルが格子状に二重線になってしまいます。
選択範囲の下辺のみ罫線を引くのはどの様にしたらいいでしょうか?

またこの罫線コードを追加すると『EXCEL.EXE』がプロセスに残ってしまいます。

この2点ご教授お願いします。

A 回答 (4件)

> 上記のご指摘ですと


> System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells(2, 5))
> System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells(3, 20))
> System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet.Range(xlCells(2, 5), xlCells(3, 20)))
> のような感じでいいんでしょうか?
違います。
COM由来のオブジェクトは,必ず変数に代入して,使用しなくなったらReleaseComObjectします。

' assume: Option Infer On / Imports System.Runtime.InteropServices
Dim cel11 = xlCells(2, 5)
Dim cell2 = xlCells(3, 20)
Dim range = xlSheet.Range(cell1, cell2)
' ...
If cell1 IsNot Nothing Then Marshal.ReleaseComObject(cell1)
If cell2 IsNot Nothing Then Marshal.ReleaseComObject(cell2)
If range IsNot Nothing Then Marshal.ReleaseComObject(range)
    • good
    • 0

> xlBorders = xlSheet.Range(xlCells(2, 5), xlCells(3, 20)).Borders


・xlCells(2, 5)の戻り値
・xlCells(3, 20)の戻り値
・xlSheet.Range(xlCells(2, 5), xlCells(3, 20))の戻り値
が,Marshal.ReleaseComObjectされていません。
これらもMarshal.ReleaseComObjectで解放する必要があります。

この回答への補足

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

なにぶん基礎知識のないまま、独学とネット情報のみでコーディングしていますのですいません

上記のご指摘ですと
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells(2, 5))
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells(3, 20))
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet.Range(xlCells(2, 5), xlCells(3, 20)))

のような感じでいいんでしょうか?

実際のコードでは、xlCells()の部分で変数を使ってループさせているのですが、そのつどの開放が必要なんでしょうか?

ご教授お願いします

補足日時:2012/12/19 08:16
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/12/19 08:22

プロセスが残る件



エクセル解放前に、エクセルを終了するコマンド(Quit)を実行して下さい。また、終了時に「ブックを保存しますか?」と問い合わせ有るかと思います。そのメッセージが不要で有れば、メッセージ出力有効又は無効にするコマンドがあります。それを無効ににして下さい。

罫線に関しては、エクセルのキーボードマクロの登録を使って記録するとVBAが作成されます。それを活用すれば答えはわかると思います。

補足
実機が無いため具体的なコマンドがわかりませんので自己解決するか、他の方に問い合わせて下さい。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
エクセルを終了するコマンド(Quit)はすでに使用していて、罫線の部分を追加するとプロセスが残ってしまうようなのです。
もう少し調べてみます。

お礼日時:2012/12/19 08:20

試してないからわからないけど


xlBorders = xlSheet.Range(xlCells(2, 5), xlCells(3, 20)).Borders
の Range が参照されっぱなしとか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
もう少し調べて検証したいと思います。

お礼日時:2012/12/19 08:21

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