|
■No84606 (makoto さん) に返信 >>>> 面倒でも「Option Strict On」付きでコンパイルされることをお奨めします。 >>> ご指摘ありがとうございます。Option Strict On」は宣言はしています。 >> Option Explicit On と混同していた…という可能性は無いでしょうか? > 申し訳ございません。「Option Explicit off」になっていました。
いや Explicit も On にするべきですが(既定値は On) 私が指摘しているのは Strict の方です(既定値は Off)。
> ●Excel操作共通クラス > ▼主要メンバ クラスにカプセル化するなら、Excel 関連のオブジェクトは Private にしておいた方が安全です。
Public で直接公開すると、クラス外部から差し替えられたり、 参照カウントを増加させられてしまうといった弊害が生じかねません。
(とはいえ、現在の設計を大きく変えるのは難しいかもしれませんが)
■No84607 (makoto さん) に返信 > ExcelSheet.Cells._Default(5, 97) = データベースから取得した値
No84596 での修正案をもう一度読み返してみてください。 ExcelSheet.Cells._Default(5, 97) はアウトです。
Excel.Range オブジェクトを引数に受け取り、それを解放する必要があります。 たとえばこんな感じです。
===== 修正案1 ===== ' Range プロパティで、1 セルだけを示す Range オブジェクトを取得 Dim r As Excel.Range = ExcelSheet.Range("CS5") ' Value プロパティ等で値を設定 r.Value = データベースから取得した値 ' Range オブジェクトを解放 Marshal.ReleaseComObject(r) r = Nothing
===== 修正案2 ===== 'Cells プロパティから、シート上の全セルを示す Range オブジェクトを取得 Dim r1 As Excel.Range = ExcelSheet.Cells 'そこから 5行97列目だけを示す Range オブジェクトを取得 Dim r2 As Excel.Range = DirectCast(r1(5, 97), Excel.Range) ' Value プロパティ等で値を設定 r2.Value = データベースから取得した値 ' 2 つの Range オブジェクトを解放 Marshal.ReleaseComObject(r2) Marshal.ReleaseComObject(r1) r2 = Nothing r1 = Nothing
===== 修正案3 ===== 'Cells プロパティから、シート上の全セルを示す Range オブジェクトを取得 Dim r0 As Excel.Range = ExcelSheet.Cells ' 既定のプロパティへの代入で値を設定 ' ただし VB.NET からだと、Property Let と Property Set を直接区別できないので ' CallByName (もしくはリフレクション)を経由して渡すようにする CallByName(r0, "[DispId=0]", CallType.Let, 5, 97, データベースから取得した値 ) ' Range オブジェクトを解放 Marshal.ReleaseComObject(r0) r0 = Nothing
|