- PR -

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

1
投稿者投稿内容
アンクリ
会議室デビュー日: 2008/09/03
投稿数: 11
投稿日時: 2008-09-03 17:40
はじめて、投稿させていただきます。
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分行挿入をおこないたいです。
なにせ、この質問内容でわかりますでしょうか?

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

mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2008-09-03 17:49
Excelの操作を調べたいなら、Excelでマクロ記録して、生成されたVBAを見るのが良いと思います。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-09-03 17:50
引用:

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

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


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

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
アンクリ
会議室デビュー日: 2008/09/03
投稿数: 11
投稿日時: 2008-09-03 18:11
mio様、じゃんぬねっと様 返信をありがとうございます。

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

皆様のおかげで、なんとか開発が前に進みそうです。
本当にありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-09-03 18:30
引用:

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

行挿入の Range は 'Range1'ではだめだったんですね。
'Range1'を使用してた為にバグとなってしまってました。
別の変数を用意するとうまくいきました。


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

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
アンクリ
会議室デビュー日: 2008/09/03
投稿数: 11
投稿日時: 2008-09-04 09:51
返信遅くなってすいません。。。
そうなんですね。
ということは、
xlRange1.Insert()の後に
FinalReleaseComObject(xlRange1)処理をしてあげれば
問題ないということですよね?
ご指摘ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)