Visual Basic .NET を使用してデータを Excel ブックに転送する方法

文書翻訳 文書翻訳
文書番号: 306022 - 対象製品
この記事は、以前は次の ID で公開されていました: JP306022
Microsoft Visual C# .NET については、次の資料を参照してください。306023
すべて展開する | すべて折りたたむ

目次

概要

この資料では、Visual Basic .NET プログラムから Excel 2002 形式のデータを転送するためのいくつかの方法を、手順を追って説明します。また、最適なソリューションを選択できるように、それぞれの方法の長所と短所についても説明します。

はじめに

データを転送して Excel ブック形式のデータを作成するのに最もよく使用されるのは、"オートメーション" と呼ばれる技法です。オートメーションを使用することによって、Excel タスクに対応したメソッドやプロパティを呼び出すことができ、Excel ブックの中にあるデータの位置の指定やブックの書式設定、その他の実行時の設定を最も柔軟に行うことができます。

オートメーションを使用することで、データ転送に以下のような技法を使用することができます。
  • セルごとにデータを転送する
  • 配列のデータを特定のセル範囲に転送する
  • CopyFromRecordset メソッドを使用して、ADO レコードセットのデータを特定のセル範囲に転送する
  • ODBC または OLEDB データ ソースのクエリの結果を含む QueryTable オブジェクトを Excel ワークシート上で作成する
  • クリップボードのデータを転送し、クリップボードの内容を Excel ワークシートに貼り付ける
オートメーションを使用せずにデータを Excel 形式に転送する方法も多数あります。アプリケーションをサーバー側で実行している場合、この方法はクライアントでの大量のデータ処理を回避するのに有効なアプローチです。

オートメーションを使用せずにデータ転送を行うには、以下のアプローチを使用します。
  • データをタブ区切りまたはコンマ区切りテキスト ファイルに変換し、後から Excel でテキストを区切ってブックのセルに格納する
  • ADO.NET を使用してデータをワークシートに転送する
  • XML データから Excel 形式 (バージョン 2002 に限られます) に変換することでデータに書式を与え、セルの行や列に割り当てる

技法の説明

オートメーションを使用してセルごとにデータを転送する

オートメーションを使用することによって、次のように、ワークシートのセルに 1 つずつデータを転送できます。
        Dim oExcel As Object
        Dim oBook As Object
        Dim oSheet As Object

        'Start a new workbook in Excel.
        oExcel = CreateObject("Excel.Application")
        oBook = oExcel.Workbooks.Add

        'Add data to cells of the first worksheet in the new workbook.
        oSheet = oBook.Worksheets(1)
        oSheet.Range("A1").Value = "Last Name"
        oSheet.Range("B1").Value = "First Name"
        oSheet.Range("A1:B1").Font.Bold = True
        oSheet.Range("A2").Value = "Doe"
        oSheet.Range("B2").Value = "John"

        'Save the Workbook and quit Excel.
        oBook.SaveAs(sSampleFolder & "Book1.xls")
        oSheet = Nothing
        oBook = Nothing
        oExcel.Quit()
        oExcel = Nothing
        GC.Collect()
				
セルを 1 つずつ転送する方法は、転送するデータが少量の場合には適切なアプローチです。データはブックのどの場所にあってもよく、実行時に条件付きでセルの書式を設定することもできます。しかし、大量のデータを Excel ブックに転送する場合は、この方法はお勧めできません。実行時に取得するそれぞれの Range オブジェクトではインターフェイス要求が発生し、これによってデータ転送の速度が低下します。
また、Microsoft Windows 95、Microsoft Windows 98 および Microsoft Windows Millennium Edition (Me) ではインターフェイス要求のサイズに 64 KB の制限があります。インターフェイス要求のサイズが 64 KB の制限を超えると、オートメーション サーバー (Excel) が応答を停止するか、メモリ不足のエラー メッセージが表示されることがあります。 関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
216400 [PRB] Windows 95/98 でプロセス間の COM オートメーションによりクライアント アプリケーションがハングする
前述のとおり、セルごとにデータを転送する方法が適切なのは、データ量が少ない場合に限られます。大量のデータを転送する必要がある場合は、この資料で後述されている、大量のデータ転送に適した他のアプローチを検討してください。

