C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: VB.NET cells sort処理


(過去ログ 50 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■27364 / inTopicNo.1)  VB.NET cells sort処理
  
□投稿者/ ando (1回)-(2008/11/04(Tue) 17:35:37)

分類:[VB.NET/VB2005 以降] 

2008/11/04(Tue) 18:17:18 編集(投稿者)
2008/11/04(Tue) 17:53:28 編集(投稿者)
2008/11/04(Tue) 17:48:21 編集(投稿者)
2008/11/04(Tue) 17:47:05 編集(投稿者)
2008/11/04(Tue) 17:46:49 編集(投稿者)

VB.NETにてcells().Sort処理を行っていますが、
Excelプロセスが残ってしまいます。

Dim oExcel As New Microsoft.Office.Interop.Excel.Application
Dim oBooks As Microsoft.Office.Interop.Excel.Workbooks
Dim oBook As Microsoft.Office.Interop.Excel.Workbook
Dim oShts As Microsoft.Office.Interop.Excel.Sheets
Dim p_oSht As Microsoft.Office.Interop.Excel.Worksheet

With oExcel
oBooks = .Workbooks
'Excelブックを開く
.DisplayAlerts = False
oBook = oBooks.Open(Filename:=p_sExcelName, ReadOnly:=False, Notify:=False)
oShts = oBook.Worksheets
.DisplayAlerts = True
End With

p_oSht =DirectCast(oShts(1),Microsoft.Office.Interop.Excel.Worksheet)

p_oSht.Cells(18, 1).Sort( _
Key1:=p_oSht.Cells(18, 9), _
Order1:=Microsoft.Office.Interop.Excel.XlSortOrder.xlAscending, _
Header:=Microsoft.Office.Interop.Excel.XlYesNoGuess.xlYes, _
SortMethod:=Microsoft.Office.Interop.Excel.XlSortMethod.xlPinYin)

oExcel.IgnoreRemoteRequests = True
oBook.Save()
oExcel.IgnoreRemoteRequests = False

'解放処理
System.Runtime.InteropServices.Marshal.ReleaseComObject(p_oSht)
p_oSht = Nothing
System.Runtime.InteropServices.Marshal.ReleaseComObject(oShts)
oShts = Nothing
If Not (oBook Is Nothing) Then
oBook.Close()
End If
System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook)
oBook = Nothing
System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks)
oBooks = Nothing
If Not (oExcel Is Nothing) Then
oExcel.Quit()
End If
System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel)
oExcel = Nothing
System.GC.Collect()

VB6とは方法が異なるのでしょうか?

引用返信 編集キー/
■27366 / inTopicNo.2)  Re[1]: VB.NET cells sort処理
□投稿者/ Jitta on the way (210回)-(2008/11/04(Tue) 18:33:56)
No27364 (ando さん) に返信
> 2008/11/04(Tue) 18:17:18 編集(投稿者)
> 2008/11/04(Tue) 17:53:28 編集(投稿者)
> 2008/11/04(Tue) 17:48:21 編集(投稿者)
> 2008/11/04(Tue) 17:47:05 編集(投稿者)
> 2008/11/04(Tue) 17:46:49 編集(投稿者)
>
> VB.NETにてcells().Sort処理を行っていますが、
> Excelプロセスが残ってしまいます。
>
> Dim oExcel As New Microsoft.Office.Interop.Excel.Application
> Dim oBooks As Microsoft.Office.Interop.Excel.Workbooks
> Dim oBook As Microsoft.Office.Interop.Excel.Workbook
> Dim oShts As Microsoft.Office.Interop.Excel.Sheets
> Dim p_oSht As Microsoft.Office.Interop.Excel.Worksheet
>
> With oExcel
> oBooks = .Workbooks
> 'Excelブックを開く
> .DisplayAlerts = False
> oBook = oBooks.Open(Filename:=p_sExcelName, ReadOnly:=False, Notify:=False)
> oShts = oBook.Worksheets
> .DisplayAlerts = True
> End With
>
> p_oSht =DirectCast(oShts(1),Microsoft.Office.Interop.Excel.Worksheet)
>
> p_oSht.Cells(18, 1).Sort( _
> Key1:=p_oSht.Cells(18, 9), _
> Order1:=Microsoft.Office.Interop.Excel.XlSortOrder.xlAscending, _
> Header:=Microsoft.Office.Interop.Excel.XlYesNoGuess.xlYes, _
> SortMethod:=Microsoft.Office.Interop.Excel.XlSortMethod.xlPinYin)

