DataGridViewをExcelに書き込む方法

このQ&Aのポイント
  • VB2008で作成したプログラムで、DataGridViewの内容をExcelに書き込む方法について教えてください。
  • ループ処理を使用してDataGridViewの値をExcelのセルに書き込む方法についてわかりません。どなたかご教授いただけますか?
  • DataGridViewで一行データをExcelに書き込んだ後、Excelのセルの位置も一行ずつ移動させる方法がわかりません。教えていただけますか?
回答を見る
  • ベストアンサー

DataGridViewの内容をExcelに書き込みたいのですが

お世話になります。現在VB2008にて、DataGridViewの内容をExcelに書き込むという仕様を作っているのですが、ExcelのCellにDataGridViewの値を書き込むという作業をループ処理で行いたいのですが、ソースの書き方がわからないんです。 まず私が書いたソースは、 Private Sub Excel() Dim xlapp As Excel.Applcation Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet 'Excelを開く xlApp = CreateObject("Excel.Application") xlApp.Visible = True xlApp.Workbooks.Add() xlBook = xlApp.ActiveSheet xlSheet = xlBook.ActiveSheet 'シートの編集 xlSheet.Cells(1, 1).Value = DataGridView1(0, 0).Value.ToString xlSheet.Cells(2, 1).Value = DataGridView1(0, 1).Value.ToString 'Excelファイル終了処理   xlBook.Close xlApp.Quit() xlSheet = Noting xlBook = Noting xlApp = Noting End Sub こちらになりますが、このソースの「'シートの編集」の部分をループ処理で行いたいのです。 DataGridViewで一行Excelに書き込んだら、ExcelのCellの位置も一行移動するという書き方がわからないんです。 どなたかご教授ください。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.1

xlSheet.Cells(1, 1).Value = DataGridView1(0, 0).Value.ToString xlSheet.Cells(2, 1).Value = DataGridView1(0, 1).Value.ToString を For i as integer = 0 to DataGridView1.Rows.Count -1 For j as integer = 0 to DataGridView1.Columns.Count -1 xlSheet.Cells(i + 1, j + 1).Value = DataGridView1(i, j).Value.ToString Next j Next i ですかね。 EXCELをCOMオブジェクト経由で使用する際はきちんと開放しないと、EXCELのプロセスが残ってしまいます。 ''' <summary> ''' COMオブジェクト開放処理 ''' </summary> ''' <remarks> ''' 使用したCOMオブジェクトの開放を行う ''' </remarks> Private Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False) If objCom Is Nothing Then Return End If Try If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then If force Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom) Else Dim count As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom) End If End If Finally objCom = Nothing End Try End Sub を使用して、きちんと開放してくださいね。 MRComObject(xlSheet) といった感じで使用します。 EXCEL関係はすべてこれを利用して開放してください。 私は以下のように使用しています。 MRComObject(xlSheet) 'xlSheet の解放 MRComObject(xlSheets) 'xlSheets の解放 Try xlBook.Close(False) 'xlBook を閉じる Catch ex As Exception End Try MRComObject(xlBook) 'xlBook の解放 MRComObject(xlBooks) 'xlBooks の解放 xlApp.Quit() 'Excelを閉じる MRComObject(xlApp) 'xlApp を解放

cabwik
質問者

お礼

回答ありがとうございます。 >EXCELをCOMオブジェクト経由で使用する際はきちんと開放しないと、EXCELのプロセスが残ってしまいます。 ご指摘ありがとうございます。 実は、質問で書いたソース上において、 開放という部分が理解できていなかったんです。 AKARI0418さんのサンプルコードを基に勉強したいと思います。

