【C#】Excel操作:Excel入力


 フォーム


Excel操作:Excel情報の取得に機能追加して、指定したExcelブック名 と Excelシート名に文字を入力します。



追加機能は、【X座標】【Y座標】を入力すると、(1, 1)から(X, Y)まで1を足した結果を出力します。(罫線付き)
例えば、(5, 3)とインプットしたら、下記結果となるようにします。





 変数


セルの範囲を取り扱う場合は Rangeオブジェクトを使います。

/* Excelレンジ */
Microsoft.Office.Interop.Excel.Range ExcelRNG;

/* 対象ファイル、対象シート */
public String TargetFile, TargetSheet;

/* X座標、Y座標 */
public int LineX, LineY;



 Excelファイルの情報取得


処理の流れとしては、下記となります。
①コンボボックスの情報からExcelブック名を取得する
②リストボックスの情報からExcelシート名を取得する
③Excelオブジェクトの取得
  ・Excelブック
  ・Excelシート
④X座標の情報取得(String型からint型へ変換)
⑤Y座標の情報取得(String型からint型へ変換)
⑥Excelセルへの書き込み (注)セルの初期値は1から開始
  => レスポンスを向上させるにはこちら参照
⑦罫線を付ける

/**********************************************
* Excel入力
**********************************************/

private void cmdInput_Click(object sender, EventArgs e)
{
  /* ①コンボボックスの情報からExcelブック名を取得する */
  TargetFile = cmbExcelBook.Text;

  /* ②リストボックスの情報からExcelシート名を取得する */
  TargetSheet = lstExcelSheet.SelectedItem.ToString();

  /* ③Excelオブジェクトの取得 */
  ExcelWB = ExcelApp.Workbooks.Item[TargetFile];
  ExcelWS = (Worksheet)ExcelWB.Sheets[TargetSheet];

  /* ④X座標の情報取得(String型からint型へ変換) */
  LineX = int.Parse(txtLineX.Text);

  /* ⑤Y座標の情報取得(String型からint型へ変換) */
  LineY = int.Parse(txtLineY.Text);

  /* ⑥Excelセルへの書き込み */
  for (int i = 1; i <= LineX; i++)
  {
    for (int j = 1; j <= LineY; j++)
    {
      ExcelWS.Cells[i, j] = i + j - 1;
    }
  }

  /* ⑦罫線を付ける */
  ExcelRNG = ExcelWS.get_Range(ExcelWS.Cells[1, 1], ExcelWS.Cells[LineX, LineY]);

  ExcelRNG.Borders.get_Item(XlBordersIndex.xlEdgeTop).LineStyle = XlLineStyle.xlContinuous;
  ExcelRNG.Borders.get_Item(XlBordersIndex.xlInsideHorizontal).LineStyle = XlLineStyle.xlContinuous;
  ExcelRNG.Borders.get_Item(XlBordersIndex.xlInsideVertical).LineStyle = XlLineStyle.xlContinuous;
  ExcelRNG.Borders.get_Item(XlBordersIndex.xlEdgeBottom).LineStyle = XlLineStyle.xlContinuous;
  ExcelRNG.Borders.get_Item(XlBordersIndex.xlEdgeRight).LineStyle = XlLineStyle.xlContinuous;
  ExcelRNG.Borders.get_Item(XlBordersIndex.xlEdgeLeft).LineStyle = XlLineStyle.xlContinuous;
}

ただし、上記はエラー処理が全く考慮されていないので、もし丁寧に記述するなら(抜け漏れがあるかもしれませんが)下記の様になります。

/**********************************************
* Excel入力
**********************************************/