ここで、cells が残ってしまいますよね?
引用返信 編集キー/
■27367 / inTopicNo.3)  Re[2]: VB.NET cells sort処理
□投稿者/ ando (3回)-(2008/11/04(Tue) 18:49:41)
2008/11/04(Tue) 19:02:32 編集(投稿者)
2008/11/04(Tue) 19:01:49 編集(投稿者)
No27366 (Jitta on the way さん) に返信
> ■No27364 (ando さん) に返信
>>2008/11/04(Tue) 18:17:18 編集(投稿者)
>>2008/11/04(Tue) 17:53:28 編集(投稿者)
>>2008/11/04(Tue) 17:48:21 編集(投稿者)
>>2008/11/04(Tue) 17:47:05 編集(投稿者)
>>2008/11/04(Tue) 17:46:49 編集(投稿者)
>>
>>VB.NETにてcells().Sort処理を行っていますが、
>>Excelプロセスが残ってしまいます。
>>
>>Dim oExcel As New Microsoft.Office.Interop.Excel.Application
>>Dim oBooks As Microsoft.Office.Interop.Excel.Workbooks
>>Dim oBook As Microsoft.Office.Interop.Excel.Workbook
>>Dim oShts As Microsoft.Office.Interop.Excel.Sheets
>>Dim p_oSht As Microsoft.Office.Interop.Excel.Worksheet
>>
>>With oExcel
>> oBooks = .Workbooks
>> 'Excelブックを開く
>> .DisplayAlerts = False
>> oBook = oBooks.Open(Filename:=p_sExcelName, ReadOnly:=False, Notify:=False)
>> oShts = oBook.Worksheets
>> .DisplayAlerts = True
>> End With
>>
>>p_oSht =DirectCast(oShts(1),Microsoft.Office.Interop.Excel.Worksheet)
>>
>>p_oSht.Cells(18, 1).Sort( _
>>Key1:=p_oSht.Cells(18, 9), _
>>Order1:=Microsoft.Office.Interop.Excel.XlSortOrder.xlAscending, _
>>Header:=Microsoft.Office.Interop.Excel.XlYesNoGuess.xlYes, _
>>SortMethod:=Microsoft.Office.Interop.Excel.XlSortMethod.xlPinYin)
>
> ここで、cells が残ってしまいますよね?
残らない方法はどのようにすればよいでしょうか?
試したのは、Rangeオブジェクトを用意して
oRange = p_oSht.Cells
oRange1 = oRange(18,1)
oRange2 = oRange(18,9)
oRange1.sort( _
Key1:=oRange2, _
Order1:=Microsoft.Office.Interop.Excel.XlSortOrder.xlAscending, _
Header:=Microsoft.Office.Interop.Excel.XlYesNoGuess.xlYes, _
SortMethod:=Microsoft.Office.Interop.Excel.XlSortMethod.xlPinYin)

上記、処理後に解放処理を行ったのですが
うまくいきませんでした。。

引用返信 編集キー/
■27368 / inTopicNo.4)  Re[3]: VB.NET cells sort処理
□投稿者/ Jitta on the way (211回)-(2008/11/04(Tue) 19:50:53)
No27367 (ando さん) に返信

> oRange1 = p_oSht.Cells(18,1)
> oRange2 = p_oSht.Cells(18,9)

は、試されました?
引用返信 編集キー/
■27381 / inTopicNo.5)  Re[4]: VB.NET cells sort処理
□投稿者/ 魔界の仮面弁士 (886回)-(2008/11/05(Wed) 09:14:07)
2008/11/05(Wed) 10:37:36 編集(投稿者)

