掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
エクセルのプロセス (ID:118216)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
.NETからのCOM操作は、結構面倒なんですよね。 前提知識が無いと、確かにつらいかも。(^^; > Dim xlapp As System.Object > Dim objCells As Excel.Range 厳密な型付け(As Excel.〜) と、そうでないもの(As System.Object)が 混じっていますね。どちらかに統一された方が良いですよ。 前者に統一するなら、こんな感じです。 Dim xlapp As Excel.Application 'As System.Object Dim xlbooks As Excel.Workbooks 'As System.Object Dim xlbook As Excel.Workbook 'As System.Object Dim xlsheets As Excel.Sheets 'As System.Object Dim xlsheet1 As Excel.Worksheet 'As System.Object Dim xlsheet2 As Excel.Worksheet 'As System.Object Dim xlsheet3 As Excel.Worksheet 'As System.Object Dim xlsheet4 As Excel.Worksheet 'As System.Object xlapp = New Excel.ApplicationClass xlbook = xlbooks.Open(strFilePathName) xlsheets = xlbook.Sheets xlsheet1 = DirectCast(xlsheets(1), Excel.Worksheet) xlsheet2 = DirectCast(xlsheets(2), Excel.Worksheet) xlsheet3 = DirectCast(xlsheets(3), Excel.Worksheet) もし、DirectCastするのが面倒なら、逆に全てを As Object にしてしまい、 参照設定も外してしまいましょう。中途半端は良くないです。 > objCells = xlsheet1.Cells > objCells(10, 2) = C1FlexGrid1(0, 0) ''営業所又は課 > objCells(1, 8) = "Print : " & strPrintDate ''日付 ここにまた、最初と同じミスがあります。 私は、最初の回答の冒頭部に、 》 まず、Cellsプロパティから返されるのは、Rangeオブジェクトです。 》 ここに直接値を入力してはいけません。 》 RangeオブジェクトのValueプロパティに代入するようにして下さい。 と記述していますよね。これはつまり、 objCells = xlsheet1.Cells objRange1 = objCells(10, 2) objRange1.Value = "(営業所名)" '★★ Range オブジェクトのValueプロパティ ★★ System.Runtime.InteropServices.Marshal.ReleaseComObject(objRange1) '使い終わったら、すぐ解放 objRange1 = objCells(1, 8) objRange1.Value = "Print : " & strPrintDate '★★ Range オブジェクトのValueプロパティ ★★ System.Runtime.InteropServices.Marshal.ReleaseComObject(objRange1) '使い終わったら、すぐ解放 : : System.Runtime.InteropServices.Marshal.ReleaseComObject(objCells) のように、『Valueプロパティ』に代入する必要がある、という意味なのです。 ちなみに、これはVBAやVB6でも同じ事です。 Rangeに直接代入するのは、正しい記述ではありません。 特に .NET においては、上記の objCells(10, 2) などから返される物も、 COMオブジェクトの一種である「Excel.Range オブジェクト」である事に 注意してください。 COMのオブジェクトである以上、.NET からの利用時には、使用後に Marshal.ReleaseComObject()が必要になってくるわけです。 とっても面倒ですけどね。(^_^;) # なお、上記のコードにおいて、 MessageBox.Show(TypeName(objRange1)) を # 実行すると、このデータ型が「Range」型である事を確認できるかと思います。 > objRows4("1:1").Select() この部分にも同じ事が言えます。 『objRows4("1:1")』が返す物を変数に受けて、使用後に解放しましょう。 > objCells(intRowPos + intExlPos, 2) = C1FlexGrid1(intRowPos, 0) ''営業所 そして、ここも同様。 objRange1 = objCells(intRowPos + intExlPos, 2) objRange1.Value = "(営業所情報) System.Runtime.InteropServices.Marshal.ReleaseComObject(objRange1) というイメージになります。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.