トップ回答者
datagridviewからexcelの複数のシートへのエクスポートについて

質問
-
いつもお世話になります。
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 iFor 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 になります。
回答
-
最初に、
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/
すべての返信
-
全体のコードを見ていないので想像ですが、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/ -
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 iFor 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に対してどのようなコードを書けばよいでしょうか?
アドバイス頂けませんでしょうか?
-
検証してないのでハズレかもしれませんが・・・
たぶん、最初は 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
-
最初に、
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/