No27364 (ando さん) に返信
>>>>> p_oSht.Cells(18, 1).Sort( _
>>>>> Key1:=p_oSht.Cells(18, 9), _
ここが原因だと思います。


No27364 (ando さん) に返信
>>> oRange = p_oSht.Cells
>>> oRange1 = oRange(18,1)
>>> oRange2 = oRange(18,9)
>>> oRange1.sort( _
>>> Key1:=oRange2, _
修正の方向性としては、それで良いと思います。

変数に受けたからには、もちろんその後で、oRange/oRange1/oRange2 に対して、
Marshal.ReleaseComObject メソッドを呼び出しているのですよね?

通常はそれだけで(GC.Collect せずとも)正しく解放されるはずですが、
それでも駄目なのであれば、Marshal.ReleaseComObject の戻り値が
0 になったかどうかを確認してみてください。
(内部的な型変換が発生した時に、参照カウントが増加する事があるので)


No27368 (Jitta on the way さん) に返信
>> oRange1 = p_oSht.Cells(18,1)
>> oRange2 = p_oSht.Cells(18,9)
> は、試されました?

おそらく、それはもっとマズイように思えます。
Cells は「引数の無いプロパティ」であり、上記は、
 oRange1 = p_oSht.Cells._Default(18,1)
 oRange2 = p_oSht.Cells._Default(18,9)
の意味になってしまいますから。
引用返信 編集キー/
■27386 / inTopicNo.6)  Re[5]: VB.NET cells sort処理
□投稿者/ ando (4回)-(2008/11/05(Wed) 10:59:16)
2008/11/05(Wed) 12:16:53 編集(投稿者)
2008/11/05(Wed) 12:15:57 編集(投稿者)
2008/11/05(Wed) 11:01:59 編集(投稿者)
No27381 (魔界の仮面弁士 さん) に返信
> 2008/11/05(Wed) 10:37:36 編集(投稿者)
>
> ■No27364 (ando さん) に返信
> >>>>> p_oSht.Cells(18, 1).Sort( _
> >>>>> Key1:=p_oSht.Cells(18, 9), _
> ここが原因だと思います。
>
>
> ■No27364 (ando さん) に返信
> >>> oRange = p_oSht.Cells
> >>> oRange1 = oRange(18,1)
> >>> oRange2 = oRange(18,9)
> >>> oRange1.sort( _
> >>> Key1:=oRange2, _
> 修正の方向性としては、それで良いと思います。
>
> 変数に受けたからには、もちろんその後で、oRange/oRange1/oRange2 に対して、
> Marshal.ReleaseComObject メソッドを呼び出しているのですよね?
>
> 通常はそれだけで(GC.Collect せずとも)正しく解放されるはずですが、
> それでも駄目なのであれば、Marshal.ReleaseComObject の戻り値が
> 0 になったかどうかを確認してみてください。
> (内部的な型変換が発生した時に、参照カウントが増加する事があるので)


No27381 (魔界の仮面弁士 さん) に返信

上記方法にてExcelプロセスも解放され上手くいきました。
処理は以下のように修正しました。
oRange = p_oSht.Cells
oRange1 = oRange(ROW_STA_ALM_PST_SMR_RPT, CLM_STA_ALM_PST_SMR_RPT)
oRange2 = oRange(ROW_STA_ALM_PST_SMR_RPT, 9)
oRange1.Sort( _
Key1:=oRange2, _
Order1:=Microsoft.Office.Interop.Excel.XlSortOrder.xlAscending, _
Header:=Microsoft.Office.Interop.Excel.XlYesNoGuess.xlYes, _
Orientation:=Microsoft.Office.Interop.Excel.XlSortOrientation.xlSortColumns, _
SortMethod:=Microsoft.Office.Interop.Excel.XlSortMethod.xlPinYin)

System.Runtime.InteropServices.Marshal.ReleaseComObject(oRange)
System.Runtime.InteropServices.Marshal.ReleaseComObject(oRange1)
System.Runtime.InteropServices.Marshal.ReleaseComObject(oRange2)
oRange = Nothing
oRange1 = Nothing
oRange2 = Nothing


上記処理にて、Orientation:を指定しないと列ソートに
なってしまうようです。

ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -