tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル罫線を引いた時エクセル解放が出来ません
記事No11570
投稿日: 2016/01/04(Mon) 16:12
投稿者SUZUKI
vb6.0からvb2005に変換挑戦中の鈴木です
エクセルの罫線を引いた時エクセルが残ってしまうのに悩まされています
多分 boderの解放がうまく行かないからとは思っているのですが
そのやり方が色々調べてもうまく行きません
プログラムはB2からB5まで罫線を引こうとしています

Public Class Form1
    Const xlEdgeLeft As Short = 7
    Const xlContinuous As Short = 1
    Const xlThin As Short = 2
    Const xlAutomatic As Short = -4105
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim oExcel As Object = CreateObject("Excel.Application")
        Dim oBooks As Object = oExcel.Workbooks
        Dim oBook As Object = oBooks.open("c:\test.xls")
        Dim oSheets As Object = oBook.Worksheets
        Dim oSheet1 As Object = oSheets("sheet1")
     '   GoTo LABELA
        Dim oRange = oSheet1.RANGE("B2:B5")
        With oRange.Borders(xlEdgeLeft)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        '   MRComObject(oRange.borders) これを入れるBORDERSが無いというエラーになる
        MRComObject(oRange)
LABELA:
        oExcel.Application.DisplayAlerts = False  '保存しますか?を表示しない
        oSheet1.SaveAs("c:\test.xls") 'ファイル保存

        MRComObject(oSheet1, False)
        oExcel.DisplayAlerts = True '非表示を元に戻す
        MRComObject(oSheets, True)
        oBook.Close(False)
        MRComObject(oBook, True)
        MRComObject(oBooks, True)
        oExcel.Quit()
        MRComObject(oExcel, True)
        MessageBox.Show("エクセル出力しました")
    End Sub

あたりまえですが 文中の
GOTO LABELA を入れるとうまく終了します
新年早々で申し訳ありませんが、よろしくお願いします

[ツリー表示へ]
タイトルRe: 罫線を引いた時エクセル解放が出来ません
記事No11571
投稿日: 2016/01/04(Mon) 17:28
投稿者花ちゃん
>         With oRange.Borders(xlEdgeLeft)
>             .LineStyle = xlContinuous
>             .Weight = xlThin
>             .ColorIndex = xlAutomatic
>         End With

Borders は、COM オブジェクトです。
http://hanatyan.sakura.ne.jp/dotnet/excel10.htm
COM オブジェクトは、一旦変数に受けてから使用しないと解放処理ができません。

>         With oRange.Borders(xlEdgeLeft)
>             .LineStyle = xlContinuous

は、oRange.Borders(xlEdgeLeft).LineStyle = xlContinuous と書いているのと同じ事で
COM オブジェクトを使って、このように、oRange.Borders(xlEdgeLeft).LineStyle [.] が2個つながるような
場合は、一旦変数に受けて使用しないと MRComObject(oRange.borders) のような事では当然解放処理が
できません。(特に、Borders には注意が必要です。)
下記をご覧下さい。
http://hanatyan.sakura.ne.jp/dotnet/Excel06.htm#no2
http://hanatyan.sakura.ne.jp/vb2005/vb2013excel03.htm#no17
 
できましたら、下記 [Excel のプロセスが正常に終了しない理由]を読んでおいて下さい。
http://hanatyan.sakura.ne.jp/vb2005/vb2013excel01.htm#no2

[ツリー表示へ]
タイトルRe^2: 罫線を引いた時エクセル解放が出来ません
記事No11572
投稿日: 2016/01/05(Tue) 10:53
投稿者SUZUKI
> Borders は、COM オブジェクトです。
>  http://hanatyan.sakura.ne.jp/dotnet/excel10.htm
> COM オブジェクトは、一旦変数に受けてから使用しないと解放処理ができません。
>
> >         With oRange.Borders(xlEdgeLeft)
> >             .LineStyle = xlContinuous
>
> は、oRange.Borders(xlEdgeLeft).LineStyle = xlContinuous と書いているのと同じ事で
> COM オブジェクトを使って、このように、oRange.Borders(xlEdgeLeft).LineStyle [.] が2個つながるような
> 場合は、一旦変数に受けて使用しないと MRComObject(oRange.borders) のような事では当然解放処理が
> できません。(特に、Borders には注意が必要です。)

回答ありがとうございます
[.]が2つあるというのは非常に参考になりました

環境が VB2005 EXCEL2003 で環境が異なるため
    Dim xlRange As Excel.Range
    Dim xlBorders As Excel.Borders
    Dim xlBorder As Excel.Border
を定義するとエラーとなります
そのため避けていた所がありした
これからじっくり読ませていただきます

