QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

【vb.net】エクセルの行挿入について

はじめて、投稿させていただきます。
VB2005にてエクセルファイルの操作を開発しております。

仕様
 vb.netから、原紙となるエクセルシートをコピーし、
 新規ブックに貼り付け、
 対象データを貼り付ける
 ということを行っています。

下記のような関数を作成しました。少々長いですが。。。

''' <param name="strPath">サンプルファイルのパス</param>
''' <param name="intSttNo">データ貼り付け行番号</param>
''' <param name="WkList">貼り付けデータ</param>
Private Sub EditExcel(ByVal strPath As String, _
                      ByVal intSttNo As Integer, _
                      ByVal WkList As ArrayList)

    Dim xlApp As New Excel.Application
    Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
    Dim xlCells As Excel.Range
    Dim xlRange1 As Excel.Range
    Dim xlRows As Excel.Range

    '--------------------------------------------------
    '新規のファイルを開く
    '--------------------------------------------------
    Dim xlBook As Excel.Workbook = xlBooks.Add
    Dim xlSheets As Excel.Sheets = xlBook.Worksheets

    '--------------------------------------------------
    'サンプルのファイルを開く
    '--------------------------------------------------
    Dim xlFilePath As String = strPath
    Dim xlBookOp As Excel.Workbook = xlBooks.Open(xlFilePath)
    Dim xlSheetsOp As Excel.Sheets = xlBookOp.Worksheets
    Dim xlSheetOp As Excel.Worksheet = xlSheetsOp.Item(1)

    '--------------------------------------------------
    'Excelを表示
    '--------------------------------------------------
    xlApp.Visible = True

    '--------------------------------------------------
    'サンプルファイルのシートコピー
    '--------------------------------------------------
    xlSheetOp.Copy(Before:=xlSheets(1))
    xlCells = xlSheets(1).Cells

    '▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
    '行挿入
    xlRows = xlSheets(1).Rows
    xlRange1 = xlRows(intSttNo & ":" & WkList.Count)
    '▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

    '--------------------------------------------------
    ' 対象データの貼り付け
    '--------------------------------------------------
    For i As Integer = 0 To WkList.Count - 1
        xlRange1 = DirectCast(xlCells(intSttNo + i, 1), Excel.Range)
        xlRange1.Value = WkList.Item(i)
        FinalReleaseComObject(xlRange1)               'xlRange1 の解放
    Next

    '--------------------------------------------------
    ' 終了処理 
    '--------------------------------------------------
    FinalReleaseComObject(xlCells)                  'xlCells の解放
    FinalReleaseComObject(xlSheetOp)                'xlSheet の解放
    FinalReleaseComObject(xlSheetsOp)               'xlSheets の解放
    xlBookOp.Close(False)                           'xlBook を閉じる
    FinalReleaseComObject(xlBookOp)                 'xlBook の解放
    FinalReleaseComObject(xlBooks)                  'xlBooks の解放

End Sub

引数のintSttNoより、intCount分行挿入をおこないたいです。
なにせ、この質問内容でわかりますでしょうか?

なにか、いい方法もしくはサンプルがあればご教授ねがいます。

質問者:アンクリ

回答

Excelの操作を調べたいなら、Excelでマクロ記録して、生成されたVBAを見るのが良いと思います。

投稿者:mio

編集 履歴 (0)

アンクリさんの書き込み (2008-09-03 17:40) より:

引数のintSttNoより、intCount分行挿入をおこないたいです。

コピーではなく挿入ですか? 挿入したい Range をとって Insert ですね。 行挿入の Range は 'Range1' ではなく別の変数を用意してバグの温床にならないようにしてあげてください。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

mio様、じゃんぬねっと様 返信をありがとうございます。

mio様
 ご指摘ありがとうございます。
 Excelでマクロ記録して、生成されたVBAを参考にして
 別のエクセルのファイル操作処理も出来そうです。
 
じゃんぬねっと様
 行挿入の Range は 'Range1'ではだめだったんですね。
  'Range1'を使用してた為にバグとなってしまってました。
 別の変数を用意するとうまくいきました。

皆様のおかげで、なんとか開発が前に進みそうです。
本当にありがとうございました。

投稿者:アンクリ

編集 履歴 (0)

アンクリさんの書き込み (2008-09-03 18:11) より:

行挿入の Range は 'Range1'ではだめだったんですね。

'Range1'を使用してた為にバグとなってしまってました。

別の変数を用意するとうまくいきました。

うーん... 挿入の動作自体には支障はないと思います。 ただ現状のコードですと、その後に同じ変数 'Range1' を参照カウントをデクリメントする前に参照を上書きすることになるので、それを防ぐために別の変数を用意した方が良いと書いただけなのですけどね。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

返信遅くなってすいません。。。
そうなんですね。
ということは、
xlRange1.Insert()の後に
FinalReleaseComObject(xlRange1)処理をしてあげれば
問題ないということですよね?
ご指摘ありがとうございました。

投稿者:アンクリ

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。