none
datagridviewからexcelの複数のシートへのエクスポートについて RRS feed

  • 質問

  • いつもお世話になります。

    datagridviewに表示されるデータを、1つのファイルに複数のシートへコピー出来るようにしたく作成をしております。

    (1つのファイルにAシート、Bシート、Cシートが作られ、各シート毎にデータの内容が違う。)

    以下のコードですと、1つのファイルに3つのシートが作成されますが、1つのシートのみにデータが反映されるだけで、残り2つのシートには空白の状態です。

    どのようにコードを書けばよいでしょうか?

    お忙しい所お手数をお掛け致しますが、ご教授頂けると助かります。

    'DataGridViewのセルのデータ取得
            For i As Integer = 1 To DataGridView1.Rows.Count
                For j As Integer = 0 To DataGridView1.Columns.Count - 1
                    DirectCast(xlSheet.Cells(i + 1, j + 1), Excel.Range).Value = DataGridView1(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(xlSheet.Cells(1, i + 1), Excel.Range).Value = column.HeaderText
            Next
    '保存

    xlSheet.Cells.Font.Size = 10
            xlSheet.Columns("A").ColumnWidth = 9.0
            xlSheet.Columns("B").ColumnWidth = 11.0
            xlSheet.Columns("C:G").ColumnWidth = 20.0
            xlBook.Worksheets("Sheet1").Name = "AA"
            xlBook.Worksheets("Sheet2").Name = "BB"
            xlBook.Worksheets("Sheet3").Name = "CC"
             xlBook.Worksheets("AA").Activate()
            xlBook.SaveAs("c:\yy\xxxxx")

    環境は、vb.net2008、XP(SP3)、Excel2007 になります。

     

    2010年4月30日 7:41

回答

  • 最初に、
     xlSheet = xlBook.ActiveSheet
    とされていますので、ActiveSheet、すなわち現在選択されているシートをxlSheetは示すことになります。現在選択されているシートはデフォルトでSheet1です。
    シートにデータを書き出しているところは
     DirectCast(xlSheet.Cells(1, i + 1), Excel.Range).Value = column.HeaderText
    ですから、常にSheet1のセルに対して値を設定することになります。
    SurferOnWwwさんが言われているようにActiveSheetを切り替えても良いですし、以下のようにしても良いです。

    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
        DirectCast(xlBook.Worksheets("Sheet2").Cells(1, i + 1), Excel.Range).Value = column.HeaderText
        DirectCast(xlBook.Worksheets("Sheet3").Cells(1, i + 1), Excel.Range).Value = column.HeaderText
    Next

    シートは複数ありますので、どのシートに対して操作するのかをきちんと指定する必要あるのです。対象となるシートは名前で以下のように指定することもできますし、
    xlBook.Worksheets("Sheet1")
    次のように添え字で指定することもできます。
    xlBook.Worksheets(0)

    現在Activeなシートであれば、
    xlBook.ActiveSheet
    として指定することもできます。あるシートをActiveにしたい場合は、xlBook.Worksheets("Sheet1").Activate() のように記述します。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年5月2日 2:07
    モデレータ
  • SurferOnWww 様

    ご回答ありがとうございました。

    出来ました。

    • 回答としてマーク 山本春海 2010年5月6日 7:01
    2010年5月6日 6:25

すべての返信

  • xlSheetが各シートに切り替わっていないのではないでしょうか?

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年4月30日 15:25
    モデレータ
  • trapemiya様、

    ご回答ありがとうございます。

    >xlSheetが各シートに切り替わっていないのではないでしょうか?
    どういう事でしょうか。申し訳ございませんが、詳しく教えて頂けますでしょうか。

     

    2010年4月30日 23:09
  • 全体のコードを見ていないので想像ですが、Sheet1、Sheet2、Sheet3というのはExcel起動時に最初から存在している3つのシートですよね?
    各シートに対して操作するのであれば、シート名を変更されているようにxlBook.Worksheets("Sheet1")、xlBook.Worksheets("Sheet2")、xlBook.Worksheets("Sheet3")の各シートに対して行なわなければなりません。
    掲載されたコードはxlSheetに対して操作されていますが、このxlSheetが3つのうちのどのシートを指すのかわかりませんでした。3つのシートを操作するのであれば、例として

    xlSheet = xlSheets("Sheet1")
    としてxlSheetに対して処理を行ない、

    xlSheet = xlSheets("Sheet2")
    としてxlSheetに対して処理を行ない、 

    xlSheet = xlSheets("Sheet3")
    としてxlSheetに対して処理を行う。

    というようなコードになっていなければなりません。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年5月1日 0:02
    モデレータ
  • trapemiya様、

    ご回答ありがとうございます。

    以下がコードになります。

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

            Dim xlapp As Excel.Application
            Dim xlBook As Excel.Workbook
            Dim xlSheet As Excel.Worksheet

            'Excelを開く
            xlapp = CreateObject("Excel.Application")
            xlapp.Visible = True
            xlapp.Workbooks.Add()
            xlBook = xlapp.ActiveWorkbook
            xlSheet = xlBook.ActiveSheet

            'DataGridViewのセルのデータ取得
            For i As Integer = 1 To DataGridView1.Rows.Count
                For j As Integer = 0 To DataGridView1.Columns.Count - 1
                    DirectCast(xlSheet.Cells(i + 1, j + 1), Excel.Range).Value = DataGridView1(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(xlSheet.Cells(1, i + 1), Excel.Range).Value = column.HeaderText
            Next


            '保存(1つのファイルに4つの結果を各シートにエクスポート)
       
            xlSheet.Cells.Font.Size = 10
            xlSheet.Columns("A").ColumnWidth = 9.0
            xlSheet.Columns("B").ColumnWidth = 11.0
            xlSheet.Columns("C:G").ColumnWidth = 20.0
            xlBook.Worksheets("Sheet1").Name = "AA"
            xlBook.Worksheets("Sheet2").Name = "BB"
            xlBook.Worksheets("Sheet3").Name = "CC"
            xlBook.Worksheets("AA").Activate()
            xlBook.SaveAs("c:\yy\xxxxx")

        End Sub

    sheet1にdatagridviewからのデータがエクスポートされます。

    sheet2、3には、datagridviewからのデータがエクスポートされない状態です。

    sheet1とsheet2とsheet3に対してどのようなコードを書けばよいでしょうか?

    アドバイス頂けませんでしょうか?

    2010年5月1日 0:48
  • 検証してないのでハズレかもしれませんが・・・

    たぶん、最初は Sheet1 がアクティブシートになっていて、それにのみデータ
    を取り込んで終わりにしているからだと思います。

    Sheet2, Sheet3 もアクティブシートにして「DataGridViewのセルのデータ取
    得」を繰り返し行ってはどうですか?

    つまり、xlBook.Worksheets("Sheet2").Activate() として以下を繰り返す、
    もう一度 xlBook.Worksheets("Sheet3").Activate() として以下を繰り返すと
    いうことです。(合計3回行う)

    > xlSheet = xlBook.ActiveSheet
    >
    > 'DataGridViewのセルのデータ取得
    > For i As Integer = 1 To DataGridView1.Rows.Count
    >     For j As Integer = 0 To DataGridView1.Columns.Count - 1
    >         DirectCast(xlSheet.Cells(i + 1, j + 1), Excel.Range).Value = DataGridView1(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(xlSheet.Cells(1, i + 1), Excel.Range).Value = column.HeaderText
    > Next

    • 回答の候補に設定 山本春海 2010年5月6日 6:13
    2010年5月2日 0:08
  • 最初に、
     xlSheet = xlBook.ActiveSheet
    とされていますので、ActiveSheet、すなわち現在選択されているシートをxlSheetは示すことになります。現在選択されているシートはデフォルトでSheet1です。
    シートにデータを書き出しているところは
     DirectCast(xlSheet.Cells(1, i + 1), Excel.Range).Value = column.HeaderText
    ですから、常にSheet1のセルに対して値を設定することになります。
    SurferOnWwwさんが言われているようにActiveSheetを切り替えても良いですし、以下のようにしても良いです。

    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
        DirectCast(xlBook.Worksheets("Sheet2").Cells(1, i + 1), Excel.Range).Value = column.HeaderText
        DirectCast(xlBook.Worksheets("Sheet3").Cells(1, i + 1), Excel.Range).Value = column.HeaderText
    Next

    シートは複数ありますので、どのシートに対して操作するのかをきちんと指定する必要あるのです。対象となるシートは名前で以下のように指定することもできますし、
    xlBook.Worksheets("Sheet1")
    次のように添え字で指定することもできます。
    xlBook.Worksheets(0)

    現在Activeなシートであれば、
    xlBook.ActiveSheet
    として指定することもできます。あるシートをActiveにしたい場合は、xlBook.Worksheets("Sheet1").Activate() のように記述します。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年5月2日 2:07
    モデレータ
  • SurferOnWww 様

    ご回答ありがとうございました。

    出来ました。

    • 回答としてマーク 山本春海 2010年5月6日 7:01
    2010年5月6日 6:25
  • trapemiya 様

    ご回答ありがとうございました。

    出来ました。

    助かりました。

     

    2010年5月6日 6:26