[ツリー表示へ]
タイトルRe^3: 罫線を引いた時エクセル解放が出来ません
記事No11573
投稿日: 2016/01/05(Tue) 13:18
投稿者花ちゃん
> 環境が VB2005 EXCEL2003 で環境が異なるため
>     Dim xlRange As Excel.Range
>     Dim xlBorders As Excel.Borders
>     Dim xlBorder As Excel.Border
> を定義するとエラーとなります

実行時バインディング(レイトバインディング)で使用されているからです。


前回の質問の時にも書きましたが
ご自分で問題点が解らないようなら、いきなり参照設定なしのコードで作成せず
参照設定して動作確認したコードを書き換えるようにして下さい
開発環境は、参照設定をして、事前バインディング(アーリーバインディング)で使用し、
Option Strict On に設定して使用するようにして下さい。

そうすれば、自動メンバー表示などのインテリセンス機能が働きミスが少なく済み、インテリセンス機能で
表示しないようなコードを使わなければ、未解放等も防げます。
又、ここのサイトのサンプルがそのまま使用できます。
理解しないまま、レイトバインディングでのコードを書いておられると結局躓き、自分で原因も解らず
余計時間がかかってしまう結果になるかと。 

EXCEL2003 はともかく、VB2005 は最新版等が無料で提供されていますので、VB2012 以降を使用するように
して下さい。

[ツリー表示へ]
タイトルRe^4: 参照設定導入します
記事No11576
投稿日: 2016/01/05(Tue) 17:21
投稿者SUZUKI
>
> 前回の質問の時にも書きましたが
> ご自分で問題点が解らないようなら、いきなり参照設定なしのコードで作成せず
> 参照設定して動作確認したコードを書き換えるようにして下さい
> 開発環境は、参照設定をして、事前バインディング(アーリーバインディング)で使用し、
> Option Strict On に設定して使用するようにして下さい。
>
ご指摘、ありがとうございます
この際、参照設定の開発環境も構築したいと思います
エクセルのバージョンの影響受けやすいという事で
参照設定無しでやって来ましたが方針を改めたいと思います

[ツリー表示へ]
タイトルRe: 罫線を引いた時エクセル解放が出来ません
記事No11574
投稿日: 2016/01/05(Tue) 16:05
投稿者魔界の仮面弁士
本題は管理人さんにお任せするとして:


> vb6.0からvb2005に変換挑戦中の鈴木です
ちなみに 2005 のサポート期限は、

  2011/04/12 メインストリームサポート終了日
  2016/04/12    延長サポート終了日

であり、こちらも寿命が近いです。
今のうちに、最新版である VB2015 の学習も並行で行っておくことをお奨めします。



> エクセルの罫線を引いた時エクセルが残ってしまうのに悩まされています
開発環境(コンパイル環境)および実行環境における
Excel のバージョンも気を配っておいて下さい。たとえば:

Workbook オブジェクトの PrintOut メソッド
 → Excel 97 までは引数 7 つ
 → Excel 2000 からは引数 8 つ
 → Excel 2013 からは引数 9 つ

のように、バージョンによってタイプライブラリの定義が微妙に異なるです。
(複数バージョンに対応したコードも書けますが、それなりに面倒です)



>     Const xlEdgeLeft As Short = 7
>     Const xlContinuous As Short = 1
>     Const xlThin As Short = 2
>     Const xlAutomatic As Short = -4105

レイトバインドで書くとすれば、これらの定数は As Integer とします。
COM の ENUM は、基本的に VT_I4 (VarEnum.VT_I4 相当) のはずなので。


> oExcel.Application.DisplayAlerts = False  '保存しますか?を表示しない
> oExcel.DisplayAlerts = True '非表示を元に戻す

表記ゆれがあるようですが、この場合は後者の方が適切かと。

VB6 であれ VB.NET であれ VBA であれ、
『CreateObject("Excel.Application")』あるいは
『New Excel.Application』をおこなったのであれば、
.Application プロパティの出番は無いでしょう。

[ツリー表示へ]
タイトルRe^2: 罫線を引いた時エクセル解放が出来ません(解決)
記事No11582
投稿日: 2016/01/08(Fri) 10:30
投稿者SUZUKI
> > vb6.0からvb2005に変換挑戦中の鈴木です
> ちなみに 2005 のサポート期限は、
>
>   2011/04/12 メインストリームサポート終了日
>   2016/04/12    延長サポート終了日
>
> であり、こちらも寿命が近いです。
> 今のうちに、最新版である VB2015 の学習も並行で行っておくことをお奨めします。

回答 ありがとうございます
自動変換も利用しているのでVB2005ですが
変換が終わればVB2015ですか道のりは長いです
一応 参照設定でやっていくという事で解決とさせて頂きます

[ツリー表示へ]