フォーム
Excel操作:新規作成・ファイルオープンに機能追加して、Excelブック名 と Excelシート名を表示出来るように、コンボボックス と リストボックスを追加しました。
追加機能は、【新規】【開く】ボタンを押すとExcelを起動しますが、その直後にExcel情報として、ブック名・ファイルパス・シート数・シート名を取得し、コンボボックスには起動したブック名をセットするようにします。
変数・構造体
バラバラに変数宣言するより、1ブック1構造体とし、この構造体を配列にした方が整理しやすいです。
C#では、構造体の中に配列を作るには、下記のようにコーディングします。( C や VB とは勝手が違っているので注意)
→ オブジェクトの生成:Excel操作:新規作成・ファイルオープン参照
/*-------------------------------------*
* 【構造体】Excel情報
*-------------------------------------*/
public struct stExcelInfo
{
public string BookName; // ブック名
public string Path; // パス
public int SheetCNT; // シート数
public string[] SheetName; // シート名
public void Reset() { SheetName = new string[100]; }
}
/* 【配列】Excel情報 */
public static stExcelInfo[] ExcelInfo = new stExcelInfo[100];
/* Excelブック数 */
public static int intExcelInfoCNT;
* 【構造体】Excel情報
*-------------------------------------*/
public struct stExcelInfo
{
public string BookName; // ブック名
public string Path; // パス
public int SheetCNT; // シート数
public string[] SheetName; // シート名
public void Reset() { SheetName = new string[100]; }
}
/* 【配列】Excel情報 */
public static stExcelInfo[] ExcelInfo = new stExcelInfo[100];
/* Excelブック数 */
public static int intExcelInfoCNT;
Excelファイルの情報取得
ExcelApp.Workbooks をループしながらブック名・パス・シート数を取得します。シート数を取得したら、シート数分ループしてシート名を取得します。注意点は、シートのindexは1から開始のため、ループで変数を初期値0とすると+1が必要です。
また、普通の配列・構造体を使用する場合、Reset()処理は不要ですが、今回、構造体に配列を宣言しているので、この記述をしなければエラーとなります。
/**********************************************
* Excelファイルの情報取得
**********************************************/
public void GetExcelInfo()
{
/* Excelブック関連の変数初期化 */
intExcelInfoCNT = 0;
ExcelInfo = new stExcelInfo[100];
/* ループ:Excelブック数分 */
foreach (Microsoft.Office.Interop.Excel.Workbook WB in ExcelApp.Workbooks )
{
/* 【構造体】Excel情報内の配列設定 */
ExcelInfo[intExcelInfoCNT].Reset();
/* ブック名取得 */
ExcelInfo[intExcelInfoCNT].BookName = WB.Name.ToString();
/* パス取得 */
ExcelInfo[intExcelInfoCNT].Path = WB.Path.ToString();
/* シート数取得 */
ExcelInfo[intExcelInfoCNT].SheetCNT = WB.Sheets.Count;
/* ループ:シート数分 */
for (int i = 0; i < ExcelInfo[intExcelInfoCNT].SheetCNT; i++)
{
/* ワークシートオブジェクトの取得 */
ExcelWS = (Worksheet)WB.Sheets[i + 1];
/* ワークシート名取得 */
ExcelInfo[intExcelInfoCNT].SheetName[i] = ExcelWS.Name.ToString();
}
/* Excelブック数のカウント */
intExcelInfoCNT++;
}
}
* Excelファイルの情報取得
**********************************************/
public void GetExcelInfo()
{
/* Excelブック関連の変数初期化 */
intExcelInfoCNT = 0;
ExcelInfo = new stExcelInfo[100];
/* ループ:Excelブック数分 */
foreach (Microsoft.Office.Interop.Excel.Workbook WB in ExcelApp.Workbooks )
{
/* 【構造体】Excel情報内の配列設定 */
ExcelInfo[intExcelInfoCNT].Reset();
/* ブック名取得 */
ExcelInfo[intExcelInfoCNT].BookName = WB.Name.ToString();
/* パス取得 */
ExcelInfo[intExcelInfoCNT].Path = WB.Path.ToString();
/* シート数取得 */
ExcelInfo[intExcelInfoCNT].SheetCNT = WB.Sheets.Count;
/* ループ:シート数分 */
for (int i = 0; i < ExcelInfo[intExcelInfoCNT].SheetCNT; i++)
{
/* ワークシートオブジェクトの取得 */
ExcelWS = (Worksheet)WB.Sheets[i + 1];
/* ワークシート名取得 */
ExcelInfo[intExcelInfoCNT].SheetName[i] = ExcelWS.Name.ToString();
}
/* Excelブック数のカウント */
intExcelInfoCNT++;
}
}
Excel情報の表示
上記「Excelファイルの情報取得」した後、下記処理を実行します。
今回、引数にExcelブックのインデックスを設定しました。初回の処理ではコンボボックスの作成を行いますが、処理中にコンボボックスの選択内容を変更する事があるかもしれませんので処理を分けました。
尚、【TargetFile】は何も触れてませんが、後ほど、ファイルを開いた際にご説明します。
/**********************************************
* Excel情報の表示
**********************************************/
public void DispExcelInfo(int intExcelIndex)
{
/*-----------------------------------------------
* 引数として指定された値が0の場合
* 1.コンボボックスにブック名を登録
* 2.対象ファイル:開いたファイルをセット
*-----------------------------------------------*/
if (intExcelIndex == 0)
{
/* Excelブック名のコンボボックスを初期化 */
cmbExcelBook.Items.Clear();
/* ループ:Excelブック数分 */
for (int i = 0; i < intExcelInfoCNT; i++)
{
/* コンボボックスにブック名を登録 */
cmbExcelBook.Items.Add(ExcelInfo[i].BookName);
}
/* ループ:Excelブック数分 */
for (int i = 0; i < intExcelInfoCNT; i++)
{
/* ブック名が開いたブック名と一致した場合 */
if (TargetFile == cmbExcelBook.Items[i].ToString())
{
/* コンボボックスに表示 */
cmbExcelBook.Text = cmbExcelBook.Items[i].ToString();
return;
}
}
}
/*-----------------------------------------------
* 引数として指定された値が0以外の場合
* 1.対象ファイル(インデックス)のファイルを表示
*-----------------------------------------------*/
else
{
cmbExcelBook.Text = cmbExcelBook.Items[intExcelIndex].ToString();
}
}
* Excel情報の表示
**********************************************/
public void DispExcelInfo(int intExcelIndex)
{
/*-----------------------------------------------
* 引数として指定された値が0の場合
* 1.コンボボックスにブック名を登録
* 2.対象ファイル:開いたファイルをセット
*-----------------------------------------------*/
if (intExcelIndex == 0)
{
/* Excelブック名のコンボボックスを初期化 */
cmbExcelBook.Items.Clear();
/* ループ:Excelブック数分 */
for (int i = 0; i < intExcelInfoCNT; i++)
{
/* コンボボックスにブック名を登録 */
cmbExcelBook.Items.Add(ExcelInfo[i].BookName);
}
/* ループ:Excelブック数分 */
for (int i = 0; i < intExcelInfoCNT; i++)
{
/* ブック名が開いたブック名と一致した場合 */
if (TargetFile == cmbExcelBook.Items[i].ToString())
{
/* コンボボックスに表示 */
cmbExcelBook.Text = cmbExcelBook.Items[i].ToString();
return;
}
}
}
/*-----------------------------------------------
* 引数として指定された値が0以外の場合
* 1.対象ファイル(インデックス)のファイルを表示
*-----------------------------------------------*/
else
{
cmbExcelBook.Text = cmbExcelBook.Items[intExcelIndex].ToString();
}
}
【コンボボックス】Excelブックの表示変更→リストボックス変更
コンボボックスをダブルクリックすると「cmbExcelBook_SelectedIndexChanged」関数が自動的に作成されます。(cmbExcelBookはコンボボックス名です)
この処理は上記「Excel情報の表示」でコンボボックスに表示設定した際も実行されます。
/**************************************************************
* 【コンボボックス】Excelブックの表示変更→リストボックス変更
**************************************************************/
private void cmbExcelBook_SelectedIndexChanged(object sender, EventArgs e)
{
/* コンボボックスの情報を取得する */
TargetFile = cmbExcelBook.Text;
/* リストボックスを初期化する */
lstExcelSheet.Items.Clear();
/* ループ:Excelブック数分 */
for (int i = 0; i < intExcelInfoCNT; i++)
{
/* コンボボックスと【構造体】Excel情報が一致した場合 */
if (TargetFile == ExcelInfo[i].BookName)
{
/* ルート:シート数分 */
for (int j = 0; j < ExcelInfo[i].SheetCNT; j++)
{
/* リストボックスにシート名を追加 */
lstExcelSheet.Items.Add(ExcelInfo[i].SheetName[j].ToString());
}
}
}
}
* 【コンボボックス】Excelブックの表示変更→リストボックス変更
**************************************************************/
private void cmbExcelBook_SelectedIndexChanged(object sender, EventArgs e)
{
/* コンボボックスの情報を取得する */
TargetFile = cmbExcelBook.Text;
/* リストボックスを初期化する */
lstExcelSheet.Items.Clear();
/* ループ:Excelブック数分 */
for (int i = 0; i < intExcelInfoCNT; i++)
{
/* コンボボックスと【構造体】Excel情報が一致した場合 */
if (TargetFile == ExcelInfo[i].BookName)
{
/* ルート:シート数分 */
for (int j = 0; j < ExcelInfo[i].SheetCNT; j++)
{
/* リストボックスにシート名を追加 */
lstExcelSheet.Items.Add(ExcelInfo[i].SheetName[j].ToString());
}
}
}
}
Excelファイルオープン
Excel操作:新規作成・ファイルオープンでファイルのオープン方法をご説明しましたが、今回の機能追加に伴い【Excelファイルの情報取得】【Excel情報の表示】を追加しましたので、変更内容を記述します。(新規作成も同様です)
/**********************************************
* Excelファイルオープン
**********************************************/
private void cmdOpenExel_Click(object sender, EventArgs e)
{
// テキストボックスからファイル名(フルパス)を取得する
TargetPath = txtExcelFile.Text;
// Excel非表示
if (ExcelApp.Visible == true)
ExcelApp.Visible = false;
// Excelファイルオープン
ExcelWB = ExcelApp.Workbooks.Open(TargetPath);
// Excelブック名の取得
TargetFile = ExcelWB.Name.ToString();
// Excelファイルの情報取得
GetExcelInfo();
// Excel情報の表示
DispExcelInfo(0);
// Excel非表示
if (ExcelApp.Visible == false)
ExcelApp.Visible = true;
}
* Excelファイルオープン
**********************************************/
private void cmdOpenExel_Click(object sender, EventArgs e)
{
// テキストボックスからファイル名(フルパス)を取得する
TargetPath = txtExcelFile.Text;
// Excel非表示
if (ExcelApp.Visible == true)
ExcelApp.Visible = false;
// Excelファイルオープン
ExcelWB = ExcelApp.Workbooks.Open(TargetPath);
// Excelブック名の取得
TargetFile = ExcelWB.Name.ToString();
// Excelファイルの情報取得
GetExcelInfo();
// Excel情報の表示
DispExcelInfo(0);
// Excel非表示
if (ExcelApp.Visible == false)
ExcelApp.Visible = true;
}