関連情報および Visual Basic .NET を使用した Excel オートメーションのサンプルの関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
301982 Visual Basic .NET を使用して Microsoft Excel を自動化する方法

オートメーションを使用してデータの配列をワークシートの特定のセル範囲に転送する

データ配列を、次のように複数のセル範囲に一度に転送できます。
        Dim oExcel As Object
        Dim oBook As Object
        Dim oSheet As Object

        'Start a new workbook in Excel.
        oExcel = CreateObject("Excel.Application")
        oBook = oExcel.Workbooks.Add

        'Create an array with 3 columns and 100 rows.
        Dim DataArray(99, 2) As Object
        Dim r As Integer
        For r = 0 To 99
            DataArray(r, 0) = "ORD" & Format(r + 1, "0000")
            DataArray(r, 1) = Rnd() * 1000
            DataArray(r, 2) = DataArray(r, 1) * 0.07
        Next

        'Add headers to the worksheet on row 1.
        oSheet = oBook.Worksheets(1)
        oSheet.Range("A1").Value = "Order ID"
        oSheet.Range("B1").Value = "Amount"
        oSheet.Range("C1").Value = "Tax"

        'Transfer the array to the worksheet starting at cell A2.
        oSheet.Range("A2").Resize(100, 3).Value = DataArray

        'Save the Workbook and quit Excel.
        oBook.SaveAs(sSampleFolder & "Book2.xls")
        oSheet = Nothing
        oBook = Nothing
        oExcel.Quit()
        oExcel = Nothing
        GC.Collect()
				
セルごとに転送する代わりに配列を使用すると、大量のデータを転送する際にパフォーマンスの大幅な向上を実感できます。上記のコードから抜粋した次の行では、ワークシートの中にある 300 のセルにデータを転送します。
        oSheet.Range("A2").Resize(100, 3).Value = DataArray
				
このコード行では、2 つのインターフェイス要求が発生します。1 つは Range メソッドが返す Range オブジェクトで、もう 1 つは Resize メソッドが返す Range オブジェクトで発生します。一方、セルごとにデータを転送する方法では、Range オブジェクトへの 300 個のインターフェイスに対して要求が発生します。配列を利用できる場合は、データを一度に転送してインターフェイス要求の回数を低減することにより、処理の効率が向上します。

オートメーションを使用して ADO レコードセットをワークシートの範囲に転送する

Excel 2000 および Excel 2002 のオブジェクト モデルでは、ADO レコードセットをワークシートの特定の範囲に転送するための CopyFromRecordset メソッドが提供されています。次のコードでは、CopyFromRecordset メソッドを使用して Northwind サンプル データベースの [受注] テーブルから Excel にデータを自動転送する方法を示します。
        'Create a Recordset from all the records in the Orders table.
        Dim sNWind As String
        Dim conn As New ADODB.Connection()
        Dim rs As ADODB.Recordset
        conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
            sNorthwind & ";")
        conn.CursorLocation = ADODB.CursorLocationEnum.adUseClient
        rs = conn.Execute("受注", , ADODB.CommandTypeEnum.adCmdTable)

        'Create a new workbook in Excel.
        Dim oExcel As Object
        Dim oBook As Object
        Dim oSheet As Object
        oExcel = CreateObject("Excel.Application")
        oBook = oExcel.Workbooks.Add
        oSheet = oBook.Worksheets(1)

        'Transfer the field names to Row 1 of the worksheet:
        'Note: CopyFromRecordset copies only the data and not the field
        '      names, so you can transfer the fieldnames by traversing the
        '      fields collection.
        Dim n As Int32
        For n = 1 To rs.Fields.Count
            oSheet.Cells(1, n).Value = rs.Fields(n - 1).Name
        Next

        'Transfer the data to Excel.
        oSheet.Range("A2").CopyFromRecordset(rs)

        'Save the workbook and quit Excel.
        oBook.SaveAs(sSampleFolder & "Book3.xls")
        oSheet = Nothing
        oBook = Nothing
        oExcel.Quit()
        oExcel = Nothing
        GC.Collect()

        'Close the connection
        rs.Close()
        conn.Close()
				
