tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルExcelが正常終了出来ません
記事No1533
投稿日: 2005/03/30(Wed) 22:07
投稿者匿名希望
いつも参考にさせて頂いてます。
OSはXPと、2000で開発しています。
下記プログラムは、XPのマシンでは正常に終了しますが、
2000ですと、メモリが"read"になることは出来ませんでした。と
メッセージが出てしまいます。
行のコピーをコメントにすると、エラーは出ません。
エクセルは、Visible = True のままで、閉じずにユーザーが
印刷設定などをして、終了してもらいます。
どなたか、教えていただけませんでしょうか?
宜しくお願い致します。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
        Dim xlApp As Excel.Application
        Dim xlsSheet As Excel.Worksheet
        Dim xlsBooks As Excel.Workbooks
        Dim xlsBook As Excel.Workbook
        Dim xlsSheets As Excel.Sheets
        Dim objCells As Excel.Range
        Dim objRows As Excel.Range
        Dim R1 As Excel.Range
        Dim RCopy As Excel.Range
        Dim RPaste As Excel.Range

        xlApp = New Excel.Application

        xlsBooks = xlApp.Workbooks
        xlsBook = xlsBooks.Open("c:\Test.xls")
        xlsSheets = xlsBook.Worksheets
        xlsSheet = xlsSheets.Item(1)

        objCells = xlsSheet.Cells
        objRows = xlsSheet.Rows

        R1 = DirectCast(objCells._Default(1, 1), Excel.Range)
        R1.Value = ""
        R1.Value = Format(Today, "yyyy/MM/dd")
        System.Runtime.InteropServices.Marshal.ReleaseComObject(R1)

        RCopy = DirectCast(objRows.Rows("1:5"), Excel.Range)
        RCopy.Copy()
        RPaste = DirectCast(objRows.Rows("6:6"), Excel.Range)
        RPaste.Insert()
        System.Runtime.InteropServices.Marshal.ReleaseComObject(RCopy)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(RPaste)

        R1 = DirectCast(objCells._Default(6, 1), Excel.Range)
        R1.Value = ""
        R1.Value = Format(Today, "yyyy/MM/dd")
        System.Runtime.InteropServices.Marshal.ReleaseComObject(R1)

        System.Runtime.InteropServices.Marshal.ReleaseComObject
(objCells)                 'Cells の開放
        System.Runtime.InteropServices.Marshal.ReleaseComObject
(objRows)                 'Rows の開放

        xlApp.Visible = True

        System.Runtime.InteropServices.Marshal.ReleaseComObject
(xlsSheet)            'xlSheet の開放
        System.Runtime.InteropServices.Marshal.ReleaseComObject
(xlsSheets)           'xlSheets の開放

        System.Runtime.InteropServices.Marshal.ReleaseComObject
(xlsBook)             'xlBook の開放
        System.Runtime.InteropServices.Marshal.ReleaseComObject
(xlsBooks)            'xlBooks の開放

        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)              'xlApp
を開放


    End Sub

[ツリー表示へ]
タイトルRe: Excelが正常終了出来ません
記事No1534
投稿日: 2005/03/30(Wed) 23:21
投稿者魔界の仮面弁士
> メモリが"read"になることは出来ませんでした。

この部分に関しては見当がつきませんが……。


> objRows = xlsSheet.Rows
> RCopy = DirectCast(objRows.Rows("1:5"), Excel.Range)

上記では、「objRows.Rows("1:5")」のあたりが怪しい気がします。
かわりに、Rangeプロパティや_Defaultプロパティの利用を検討してみてください。

RangeオブジェクトのRowsプロパティやColumnsプロパティは、
Cellsプロパティ同様、「引数を取らない」仕様になっていますので、
X = R.Rows  なら良いですが、 X = R.Rows("1:2") のような構文は、
ReleaseComObject できないオブジェクトを生成する結果になるかと。

[ツリー表示へ]
タイトルRe^2: Excelが正常終了出来ません
記事No1535
投稿日: 2005/03/30(Wed) 23:42
投稿者匿名希望
[OSのVer]:Windows    [VBのVer]:VB.NET  
早速のご回答、有難うございます。
早速試してみます。

[ツリー表示へ]
タイトル本当に有難う御座いました。上手く出来ました
記事No1536
投稿日: 2005/03/31(Thu) 00:05
投稿者匿名希望
        コピーの所を、下記に修正しましたら、正常に出来ました。
     本当に有難う御座いました。
     vb6 でエクセルをコピーするときには Rows を使用していたので、
        範囲に指定が上手くいかずに、そのまま Rows を使用していのが、
        まずかったのですね。有難う御座いました。
        
        R1 = DirectCast(objCells._Default(1, 1), Excel.Range)
        R2 = DirectCast(objCells._Default(4, 3), Excel.Range)
        RCopy = xlsSheet.Range(R1, R2)
        RCopy.Copy()
        RPaste = DirectCast(objCells._Default(6, 1), Excel.Range)
        RPaste.Insert()

        System.Runtime.InteropServices.Marshal.ReleaseComObject(R1)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(R2)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(RCopy)
        System.Runtime.InteropServices.Marshal.ReleaseComObject(RPaste)

[ツリー表示へ]