関連するQ&A

  • datagridviewからエクセルへ出力する際のエラーについて

    datagridviewからエクセルへ出力する際のエラーについて いつもお世話になります。 datagridviewに表示されたデータをエクセルへ出力したく以下のコードを書きました。 Imports System.IO Imports System.Data Imports System.Data.SqlClient Imports Microsoft.Office.Interop Public Class form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim cn As OleDb.OleDbConnection _ = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\VB2008\コピー ~ 社会保険計算.mdb;") End Sub Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.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 'シートの編集 ☆ xlSheet.Cells(1, 1).Value = DataGridView1(1, 1).Value.ToString  xlSheet.Cells(2, 1).Value = DataGridView1(2, 1).Value.ToString xlBook.Close() xlapp.Quit() xlBook = Nothing xlapp = Nothing End Sub ☆マークで止まってしまいます。 argumentoutofrangeexceptionがハンドルされませんでした。 インデックスが範囲を超えています。負でない値でコレクションのサイズよりも小さくなければなりません。 パラメータ名:index と表示されます。 環境は、VB.NET2008     XP(SP3)     Excel2007 になります。 上記のエラーで止まり、エクセルも立ち上がりぱなしです。 お忙しい所お手数をお掛けしますが、ご教授下さい。

  • VB2005でExcelファイルを開く

    こんにちは。 VB2005の勉強をさせて頂いています。 ボタンを押すとコモンダイヤログを表示し、 ダイヤログ内で選択したExcelファイルの内容をフォームのDataGridViewにもって行きたいと思っていますが 上手くできません。一応現在のソースを下記に置いておきます。 特に、下記のソースの 'DataGridView1に展開 For i As Integer = 0 To xlSheet.Rows.Count - 1 DataGridView1.Rows.Add() DataGridView1.Item(0, i) = xlSheet.Rows.Item(i, 0) Next のループ条件xlSheet.Rows.Count - 1がどうも6万くらいになっているようなのですが、 実際セルに入力したデータは5行程度のものです。 1セル1セル文字が入っているかどうかを調べていかないといけないのでしょうか? よろしければ、具体的なソースやアドバイスをお願いいたします。 -------------------------------------- Dim ofd As New OpenFileDialog() 'ofdの設定をする 'ダイアログを表示し、戻り値が [OK] の場合は、選択したファイルを表示する If ofd.ShowDialog() = DialogResult.OK Then '選択されたファイルを読み取り専用で開く Dim ReadFile As System.IO.Stream ReadFile = ofd.OpenFile() If Not (ReadFile Is Nothing) Then Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks '既存ファイルを開く場合 Dim xlFilePath As String = ofd.FileName Dim xlBook As Excel.Workbook = xlBooks.Open(xlFilePath) Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item(1) 'DataGridView1に展開 For i As Integer = 0 To xlSheet.Rows.Count - 1 DataGridView1.Rows.Add() DataGridView1.Item(0, i) = xlSheet.Rows.Item(i, 0) Next 'xlSheet の解放 'xlSheets の解放 'xlBook を閉じる 'xlBook の解放 'xlBooks の解放 'Excelを閉じる 'xlApp を解放 End If End If ofd.Dispose()

  • エクセルの開放

    VB2008でエクセルを操作しているのですが、エクセルのプロセスが残ってしまってどうやって解放すればいいのかわかりません。 サンプルプログラム-------------- Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlBook As Excel.Workbook = xlBooks.Add Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item(1) Dim xlobj As Object '開放用 xlobj = xlSheet.Range("A1:C3") xlobj.Value = "TEST" MRComObject(xlobj) MRComObject(xlSheet) MRComObject(xlSheets) xlBook.Close(False) MRComObject(xlBook) MRComObject(xlBooks) xlApp.Quit() MRComObject(xlApp) MRComObjectでCOM オブジェクトへの参照を解放しています。 このプログラムでは特に問題ないのですが、 xlobj = xlApp.Worksheets("Sheet2") xlobj2 = xlobj.Range("A1:C2") xlobj2.Value = "TEST" のようにワークシートを指定すると解放できません。 xlSheet = xlBook.Worksheets("Sheet2") としてもプロセスが残ります。 またVB6.0では可能だった xlApp.Worksheets("Sheet2").Select() のようにワークシートを切り替えるときもVB2008ではプロセスが残ってしまいます。 これはどのようにしたら解決するのでしょうか?

  • Excelのシートをコピー

    環境は,Visual Studio 2005 Standard Editionです. プログラムを実行後,以下の例外が発生しました. 「HRESULT からの例外: 0x800A03EC」 発生場所は★の位置です. ここから------- Dim xlApp As Microsoft.Office.Interop.Excel.Application = Nothing Dim xlBook As Microsoft.Office.Interop.Excel.Workbook = Nothing Dim xlSheet As Microsoft.Office.Interop.Excel.Worksheet = Nothing xlBook = xlApp.Workbooks.Open("ファイルのパスが入ります") xlSheet = xlBook.Worksheets("シート名が入ります") Dim xlBook2 As Microsoft.Office.Interop.Excel.Workbook = Nothing Dim xlSheet2 As Microsoft.Office.Interop.Excel.Worksheet = Nothing xlBook2 = xlApp.Workbooks.Open("ファイルパスが入ります") xlSheet2 = xlBook.Worksheets("シート名が入ります") 'Excelを表示しない xlApp.Visible = False xlSheet.Copy(Before:=xlSheet2) ★ ここまで-------------- やろうとしているのは,xlSheet2のシートを含むExcelファイルに,xlSheet2の前にxlSheetをコピーする処理です. ★のところで上の例外が発生してしまいます. 以上,よろしくお願いします.

  • VB6.0上でExcelオブジェクトを生成

    VB6.0上でExcelオブジェクトの生成についてです。 その1 Dim xlApp As New Excel.Application Dim xlBook As New Excel.Workbook Dim xlSheet As New Excel.Worksheet Set xlApp = New Excel.Application Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) と その2 Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) と、どちらが良いのでしょうか? 開発環境は  Windows2000  VB 6.0  Excel 2003 です。

  • Excel出力後のExcelの起動について

    Vb側からデータをExcelに出力し、その画面を表示させたまま 出力したExcelを確認しようと思ったところ、Excelは起動するものの シートが表示されない現象が起こりました。 出力後のExcelの終了(解放?)のロジックは下記の通りです。 Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Set xlApp = New Excel.Application Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets.Add … … Sheetへの出力処理 … … Set xlApp = Nothing Set xlBook = Nothing Set xlSheet = Nothing この現象の回避方法がありましたらご教授ください。 Windows2000 Vb6.0 SP5 Excel2000

  • エクセルを表示できない

    プログラム初心者です。 Private Sub Command3_Click() On Error Resume Next Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet With xlApp.Application Set xlApp = GetObject("F:\vb6.0\book1.xls") Set xlBook = xlApp.Workbooks.Open("Book1") Set xlSheet = xlBook.Worksheets(1) xlApp.Application.Visible = True End Sub と入力したのですが、実行してボタンをクリックしてもエクセルの表が表示されません。なぜでしょうか?

  • VB.NETからEXCELの起動が、うまくいかない

    3回目の同じ質問になってしまうのですがよろしくお願いいたします。 下記のようなソースでEXCELファイルを作成し、その後ファイルを開くという処理をしています。 Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlBook As Excel.Workbook = xlBooks.Add Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item(1) Dim xlRange As Excel.Range Dim xlCells As Excel.Range = xlSheet.Cells xlRange = xlCells(1, 10) xlRange.Value = "--" xlRange = xlCells(1, 5) xlCells.EntireColumn.AutoFit() xlBook.SaveAs(sPath & "\" & sFileName, Excel.XlFileFormat.xlWorkbookNormal) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlCells) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlRange) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlSheet) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlSheets) xlCells = Nothing xlRange = Nothing xlSheet = Nothing xlSheets = Nothing xlBook.Close() System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlBook) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlBooks) xlBook = Nothing xlBooks = Nothing xlApp.Quit() System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp) xlApp = Nothing GC.Collect() System.Diagnostics.Process.Start(sPath & "\" & sFileName) ある特定のPCでのみEXCELのメニューバーとステータスバーのみしか表示されない状態です。 起動部分(Process.Start)をコメントアウトして確認したところ GC.COLLECTでEXCELが終了することなく、アプリの終了時にEXCELが終了する 状態にあります。 これはオブジェクトの開放がうまくいっていないのでしょうか? よろしくお願いいたします。

  • VBからエクセルを起動。そのあとエクセルを終了

    教えてください。 VBからエクセルを起動します。 そのあと、エクセルのシートの上にデータを貼り付けます。そして、エクセルを終了します。 しかし、エクセルが終了しません。 タスクバー上のエクセルをクリックすると終了します。 どうして、このような現象が起こるのかわかりません。 教えてください。 下記に同様のサンプルを書きました 誤記入があるかも知れませんが このような感じのプログラムです。 以上、よろしくお願いします。 public sub test Dim XApp as Excel.Application Dim nfilename as string Dim xlBook As Object Dim xlSheet As Object ' エクセルを起動 Set xlApp = New Excel.Application nfilename ="AAAA.xls" ' 指定されたファイルを開く Call xlApp.Workbooks.Open(nfilename) Set xlBook = xlApp.ActiveWorkbook Set xlSheet = xlBook.Worksheets(1) 'フォームを貼り付ける xlSheet.Range("a1").PasteSpecial      'ファイル名の作成 Filename="BBBB.xls" '保存 ChDir "C:\" xlBook.SaveAs Filename:=Filename,FileFormat:=xlNormal, _ Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _ CreateBackup:=False Set xlSheet = Nothing xlBook.Close True Set xlBook = Nothing xlApp.Quit Set xlApp = Nothing End sub

  • VB2008 エクセル出力

    VB2008 エクセル出力 教えていただけると助かります VB6.0使用時にエクセル出力をするために下記のようなプログラムで出力していました ※「Microsoft Excel 9.0 Object Library」を参照 Dim xlApp As EXCEL.Application Dim xlBook As EXCEL.Workbook Dim xlsheet As EXCEL.Worksheet Dim File As String File = App.Path + "\EXCEL\" + "フォーム.xls" Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(File) Set xlsheet = xlBook.Worksheets("テスト") xlsheet.Range("A1") = "テスト" 'フォルダ作成 If Dir("D:\", vbDirectory) = "" Then Call Mkdirs("D:\テスト") 'Worksheetを名前をつけて保存します。 xlApp.DisplayAlerts = False xlsheet.SaveAs "D:\テスト\テスト.xls" xlApp.Quit Set xlApp = Nothing Set xlBook = Nothing Set xlsheet = Nothing VB2008の場合だとどのように書けば同じように動きますか ※色々試してみましたがダメでした 「Microsoft Excel 12.0 Object Library」を参照しています

専門家に質問してみよう