: CopyFromRecordset は ADO の Recordset オブジェクトに対してのみ有効です。ADO.NET を使用して作成したデータセットに対して CopyFromRecordset メソッドを使用することはできません。ADO.NET を使用してデータを Excel に転送する方法については、後述するいくつかの例で説明します。

オートメーションを使用して QueryTable オブジェクトをワークシート上に作成する

QueryTable オブジェクトは、外部のデータ ソースから返されたデータを使用して作成されたテーブルを表します。Excel を自動化する場合、OLE DB、または SQL (Structured Query Language) 文字列が設定された ODBC データ ソースへの接続文字列を与えることによって QueryTable を作成することができます。レコードセットは Excel で作成され、ワークシートの指定した位置に挿入されます。QueryTable オブジェクトを使用する場合、CopyFromRecordset メソッドを使用する場合と比較して以下のような長所があります。
  • レコードセットの作成およびワークシートへの配置が Excel 側で実行されます。
  • クエリを QueryTable オブジェクトに保存して後から更新することにより、更新されたレコードセットを取り出すことができます。
  • ワークシートに QueryTable を新規に追加すると、ワークシートのセルにあるデータを使用して新しいデータを取得するように指定できます (詳細については RefreshStyle プロパティを参照してください)。
次のコードでは、Northwind サンプル データベースを使用して、Excel 2000 または Excel 2002 のワークシートに QueryTable オブジェクトを自動的に新規作成する方法を示します。
        'Create a new workbook in Excel.
        Dim oExcel As Object
        Dim oBook As Object
        Dim oSheet As Object
        oExcel = CreateObject("Excel.Application")
        oBook = oExcel.Workbooks.Add
        oSheet = oBook.Worksheets(1)

        'Create the QueryTable object.
        Dim oQryTable As Object
        oQryTable = oSheet.QueryTables.Add( _
        "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
            sNorthwind & ";", oSheet.Range("A1"), _
            "Select * from 受注")
        oQryTable.RefreshStyle = 2 ' xlInsertEntireRows = 2
        oQryTable.Refresh(False)

        'Save the workbook and quit Excel.
        oBook.SaveAs(sSampleFolder & "Book4.xls")
        oQryTable = Nothing
        oSheet = Nothing
        oBook = Nothing
        oExcel.Quit()
        oExcel = Nothing
				

クリップボードを使用する

クリップボードを経由してデータをワークシートに転送することができます。ワークシートの複数のセルにデータを貼り付けるには、タブ文字で列を、改行文字で行を区切った文字列をコピーします。次のコードでは、Visual Basic .NET を使用してクリップボードの内容を Excel に転送する方法を示します。
        'Copy a string to the Clipboard.
        Dim sData As String
        sData = "FirstName" & vbTab & "LastName" & vbTab & "Birthdate" & vbCr _
            & "Bill" & vbTab & "Brown" & vbTab & "2/5/85" & vbCr _
            & "Joe" & vbTab & "Thomas" & vbTab & "1/1/91"
        System.Windows.Forms.Clipboard.SetDataObject(sData)

        'Create a workbook in Excel.
        Dim oExcel As Object
        Dim oBook As Object
        oExcel = CreateObject("Excel.Application")
        oBook = oExcel.Workbooks.Add

        'Paste the data.
        oBook.Worksheets(1).Range("A1").Select()
        oBook.Worksheets(1).Paste()

        'Save the workbook and quit Excel.
        oBook.SaveAs(sSampleFolder & "Book5.xls")
        oBook = Nothing
        oExcel.Quit()
        oExcel = Nothing
        GC.Collect()
				