private void cmdInput_Click(object sender, EventArgs e)
{
  /* コンボボックスの情報からExcelブック名を取得する */
  TargetFile = cmbExcelBook.Text;

  /* リストボックスの情報からExcelシート名を取得する */
  if(lstExcelSheet.SelectedItems.Count == 0)
  {
    MessageBox.Show("書き込むシートを選択して下さい");
    return;
  }
  TargetSheet = lstExcelSheet.SelectedItem.ToString();

  /* Excelオブジェクトの取得 */
  ExcelWB = ExcelApp.Workbooks.Item[TargetFile];
  ExcelWS = (Worksheet)ExcelWB.Sheets[TargetSheet];

  /* X座標の情報取得(String型からint型へ変換) */
  try
  {
    LineX = int.Parse(txtLineX.Text);
    if (LineX < 1)
    {
      MessageBox.Show("X座標は1以上の整数で入力して下さい");
      return;
    }
  }
  catch (System.Exception ErrMSG)
  {
    MessageBox.Show("X座標:" + txtLineX.Text
      + "の入力内容に誤りがあります。1以上の整数で入力して下さい。("
      + ErrMSG.Message.ToString() + ")");
    return;
  }

  /* Y座標の情報取得(String型からint型へ変換) */
  try
  {
    LineY = int.Parse(txtLineY.Text);
    if (LineY < 1)
    {
      MessageBox.Show("Y座標は1以上の整数で入力して下さい");
      return;
    }
  }
  catch (System.Exception ErrMSG)
  {
    MessageBox.Show("Y座標:" + txtLineX.Text
      + "の入力内容に誤りがあります。1以上の整数で入力して下さい。("
      + ErrMSG.Message.ToString() + ")");
    return;
  }

  /* Excelセルへの書き込み */
  for (int i = 1; i <= LineX; i++)
  {
    for (int j = 1; j <= LineY; j++)
    {
      try
      {
        ExcelWS.Cells[i, j] = i + j - 1;
      }
      catch (System.Exception ErrMSG)
      {
        MessageBox.Show("(" + i + ", " + j + ") で " + (i + j - 1).ToString()
          + "をインプット中にエラーが発生しました。("
          + ErrMSG.Message.ToString() + ")");
        return;
      }
    }
  }

  /* 罫線を付ける */
  ExcelRNG = ExcelWS.get_Range(ExcelWS.Cells[1, 1], ExcelWS.Cells[LineX, LineY]);
  ExcelRNG.Borders.get_Item(XlBordersIndex.xlEdgeTop).LineStyle = XlLineStyle.xlContinuous;
  ExcelRNG.Borders.get_Item(XlBordersIndex.xlInsideHorizontal).LineStyle = XlLineStyle.xlContinuous;
  ExcelRNG.Borders.get_Item(XlBordersIndex.xlInsideVertical).LineStyle = XlLineStyle.xlContinuous;
  ExcelRNG.Borders.get_Item(XlBordersIndex.xlEdgeBottom).LineStyle = XlLineStyle.xlContinuous;
  ExcelRNG.Borders.get_Item(XlBordersIndex.xlEdgeRight).LineStyle = XlLineStyle.xlContinuous;
  ExcelRNG.Borders.get_Item(XlBordersIndex.xlEdgeLeft).LineStyle = XlLineStyle.xlContinuous;
}

カテゴリー: C#, Excel操作, システム開発 | コメントする

【C#】Excel操作:Excel情報の取得


 フォーム


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ファイルの情報取得


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情報の表示


上記「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ブックの表示変更→リストボックス変更


コンボボックスをダブルクリックすると「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ファイルオープン


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;
}

カテゴリー: C#, Excel操作, システム開発 | コメントする

【ポケモンGO】代々木公園にて(2016/12/10)

先日ご紹介したPokeStreetを見ながら「どこの巣に行こうか・・・」と悩み、渋谷マック → 代々木公園「ヒトカゲの巣」ルートに決まりました。

渋谷マックは相変わらず混んでます!
座席取りに時間が掛かり、入って食事して出るまでに1時間以上かな?ファーストフード店なのに・・・。

気を取り直して代々木公園に向かいながら、GO SPOTをチェックすると・・・代々木公園にプテラがPOPしてました!足早に向かうとプテラPOP&ゲット!



夜な夜な車で走り回って頑張って捕まえたプテラが、いともこう簡単にゲット出来るとは・・と言ってもタイミング次第ですよね。

そこからヒトカゲ狩りが始まりました。が晴れて天気にも関わらず、さすが冬です。歩き回っても体温はどんどん奪わられ、1時間半くらいしかいられませんでした。その短時間でヒトカゲ約20匹ゲットできたのは、さすが代々木ですね!(^^)!

巣が移動になったら、次はピカチュウをお願いしたいです m(__)m

カテゴリー: ポケモンGO | コメントする

【ポケモンGO】ジョギング金メダル(1000Km)ゲット!

週に1~2回程ジョギングをしているので、一番気になっているジョギングの金メダルをようやくゲット出来ました~。

でも、よく見ると「ジョギング」というわりに「1000Km歩いた!」なんですね・・。



10Kmジョギングしても5Kmのタマゴが孵化するか微妙だし・・散歩仕様なのかな?

カテゴリー: ポケモンGO | コメントする

【ポケモンGO】サーチアプリ

以前、ポケモンGOのサーチアプリとして「PokeTrackCS」をご紹介しましたが、頻繁に更新を行っても、全然サーチ出来ません。

仕方なく、他を当たると「PokeSteet」というアプリがありました。ダウンロードの必要は無くブラウザ上で動き、自分の周辺以外の情報も取得出来ます。

こんな感じで・・



ちょうどベロリンガがPOPしており、あと何分で消滅する事が把握出来ます。またGoogle Mapと連動しているので、自分の位置からのルート・時間も分かり、間に合うか諦めるかの判断が出来ます。

スマホでもPCでも見る事が出来るので、自宅にいる時などは大画面で検索に向いており、出掛ける時などはスマホで検索して身近な場所をサーチして活用してました。

以前「○○にベロリンガ発見」と書きましたが、このPokeStreetでチェックすると、「以前この場所にPOPしたから、今度もこの場所にPOPする」という事は無さそうです。

ただ、なかなか捕まえにくかったポリゴンは、渋谷・新宿周辺によくPOPしているのを見かけます。プテラも広範にPOPして絞りにくいですが、チェックしてると「ここら辺にPOPする事が多い」という気づきがありました。

後はポケモンの巣の把握です。頻繁に巣が移動になりますが、PokeStreetを使う事によって、どの場所がどの巣か把握出来るのは非常に助かります。

近いうちにポケGOのバージョンアップがあるので、アメ玉収集にゲットしたい巣に行くと効率よくゲット出来そうです。

カテゴリー: ポケモンGO | コメントする