Visual C# を使用して、配列を使用して範囲内のデータを入力または取得することによって Excel を自動化する方法

概要

この記事では、microsoft Visual c# 2005 または Microsoft Visual C# .NET を使用して Microsoft Excel を自動化し、配列を使用して複数のセル範囲の値を入力および取得する方法について説明します。

詳細

複数のセル範囲にセルを1つずつ入力せずに値を設定するには、Range オブジェクトの Value プロパティを2次元配列に設定します。 同様に、Value プロパティを使用すると、複数のセルの値の2次元配列を一度に取得できます。 次の手順では、2次元配列を使用してデータを設定および取得するためのプロセスを示します。

Microsoft Excel のオートメーションクライアントを構築する

  1. Microsoft Visual Studio 2005 または Microsoft Visual Studio .NET を起動します。

  2. [ファイル] メニューの [新規作成] をクリックし、[プロジェクト] をクリックします。 Visual C# プロジェクトの種類から [Windows アプリケーション] を選択します。 Form1 は既定で作成されます。

  3. Visual Studio 2005 または Visual Studio .NET の Microsoft Excel オブジェクトライブラリにMicrosoft excel 11.0 オブジェクトライブラリへの参照を追加します。 これを行うには、次の手順を実行します。

    1. [ プロジェクト] メニューの [ 参照の追加] をクリックします。
    2. [COM] タブで、[Microsoft Excel オブジェクトライブラリ] を見つけ、[選択] をクリックします。

    Visual Studio 2005 で、[ COM ] タブの [ Microsoft Excel 11.0 オブジェクトライブラリ] を探します。

    メモMicrosoft Office 2003 には、プライマリ相互運用機能アセンブリ (Pia) が含まれています。 Microsoft Office XP には Pia は含まれていませんが、ダウンロードすることができます。

  4. [参照の追加] ダイアログボックスで [OK] をクリックして、選択内容を確定します。 選択したライブラリのラッパーを生成するかどうかを確認するメッセージが表示されたら、[はい] をクリックします。

  5. [表示] メニューの [ツールボックス] を選択して、ツールボックスを表示します。 Form1 に2つのボタンとチェックボックスを追加します。

  6. チェックボックスの名前とテキストプロパティを、FillWithStrings に設定します。

  7. [Button1] をダブルクリックします。 フォームの [コード] ウィンドウが表示されます。

  8. [コード] ウィンドウで、次のコードを置き換えます。

    private void button1_Click(object sender, System.EventArgs e)
    {
    }
    

       //Declare these two variables globally so you can access them from both
       //Button1 and Button2.
       Excel.Application objApp;
       Excel._Workbook objBook;
    
    private void button1_Click(object sender, System.EventArgs e)
       {
          Excel.Workbooks objBooks;
          Excel.Sheets objSheets;
          Excel._Worksheet objSheet;
          Excel.Range range;
    
    try
          {
             // Instantiate Excel and start a new workbook.
             objApp = new Excel.Application();
             objBooks = objApp.Workbooks;
             objBook = objBooks.Add( Missing.Value );
             objSheets = objBook.Worksheets;
             objSheet = (Excel._Worksheet)objSheets.get_Item(1);
    
    //Get the range where the starting cell has the address
             //m_sStartingCell and its dimensions are m_iNumRows x m_iNumCols.
             range = objSheet.get_Range("A1", Missing.Value);
             range = range.get_Resize(5, 5);
    
    if (this.FillWithStrings.Checked == false)
             {
                //Create an array.
                double[,] saRet = new double[5, 5];
    
    //Fill the array.
                for (long iRow = 0; iRow < 5; iRow++)
                {
                   for (long iCol = 0; iCol < 5; iCol++)
                   {
                      //Put a counter in the cell.
                      saRet[iRow, iCol] = iRow * iCol;
                   }
                }
    
    //Set the range value to the array.
                range.set_Value(Missing.Value, saRet );
             }
    
    else
             {
                //Create an array.
                string[,] saRet = new string[5, 5];
    
    //Fill the array.
                for (long iRow = 0; iRow < 5; iRow++)
                {
                   for (long iCol = 0; iCol < 5; iCol++)
                   {
                      //Put the row and column address in the cell.
                      saRet[iRow, iCol] = iRow.ToString() + "|" + iCol.ToString();
                   }
                }
    
    //Set the range value to the array.
                range.set_Value(Missing.Value, saRet );
             }
    
    //Return control of Excel to the user.
             objApp.Visible = true;
             objApp.UserControl = true;
          }
          catch( Exception theException ) 
          {
             String errorMessage;
             errorMessage = "Error: ";
             errorMessage = String.Concat( errorMessage, theException.Message );
             errorMessage = String.Concat( errorMessage, " Line: " );
             errorMessage = String.Concat( errorMessage, theException.Source );
    
    MessageBox.Show( errorMessage, "Error" );
          }
       }
    

    メモVisual Studio 2005 でコードを変更する必要があります。 既定では、Visual C# は、Windows フォームプロジェクトを作成するときに、プロジェクトにフォームを1つ追加します。 Form には、Form1 という名前が付けられます。 フォームを表す2つのファイルは、Form1.cs と Form1.designer.cs という名前です。 Form1.cs にコードを記述します。 Form1.designer.cs ファイルには、ツールボックスからコントロールをドラッグアンドドロップすることによって実行したすべてのアクションを実装するコードが、Windows フォームデザイナーによって記述されています。

    Visual C# 2005 の Windows フォームデザイナーの詳細については、次の Microsoft Developer Network (MSDN) Web サイトを参照してください。

    プロジェクトを作成する (Visual C#)

  9. Form1 のデザインビューに戻り、[Button2] をダブルクリックします。

  10. [コード] ウィンドウで、次のコードを置き換えます。

private void button2_Click(object sender, System.EventArgs e)
{
}

private void button2_Click(object sender, System.EventArgs e)
   {
      Excel.Sheets objSheets;
      Excel._Worksheet objSheet;
      Excel.Range range;

try
      {
         try
         {
            //Get a reference to the first sheet of the workbook.
            objSheets = objBook.Worksheets;
            objSheet = (Excel._Worksheet)objSheets.get_Item(1);
         }

catch( Exception theException ) 
         {
            String errorMessage;
            errorMessage = "Can't find the Excel workbook.  Try clicking Button1 " +
               "to create an Excel workbook with data before running Button2.";

MessageBox.Show( errorMessage, "Missing Workbook?");

//You can't automate Excel if you can't find the data you created, so 
            //leave the subroutine.
            return;
         }

//Get a range of data.
         range = objSheet.get_Range("A1", "E5");

//Retrieve the data from the range.
         Object[,] saRet;
         saRet = (System.Object[,])range.get_Value( Missing.Value );

//Determine the dimensions of the array.
         long iRows;
         long iCols;
         iRows = saRet.GetUpperBound(0);
         iCols = saRet.GetUpperBound(1);

//Build a string that contains the data of the array.
         String valueString;
         valueString = "Array Data\n";

for (long rowCounter = 1; rowCounter <= iRows; rowCounter++)
         {
            for (long colCounter = 1; colCounter <= iCols; colCounter++)
            {

//Write the next value into the string.
               valueString = String.Concat(valueString,
                  saRet[rowCounter, colCounter].ToString() + ", ");
            }

//Write in a new line.
            valueString = String.Concat(valueString, "\n");
         }

//Report the value of the array.
         MessageBox.Show(valueString, "Array Values");
      }

catch( Exception theException ) 
      {
         String errorMessage;
         errorMessage = "Error: ";
         errorMessage = String.Concat( errorMessage, theException.Message );
         errorMessage = String.Concat( errorMessage, " Line: " );
         errorMessage = String.Concat( errorMessage, theException.Source );

MessageBox.Show( errorMessage, "Error" );
      }
   }
  1. [コード] ウィンドウの一番上までスクロールします。 Using ディレクティブのリストの末尾に次の行を追加します。

    using System.Reflection; 
    using Excel =  Microsoft.Office.Interop.Excel;
    

オートメーションクライアントをテストする

  1. F5 キーを押して、サンプルプログラムをビルドして実行します。
  2. [Button1] をクリックします。 プログラムは、新しいブックで Excel を起動し、配列の数値データを含む最初のワークシートのセル範囲 A1: E5 を設定します。
  3. [Button2] をクリックします。 プログラムは、セル範囲 A1: E5 のデータを新しい配列に取得し、結果をメッセージボックスに表示します。
  4. [FillWithStrings] を選択し、[Button1] をクリックしてセル A1: E5 に文字列データを入力します。

References

詳細については、次の Microsoft Developer Network (MSDN) Web サイトを参照してください。

Visual Studio を使用した Microsoft Office 開発