Excel で行と列が適切に区切られるように、区切り文字の入ったテキスト ファイルを作成する

Excel では、タブ区切りまたはコンマ区切りのファイルを開き、正しく解析してセルに配置することができます。この機能はオートメーションをほとんど使用せずに、大容量のデータをワークシートに変換するのに適しています。テキスト ファイルはサーバー側で生成できるため、これはクライアント/サーバー型のアプリケーションに適したアプローチです。その後クライアント側で、必要に応じてオートメーションを使用し、テキストを開きます。

次のコードでは、ADO.NET を使用して読み出したデータをタブ区切りテキスト ファイルに変換する方法を示します。
        'Connect to the data source.
        Dim objConn As New System.Data.OleDb.OleDbConnection( _
            "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sNorthwind & ";")
        objConn.Open()

        'Execute a command to retrieve all records from the Employees table.
        Dim objCmd As New System.Data.OleDb.OleDbCommand( _
            "Select * From 社員", objConn)
        Dim objReader As System.Data.OleDb.OleDbDataReader
        objReader = objCmd.ExecuteReader()

        'Read the records in the dataset and write select fields to the 
        'output file.
        FileOpen(1, sSampleFolder & "Book6.txt", OpenMode.Output)
        Dim i As Integer, s As String
        While objReader.Read()
            'Loop through first 6 fields and concatenate
            'each field, separated by a tab, into s variable.
            s = ""
            For i = 0 To 5
                If Not objReader.IsDBNull(i) Then
                    If i = 0 Then 'field 1 is EmployeeId
                        s = s & objReader.GetInt32(i).ToString
                    ElseIf i = 5 Then 'field 6 is BirthDate
                        s = s & objReader.GetDateTime(i)
                    Else 'field is a text field
                        s = s & objReader.GetString(i)
                    End If
                End If
                s = s & Microsoft.VisualBasic.ControlChars.Tab
            Next
            PrintLine(1, s)
        End While
        FileClose(1)

        'Close the reader and the connection.
        objReader.Close()
        objConn.Close()
				
上記のコードではオートメーションは使用していませんが、次のように、必要に応じてオートメーションを使用してテキスト ファイルを開き、Excel ブック形式でファイルに保存することもできます。
        'Create a new instance of Excel.
        Dim oExcel As Object
        oExcel = CreateObject("Excel.Application")

        'Open the text file and save it in the Excel workbook format.
        oExcel.Workbooks.OpenText(sSampleFolder & "Book6.txt", _
            , , , -4142, , True) 'xlTextQualifierNone=-4142

        oExcel.ActiveWorkbook.SaveAs(sSampleFolder & "Book6.xls", _
            -4143) 'xlWorkbookNormal = -4143

        'Quit Excel.
        oExcel.Quit()
        oExcel = Nothing
        GC.Collect()
				

ADO.NET を使用してデータをワークシートに変換する

Microsoft Jet OLE DB プロバイダを使用して Excel ブック上のテーブルにレコードを追加することができます。Excel における "テーブル" とは、単に特定のセル範囲を意味します。このセル範囲には定義名が付けられていることがあります。通常セル範囲の最初の行にヘッダー (またはフィールド名) が含まれ、ヘッダーに続く行がレコードとなります。

次のコードでは、Book7.xls のテーブルにレコードを 2 つ追加します。この例では、Sheet1 にテーブルが含まれています。
       'Establish a connection to the data source.
        Dim sConnectionString As String
        sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & sSampleFolder & _
            "Book7.xls;Extended Properties=Excel 8.0;"
        Dim objConn As New System.Data.OleDb.OleDbConnection(sConnectionString)
        objConn.Open()

        'Add two records to the table.
        Dim objCmd As New System.Data.OleDb.OleDbCommand()
        objCmd.Connection = objConn
        objCmd.CommandText = "Insert into [Sheet1$] (FirstName, LastName)" & _
            " values ('Bill', 'Brown')"
        objCmd.ExecuteNonQuery()
        objCmd.CommandText = "Insert into [Sheet1$] (FirstName, LastName)" & _
            " values ('Joe', 'Thomas')"
        objCmd.ExecuteNonQuery()

        'Close the connection.
        objConn.Close()
				
この例に従って ADO.NET を使用してレコードを追加すると、ブック内の書式が保たれます。追加されるそれぞれの行の書式には、直前の行の書式が引き継がれます。たとえば、セル B1 の書式が右揃えになっている場合、列 B に追加される新しいフィールドは右揃えになります。

ワークシートの 1 つ以上のセルにレコードを追加する場合、セルに格納されているデータはすべて上書きされることに注意してください。つまり、新しいレコードを追加する場合、ワークシートの行は下に移動されません。ADO.NET を使用して新しいレコードを挿入する場合、ワークシート上のデータのレイアウトを設計するうえでこの点に注意する必要があります。

ADO.NET の使用方法の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
301075 ADO.NET と Visual Basic .NET を使用して、データベースに接続し、コマンドを実行する方法
301216 Visual Basic .NET を使用してデータベースから DataSet オブジェクトを取得する方法
301248 Visual Basic .NET を使用して DataSet オブジェクトからデータベースを更新する方法
Excel データ ソースによる Jet OLE DB プロバイダの使用方法の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
278973 ADO を使用して Excel ブックのデータの読み取りおよび書き込みを行う方法 (ExcelADO)
257819 [HOWTO] Visual Basic または VBA から ADO を Excel データで使用する

XML データを転送する (Excel 2002 のみ)

Excel 2002 では、あらゆる整形式 (well-formed) XML ファイルを開くことができます。[ファイル] メニューの [開く] を使用して XML ファイルを直接開くことも、プログラムから Workbooks コレクションの Open メソッドまたは OpenXML メソッドを使用して開くこともできます。Excel 用の XML ファイルを作成する場合、データに書式を設定するスタイル シートを作成することもできます。

Excel 2002 で XML を使用する方法の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
307021 [HOWTO] Visual Basic .NET を使用して XML データを Microsoft Excel 2002 に転送する方法
288215 [INFO] Microsoft Excel 2002 と XML

Visual Basic .NET プロジェクトの完全なサンプルを作成する

  1. サンプルで作成される Excel ブックを保存するためのフォルダを新規に作成し、そのフォルダに C:\ExcelData という名前を付けます。
  2. 以下の手順を実行して、サンプルで使用するブックを新規作成します。
    1. Excel で新しいブックを作成します。
    2. 新しいブックの Sheet1 で、セル A1 に FirstName、セル B1 に LastName と入力します。
    3. ブックを C:\ExcelData\Book7.xls として保存します。
  3. Visual Studio .NET を起動します。[ファイル] メニューの [新規作成] をクリックして、[プロジェクト] をクリックします。Visual Basic プロジェクトの種類の一覧の [Windows アプリケーション] をクリックします。デフォルトで Form1 が作成されます。
  4. 以下の手順を実行して、Excel オブジェクト ライブラリへの参照を追加します。
    1. [プロジェクト] メニューの [参照の追加] をクリックします。
    2. [COM] タブで、[Microsoft Excel 10.0 Object Library] をクリックし、[選択] をクリックします。

      : Microsoft Office XP プライマリ相互運用機能アセンブリ (PIA) をまだ入手していない場合は、ダウンロードしてインストールすることをお勧めします。 Office XP の PIA の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
      328912 Microsoft Office XP 用の PIA (Primary Interop Assemblies) のダウンロード
    3. [COM] タブの [Microsoft ActiveX Data Objects 2.7 Library] をクリックし、[選択] をクリックします。
    4. [参照の追加] ダイアログ ボックスで [OK] をクリックして、選択を確定します。選択したライブラリのラッパーを生成するかどうかを確認するメッセージが表示されたら、[はい] をクリックします。
  5. ツールボックスの ComboBox コントロールと Button コントロールを Form1 に追加します。
  6. Form1 に次のコードを追加します。
        Const sSampleFolder = "C:\ExcelData\"
        Const sNorthwind = "C:\Program Files\Microsoft Office\Office10\Samples\Northwind.mdb"
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
          Handles MyBase.Load
            ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
            Dim aList As String() = _
                {"Use Automation to Transfer Data Cell by Cell ", _
                 "Use Automation to Transfer an Array of Data to a Range on a Worksheet ", _
                 "Use Automation to Transfer an ADO Recordset to a Worksheet Range ", _
                 "Use Automation to Create a QueryTable on a Worksheet", _
                 "Use the Clipboard", _
                 "Create a Delimited Text File that Excel Can Parse into Rows and Columns", _
                 "Transfer Data to a Worksheet Using ADO.NET "}
            ComboBox1.Items.AddRange(aList)
            ComboBox1.SelectedIndex = 0
            Button1.Text = "Go!"
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
          Handles Button1.Click
            Select Case ComboBox1.SelectedIndex
                Case 0 : Automation_CellByCell()
                Case 1 : Automation_UseArray()
                Case 2 : Automation_ADORecordset()
                Case 3 : Automation_QueryTable()
                Case 4 : Use_Clipboard()
                Case 5 : Create_TextFile()
                Case 6 : Use_ADONET()
            End Select
            GC.Collect()
        End Sub
    
        Private Function Automation_CellByCell()
            Dim oExcel As Object
            Dim oBook As Object
            Dim oSheet As Object
    
            'Start a new workbook in Excel.
            oExcel = CreateObject("Excel.Application")
            oBook = oExcel.Workbooks.Add
    
            'Add data to cells of the first worksheet in the new workbook.
            oSheet = oBook.Worksheets(1)
            oSheet.Range("A1").Value = "Last Name"
            oSheet.Range("B1").Value = "First Name"
            oSheet.Range("A1:B1").Font.Bold = True
            oSheet.Range("A2").Value = "Doe"
            oSheet.Range("B2").Value = "John"
    
            'Save the workbook and quit Excel.
            oBook.SaveAs(sSampleFolder & "Book1.xls")
            oSheet = Nothing
            oBook = Nothing
            oExcel.Quit()
            oExcel = Nothing
            GC.Collect()
        End Function
    
        Private Function Automation_UseArray()
            Dim oExcel As Object
            Dim oBook As Object
            Dim oSheet As Object
    
            'Start a new workbook in Excel.
            oExcel = CreateObject("Excel.Application")
            oBook = oExcel.Workbooks.Add
    
            'Create an array with 3 columns and 100 rows.
            Dim DataArray(99, 2) As Object
            Dim r As Integer
            For r = 0 To 99
                DataArray(r, 0) = "ORD" & Format(r + 1, "0000")
                DataArray(r, 1) = Rnd() * 1000
                DataArray(r, 2) = DataArray(r, 1) * 0.07
            Next
    
            'Add headers to the worksheet on row 1.
            oSheet = oBook.Worksheets(1)
            oSheet.Range("A1").Value = "Order ID"
            oSheet.Range("B1").Value = "Amount"
            oSheet.Range("C1").Value = "Tax"
    
            'Transfer the array to the worksheet starting at cell A2.
            oSheet.Range("A2").Resize(100, 3).Value = DataArray
    
            'Save the workbook and quit Excel.
            oBook.SaveAs(sSampleFolder & "Book2.xls")
            oSheet = Nothing
            oBook = Nothing
            oExcel.Quit()
            oExcel = Nothing
            GC.Collect()
        End Function
    
        Private Function Automation_ADORecordset()
            'Create a Recordset from all the records in the Orders table.
            Dim sNWind As String
            Dim conn As New ADODB.Connection()
            Dim rs As ADODB.Recordset
            conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
                sNorthwind & ";")
            conn.CursorLocation = ADODB.CursorLocationEnum.adUseClient
            rs = conn.Execute("受注", , ADODB.CommandTypeEnum.adCmdTable)
    
            'Create a new workbook in Excel.
            Dim oExcel As Object
            Dim oBook As Object
            Dim oSheet As Object
            oExcel = CreateObject("Excel.Application")
            oBook = oExcel.Workbooks.Add
            oSheet = oBook.Worksheets(1)
    
            'Transfer the field names to Row 1 of the worksheet:
            'Note: CopyFromRecordset copies only the data and not the field
            '      names, so you can transfer the fieldnames by traversing the
            '      fields collection.
            Dim n As Int32
            For n = 1 To rs.Fields.Count
                oSheet.Cells(1, n).Value = rs.Fields(n - 1).Name
            Next
    
            'Transfer the data to Excel.
            oSheet.Range("A2").CopyFromRecordset(rs)
    
            'Save the workbook and quit Excel.
            oBook.SaveAs(sSampleFolder & "Book3.xls")
            oSheet = Nothing
            oBook = Nothing
            oExcel.Quit()
            oExcel = Nothing
            GC.Collect()
    
            'Close the connection.
            rs.Close()
            conn.Close()
        End Function
    
        Private Function Automation_QueryTable()
            'Create a new workbook in Excel.
            Dim oExcel As Object
            Dim oBook As Object
            Dim oSheet As Object
            oExcel = CreateObject("Excel.Application")
            oBook = oExcel.Workbooks.Add
            oSheet = oBook.Worksheets(1)
    
            'Create the QueryTable object.
            Dim oQryTable As Object
            oQryTable = oSheet.QueryTables.Add( _
            "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
                sNorthwind & ";", oSheet.Range("A1"), _
                "Select * from 受注")
            oQryTable.RefreshStyle = 2 ' xlInsertEntireRows = 2
            oQryTable.Refresh(False)
    
            'Save the workbook and quit Excel.
            oBook.SaveAs(sSampleFolder & "Book4.xls")
            oQryTable = Nothing
            oSheet = Nothing
            oBook = Nothing
            oExcel.Quit()
    
    
            oExcel = Nothing
    
        End Function
    
        Private Function Use_Clipboard()
            'Copy a string to the clipboard.
            Dim sData As String
            sData = "FirstName" & vbTab & "LastName" & vbTab & "Birthdate" & vbCr _
                & "Bill" & vbTab & "Brown" & vbTab & "2/5/85" & vbCr _
                & "Joe" & vbTab & "Thomas" & vbTab & "1/1/91"
            System.Windows.Forms.Clipboard.SetDataObject(sData)
    
            'Create a new workbook in Excel.
            Dim oExcel As Object
            Dim oBook As Object
            oExcel = CreateObject("Excel.Application")
            oBook = oExcel.Workbooks.Add
    
            'Paste the data.
            oBook.Worksheets(1).Range("A1").Select()
            oBook.Worksheets(1).Paste()
    
            'Save the workbook and quit Excel.
            oBook.SaveAs(sSampleFolder & "Book5.xls")
            oBook = Nothing
            oExcel.Quit()
            oExcel = Nothing
            GC.Collect()
        End Function
    
        Private Function Create_TextFile()
            'Connect to the data source.
            Dim objConn As New System.Data.OleDb.OleDbConnection( _
                "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sNorthwind & ";")
            objConn.Open()
    
            'Run a command to retrieve all records from the Employees table.
            Dim objCmd As New System.Data.OleDb.OleDbCommand( _
                "Select * From 社員", objConn)
            Dim objReader As System.Data.OleDb.OleDbDataReader
            objReader = objCmd.ExecuteReader()
    
            'Read the records in the dataset and write select fields to the 
            'output file.
            FileOpen(1, sSampleFolder & "Book6.txt", OpenMode.Output)
            Dim i As Integer, s As String
            While objReader.Read()
                'Loop through first 6 fields and concatenate
                'each field, separated by a tab, into s variable.
                s = ""
                For i = 0 To 5
                    If Not objReader.IsDBNull(i) Then
                        If i = 0 Then 'field 1 is EmployeeId
                            s = s & objReader.GetInt32(i).ToString
                        ElseIf i = 5 Then 'field 6 is BirthDate
                            s = s & objReader.GetDateTime(i)
                        Else 'field is a text field
                            s = s & objReader.GetString(i)
                        End If
                    End If
                    s = s & Microsoft.VisualBasic.ControlChars.Tab
                Next
                PrintLine(1, s)
            End While
            FileClose(1)
    
            'Close the reader and the connection.
            objReader.Close()
            objConn.Close()
    
            'Create a new instance of Excel.
            Dim oExcel As Object
            oExcel = CreateObject("Excel.Application")
    
            'Open the text file and save it in the Excel workbook format.
            oExcel.Workbooks.OpenText(sSampleFolder & "Book6.txt", _
                , , , -4142, , True) 'xlTextQualifierNone=-4142
    
            oExcel.ActiveWorkbook.SaveAs(sSampleFolder & "Book6.xls", _
                -4143) 'xlWorkbookNormal = -4143
    
            'Quit Excel.
            oExcel.Quit()
            oExcel = Nothing
            GC.Collect()
        End Function
    
        Private Function Use_ADONET()
    
            'Verify that the workbook to write to does exist.
            Dim sFile As String = sSampleFolder & "Book7.xls"
            If Dir(sFile) = "" Then
                MsgBox("Please create the workbook Book7.xls and try again.")
                Exit Function
            End If
    
            'Establish a connection to the data source.
            Dim sConnectionString As String
            sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=" & sSampleFolder & _
                "Book7.xls;Extended Properties=Excel 8.0;"
            Dim objConn As New System.Data.OleDb.OleDbConnection(sConnectionString)
            objConn.Open()
    
            'Add two records to the table named 'MyTable'.
            Dim objCmd As New System.Data.OleDb.OleDbCommand()
            objCmd.Connection = objConn
            objCmd.CommandText = "Insert into [Sheet1$] (FirstName, LastName)" & _
                " values ('Bill', 'Brown')"
            objCmd.ExecuteNonQuery()
            objCmd.CommandText = "Insert into [Sheet1$] (FirstName, LastName)" & _
                " values ('Joe', 'Thomas')"
            objCmd.ExecuteNonQuery()
    
            'Close the connection.
            objConn.Close()
        End Function
    					
    : Office プログラムがデフォルトのフォルダ (C:\Program Files\Microsoft Office) にインストールされていない場合、コード サンプルの sNorthwind 定数を変更して、インストールされている Northwind.mdb へのパスに合わせます。

  7. Form1.vb ファイルの先頭に次のコードを追加します。
    Imports Microsoft.Office.Interop
    					
  8. F5 キーを押してサンプル プログラムをビルドし、実行します。

関連情報

詳細については、次の MSDN (Microsoft Developer Network) Web サイトを参照してください。
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx
関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
247412 [XL2003] [INFO] Visual Basic から Excel にデータを転送する方法

プロパティ

文書番号: 306022 - 最終更新日: 2007年1月17日 - リビジョン: 6.1
この資料は以下の製品について記述したものです。
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft ADO.NET (included with the .NET Framework)
キーワード:?
kbhowtomaster kbautomation KB306022
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com