トップ回答者
VB.net2008でエクセルへエクスポートする場合について

質問
-
VB.NET2008でアクセス2000と接続して、クエリから得られる結果をdategridviewに表示、サーバにあるエクセル2007へエクスポートしています。。
(3つのクエリがあり、各々をDgvに表示)複数回エクスポートすると、シートが上書きされず、aシート、a(1)シート、bシート、b(1)シート、cシート、c(1)シートの形になります。既存のファイルの指定するシートへ、セルの範囲を指定して上書きされ、クエリから得られる抽出結果をエクスポートする事は出来ますでしょうか?また、a、b、cシートにエクスポートをして、新規シートにエクスポート出来ますでしょうか?クエリを1、2、3とします。エクスポートするシートをa、b、cとします。1に対してa、2に対してb、3に対してcにエクスポートします。
使用環境:vb.net2008 EXPRESSEdition
XP(SP3)Access2000、Excel2007
以下が考えたコードになります。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim xlapp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
xlapp = CreateObject("Excel.Application")
xlapp.Visible = True
xlapp.Workbooks.Add()
xlBook = xlapp.ActiveWorkbook
xlSheet = xlBook.ActiveSheet
For i As Integer = 1 To DataGridView1.Rows.Count
For j As Integer = 0 To DataGridView1.Columns.Count - 1
DirectCast(xlBook.Worksheets("sheet1").Cells(i + 1, j + 1), Excel.Range).Value = DataGridView1(j, i - 1).Value
Next
For j As Integer = 0 To DataGridView2.Columns.Count - 1
DirectCast(xlBook.Worksheets("sheet2").Cells(i + 1, j + 1), Excel.Range).Value = DataGridView2(j, i - 1).Value
Next
For j As Integer = 0 To DataGridView3.Columns.Count - 1
DirectCast(xlBook.Worksheets("sheet3").Cells(i + 1, j + 1), Excel.Range).Value = DataGridView3(j, i - 1).Value
Next j
Next i
For i As Integer = 0 To DataGridView1.Columns.Count - 1
Dim column As DataGridViewColumn = DataGridView1.Columns(i)
DirectCast(xlBook.Worksheets("Sheet1").Cells(1, i + 1), Excel.Range).Value = column.HeaderText
Next
For i As Integer = 0 To DataGridView2.Columns.Count - 1
Dim column1 As DataGridViewColumn = DataGridView2.Columns(i)
DirectCast(xlBook.Worksheets("Sheet2").Cells(1, i + 1), Excel.Range).Value = column1.HeaderText
Next
For i As Integer = 0 To DataGridView3.Columns.Count - 1
Dim column2 As DataGridViewColumn = DataGridView3.Columns(i)
DirectCast(xlBook.Worksheets("Sheet3").Cells(1, i + 1), Excel.Range).Value = column2.HeaderText
Next
xlBook.Worksheets("Sheet1").Name = "a"
xlBook.Worksheets("Sheet2").Name = "b"
xlBook.Worksheets("Sheet3").Name = "c"
xlBook.Worksheets("a").Activate()
xlBook.SaveAs("\\サーバ\共有フォルダ\abc.xlsx")
xlapp.Visible = False
xlapp.Quit()
Dim myProcess As String = "excel"
Dim hProcess As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcessesByName("excel")
If hProcess.Length <> 0 Then
If hProcess(0).CloseMainWindow() = False Then
hProcess(0).Kill()
End If
hProcess(0).Close()
hProcess(0).Dispose()
Else
MsgBox("プロセスが見つかりません")
End If
MsgBox("終了しました")
End Sub上記のコードですと、初回のエクスポートは出来ますが、二回目にエクスポートをすると、上書きされる事無く、シートが複数出来てしまいます。
セルの範囲指定してエクスポートをしたいと思っております。
沢山質問ばかりして、申し訳ございません、
ご教授下さい。
回答
-
突っ込みどころが多々ありますが、時間がないのでまず一点だけ。
xlBook.Worksheets("sheet1")
とシート名でアクセスしてますが、二度目にアクセスした場合、sheet1 はすでに名前を変えてるので存在しませんよね。
xlBook.Worksheets(1)
と、インデックスでアクセスした方がいいと思います。
ひらぽん http://d.hatena.ne.jp/hilapon/
すべての返信
-
突っ込みどころが多々ありますが、時間がないのでまず一点だけ。
xlBook.Worksheets("sheet1")
とシート名でアクセスしてますが、二度目にアクセスした場合、sheet1 はすでに名前を変えてるので存在しませんよね。
xlBook.Worksheets(1)
と、インデックスでアクセスした方がいいと思います。
ひらぽん http://d.hatena.ne.jp/hilapon/ -
こんにちは、ワカバワカバ さん。
その後いかがでしょうか。ひらぽん さんからのアドバイスはご確認いただけましたか?
ひらぽん さん、アドバイスありがとうございます。
ひらぽん さんからの情報は有効な情報であるかと思われますので、勝手ながら私のほうで回答としてマーク させていただきました。
回答としてマークすることで、今後同じ問題でこのスレッドを参照された方にも、有効な情報が目に留まりやすくなるかと思いますので、有効な情報には回答としてマークをお願いしております。
ワカバワカバ さん、お時間のある時にでもその後の状況をお知らせくださいね。
まだ解決されていないようでしたら、状況の詳細をお知らせいただいて、ご質問を続けてくださいね。
今後とも、MSDN フォーラムのご利用をよろしくお願いいたします。それでは。
マイクロソフト株式会社 フォーラム オペレーター 山本 春海