none
VB.net2008でエクセルへエクスポートする場合について RRS feed

  • 質問

  • 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

    上記のコードですと、初回のエクスポートは出来ますが、二回目にエクスポートをすると、上書きされる事無く、シートが複数出来てしまいます。

    セルの範囲指定してエクスポートをしたいと思っております。

    沢山質問ばかりして、申し訳ございません、

    ご教授下さい。

     

    2010年6月29日 6:35

回答

  • 突っ込みどころが多々ありますが、時間がないのでまず一点だけ。

    xlBook.Worksheets("sheet1")

    とシート名でアクセスしてますが、二度目にアクセスした場合、sheet1 はすでに名前を変えてるので存在しませんよね。

    xlBook.Worksheets(1)

    と、インデックスでアクセスした方がいいと思います。


    ひらぽん http://d.hatena.ne.jp/hilapon/
    • 回答の候補に設定 山本春海 2010年7月2日 2:50
    • 回答としてマーク 山本春海 2010年7月14日 8:40
    • 回答としてマーク 山本春海 2010年7月14日 8:41
    2010年6月29日 9:19
    モデレータ

すべての返信

  • 突っ込みどころが多々ありますが、時間がないのでまず一点だけ。

    xlBook.Worksheets("sheet1")

    とシート名でアクセスしてますが、二度目にアクセスした場合、sheet1 はすでに名前を変えてるので存在しませんよね。

    xlBook.Worksheets(1)

    と、インデックスでアクセスした方がいいと思います。


    ひらぽん http://d.hatena.ne.jp/hilapon/
    • 回答の候補に設定 山本春海 2010年7月2日 2:50
    • 回答としてマーク 山本春海 2010年7月14日 8:40
    • 回答としてマーク 山本春海 2010年7月14日 8:41
    2010年6月29日 9:19
    モデレータ
  • こんにちは、ワカバワカバ さん。

    その後いかがでしょうか。ひらぽん さんからのアドバイスはご確認いただけましたか?

    ひらぽん さん、アドバイスありがとうございます。
    ひらぽん さんからの情報は有効な情報であるかと思われますので、勝手ながら私のほうで回答としてマーク させていただきました。
    回答としてマークすることで、今後同じ問題でこのスレッドを参照された方にも、有効な情報が目に留まりやすくなるかと思いますので、有効な情報には回答としてマークをお願いしております。

    ワカバワカバ さん、お時間のある時にでもその後の状況をお知らせくださいね。
    まだ解決されていないようでしたら、状況の詳細をお知らせいただいて、ご質問を続けてくださいね。

    今後とも、MSDN フォーラムのご利用をよろしくお願いいたします。それでは。
                                                 
    マイクロソフト株式会社 フォーラム オペレーター 山本 春海
    2010年7月14日 8:40