C# リファレンス
C# リファレンス
C#の基本的な使い方から実用的な応用まで、フォームアプリケーション開発とExcel操作を中心に解説します。
基本概念
C# とは
C#(シーシャープ)は、Microsoftが開発したオブジェクト指向プログラミング言語です。.NET Frameworkまたは.NET Core/.NET上で動作し、型安全性と高いパフォーマンスを持つ言語として設計されています。
特徴:
- 型安全性が高い(コンパイル時エラー検出)
- 自動メモリ管理(ガベージコレクション)
- 豊富な標準ライブラリ
- クロスプラットフォーム対応(.NET Core以降)
- Visual Studioとの優れた統合
開発環境の準備
Visual Studio のインストール:
- https://visualstudio.microsoft.com/ にアクセス
- Visual Studio Community(無料版)をダウンロード
- C#開発に必要なワークロードを選択してインストール
最初のプログラム:
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, C#!");
Console.ReadKey(); // キー入力を待つ
}
}
C# 基本文法
変数とデータ型
// 基本的なデータ型
int age = 30; // 整数型
double price = 1500.50; // 倍精度浮動小数点型
string name = "田中太郎"; // 文字列型
bool isActive = true; // 真偽値型
char grade = 'A'; // 文字型
// var キーワード(型推論)
var count = 100; // int として推論
var message = "こんにちは"; // string として推論
// null許容型
int? nullableInt = null; // nullを許可する整数型
string? nullableString = null; // nullを許可する文字列型
制御文
// if文
if (age >= 20)
{
Console.WriteLine("成人です");
}
else if (age >= 13)
{
Console.WriteLine("中高生です");
}
else
{
Console.WriteLine("小学生以下です");
}
// switch文
switch (grade)
{
case 'A':
Console.WriteLine("優秀");
break;
case 'B':
Console.WriteLine("良好");
break;
default:
Console.WriteLine("要改善");
break;
}
// for文
for (int i = 0; i < 10; i++)
{
Console.WriteLine($"カウント: {i}");
}
// foreach文
string[] fruits = { "りんご", "みかん", "バナナ" };
foreach (string fruit in fruits)
{
Console.WriteLine($"果物: {fruit}");
}
クラスとオブジェクト
// クラス定義
public class Person
{
// プロパティ
public string Name { get; set; }
public int Age { get; set; }
// コンストラクタ
public Person(string name, int age)
{
Name = name;
Age = age;
}
// メソッド
public void SayHello()
{
Console.WriteLine($"こんにちは、{Name}です。{Age}歳です。");
}
}
// クラスの使用
Person person = new Person("田中太郎", 30);
person.SayHello();
Windows Forms アプリケーション
プロジェクトの作成
// Visual Studio で新規プロジェクト作成
// 1. ファイル > 新規 > プロジェクト
// 2. Windows Forms アプリケーション (.NET Framework) を選択
// 3. プロジェクト名と場所を指定して作成
基本的なフォーム構造
using System;
using System.Windows.Forms;
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
SetupForm();
}
private void SetupForm()
{
// フォームの基本設定
this.Text = "C# フォームアプリケーション";
this.Size = new System.Drawing.Size(800, 600);
this.StartPosition = FormStartPosition.CenterScreen;
// コントロールの配置
CreateControls();
}
private void CreateControls()
{
// ボタンの追加
Button btnClick = new Button();
btnClick.Text = "クリック";
btnClick.Location = new System.Drawing.Point(100, 50);
btnClick.Size = new System.Drawing.Size(100, 30);
btnClick.Click += BtnClick_Click;
this.Controls.Add(btnClick);
// ラベルの追加
Label lblMessage = new Label();
lblMessage.Text = "メッセージが表示されます";
lblMessage.Location = new System.Drawing.Point(100, 100);
lblMessage.Size = new System.Drawing.Size(200, 30);
lblMessage.Name = "lblMessage";
this.Controls.Add(lblMessage);
}
private void BtnClick_Click(object sender, EventArgs e)
{
Label lbl = this.Controls["lblMessage"] as Label;
lbl.Text = "ボタンがクリックされました!";
}
}
よく使用するコントロール
// TextBox(テキストボックス)
TextBox txtName = new TextBox();
txtName.Location = new System.Drawing.Point(100, 150);
txtName.Size = new System.Drawing.Size(200, 25);
txtName.PlaceholderText = "名前を入力してください";
// ComboBox(ドロップダウンリスト)
ComboBox cmbOptions = new ComboBox();
cmbOptions.Items.AddRange(new string[] { "オプション1", "オプション2", "オプション3" });
cmbOptions.Location = new System.Drawing.Point(100, 200);
cmbOptions.SelectedIndex = 0; // 最初の項目を選択
// ListBox(リストボックス)
ListBox lstItems = new ListBox();
lstItems.Items.AddRange(new string[] { "項目1", "項目2", "項目3" });
lstItems.Location = new System.Drawing.Point(100, 250);
lstItems.Size = new System.Drawing.Size(200, 100);
// CheckBox(チェックボックス)
CheckBox chkAgree = new CheckBox();
chkAgree.Text = "利用規約に同意する";
chkAgree.Location = new System.Drawing.Point(100, 370);
// DataGridView(データグリッド)
DataGridView dgvData = new DataGridView();
dgvData.Location = new System.Drawing.Point(350, 50);
dgvData.Size = new System.Drawing.Size(400, 300);
dgvData.AutoGenerateColumns = true;
メニューとツールバー
private void CreateMenuBar()
{
// メニューバーの作成
MenuStrip menuStrip = new MenuStrip();
// ファイルメニュー
ToolStripMenuItem fileMenu = new ToolStripMenuItem("ファイル");
fileMenu.DropDownItems.Add("新規作成", null, NewFile_Click);
fileMenu.DropDownItems.Add("開く", null, OpenFile_Click);
fileMenu.DropDownItems.Add(new ToolStripSeparator()); // 区切り線
fileMenu.DropDownItems.Add("終了", null, Exit_Click);
// 編集メニュー
ToolStripMenuItem editMenu = new ToolStripMenuItem("編集");
editMenu.DropDownItems.Add("コピー", null, Copy_Click);
editMenu.DropDownItems.Add("貼り付け", null, Paste_Click);
menuStrip.Items.Add(fileMenu);
menuStrip.Items.Add(editMenu);
this.MainMenuStrip = menuStrip;
this.Controls.Add(menuStrip);
}
private void NewFile_Click(object sender, EventArgs e)
{
MessageBox.Show("新規ファイルを作成します", "情報", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
Excel ファイルの操作
Microsoft.Office.Interop.Excel の設定
// プロジェクト参照の追加方法:
// 1. ソリューションエクスプローラーで「参照」を右クリック
// 2. 「参照の追加」を選択
// 3. 「COM」タブを選択
// 4. 「Microsoft Excel XX.X Object Library」を選択してチェック
// 5. 「OK」をクリックして参照を追加
// または、NuGetパッケージマネージャーで:
// Install-Package Microsoft.Office.Interop.Excel
Excel ファイルの読み込み
using Microsoft.Office.Interop.Excel;
using System;
using System.Runtime.InteropServices;
public class ExcelReader
{
public void ReadExcelFile(string filePath)
{
Application excelApp = null;
Workbook workbook = null;
Worksheet worksheet = null;
try
{
// Excelアプリケーションの起動
excelApp = new Application();
excelApp.Visible = false; // Excelウィンドウを非表示
excelApp.DisplayAlerts = false; // 警告ダイアログを無効
// ワークブックを開く
workbook = excelApp.Workbooks.Open(filePath);
// 最初のワークシートを取得
worksheet = (Worksheet)workbook.Worksheets[1];
// 使用範囲を取得
Range usedRange = worksheet.UsedRange;
// データの読み込み
for (int row = 1; row <= usedRange.Rows.Count; row++)
{
for (int col = 1; col <= usedRange.Columns.Count; col++)
{
Range cell = (Range)usedRange.Cells[row, col];
var cellValue = cell.Value;
if (cellValue != null)
{
Console.WriteLine($"行{row}, 列{col}: {cellValue}");
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"エラー: {ex.Message}");
}
finally
{
// リソースの解放(重要)
if (worksheet != null) Marshal.ReleaseComObject(worksheet);
if (workbook != null)
{
workbook.Close(false);
Marshal.ReleaseComObject(workbook);
}
if (excelApp != null)
{
excelApp.Quit();
Marshal.ReleaseComObject(excelApp);
}
}
}
// 特定セルのデータ取得
public string GetCellValue(string filePath, string cellAddress)
{
Application excelApp = null;
Workbook workbook = null;
Worksheet worksheet = null;
string result = "";
try
{
excelApp = new Application();
excelApp.Visible = false;
excelApp.DisplayAlerts = false;
workbook = excelApp.Workbooks.Open(filePath);
worksheet = (Worksheet)workbook.Worksheets[1];
Range cell = worksheet.get_Range(cellAddress);
result = cell.Value?.ToString() ?? "";
}
catch (Exception ex)
{
Console.WriteLine($"エラー: {ex.Message}");
}
finally
{
if (worksheet != null) Marshal.ReleaseComObject(worksheet);
if (workbook != null)
{
workbook.Close(false);
Marshal.ReleaseComObject(workbook);
}
if (excelApp != null)
{
excelApp.Quit();
Marshal.ReleaseComObject(excelApp);
}
}
return result;
}
}
Excel ファイルの作成と書き込み
public class ExcelWriter
{
public void CreateExcelFile(string filePath)
{
Application excelApp = null;
Workbook workbook = null;
Worksheet worksheet = null;
try
{
// Excelアプリケーションの起動
excelApp = new Application();
excelApp.Visible = false;
excelApp.DisplayAlerts = false;
// 新しいワークブックを作成
workbook = excelApp.Workbooks.Add();
// 最初のワークシートを取得
worksheet = (Worksheet)workbook.Worksheets[1];
worksheet.Name = "データシート";
// ヘッダーの作成
worksheet.Cells[1, 1] = "ID";
worksheet.Cells[1, 2] = "名前";
worksheet.Cells[1, 3] = "年齢";
worksheet.Cells[1, 4] = "部署";
// サンプルデータの挿入
var employees = new[]
{
new { Id = 1, Name = "田中太郎", Age = 30, Department = "営業部" },
new { Id = 2, Name = "鈴木花子", Age = 28, Department = "開発部" },
new { Id = 3, Name = "佐藤次郎", Age = 35, Department = "総務部" }
};
int row = 2;
foreach (var emp in employees)
{
worksheet.Cells[row, 1] = emp.Id;
worksheet.Cells[row, 2] = emp.Name;
worksheet.Cells[row, 3] = emp.Age;
worksheet.Cells[row, 4] = emp.Department;
row++;
}
// 書式設定
Range headerRange = worksheet.get_Range("A1", "D1");
headerRange.Font.Bold = true; // ヘッダーを太字
// 列幅の自動調整
Range usedRange = worksheet.UsedRange;
usedRange.Columns.AutoFit();
// ファイル保存
workbook.SaveAs(filePath);
}
catch (Exception ex)
{
Console.WriteLine($"エラー: {ex.Message}");
}
finally
{
if (worksheet != null) Marshal.ReleaseComObject(worksheet);
if (workbook != null)
{
workbook.Close(true);
Marshal.ReleaseComObject(workbook);
}
if (excelApp != null)
{
excelApp.Quit();
Marshal.ReleaseComObject(excelApp);
}
}
}
// データの更新
public void UpdateCellValue(string filePath, string cellAddress, object newValue)
{
Application excelApp = null;
Workbook workbook = null;
Worksheet worksheet = null;
try
{
excelApp = new Application();
excelApp.Visible = false;
excelApp.DisplayAlerts = false;
workbook = excelApp.Workbooks.Open(filePath);
worksheet = (Worksheet)workbook.Worksheets[1];
Range cell = worksheet.get_Range(cellAddress);
cell.Value = newValue;
workbook.Save();
}
catch (Exception ex)
{
Console.WriteLine($"エラー: {ex.Message}");
}
finally
{
if (worksheet != null) Marshal.ReleaseComObject(worksheet);
if (workbook != null)
{
workbook.Close(true);
Marshal.ReleaseComObject(workbook);
}
if (excelApp != null)
{
excelApp.Quit();
Marshal.ReleaseComObject(excelApp);
}
}
}
}
フォームでExcel操作を統合
public partial class ExcelForm : Form
{
private DataGridView dgvData;
private Button btnLoad;
private Button btnSave;
private OpenFileDialog openFileDialog;
private SaveFileDialog saveFileDialog;
public ExcelForm()
{
InitializeComponent();
SetupControls();
}
private void SetupControls()
{
this.Text = "Excel ファイル操作";
this.Size = new System.Drawing.Size(800, 600);
// DataGridView
dgvData = new DataGridView();
dgvData.Location = new System.Drawing.Point(20, 60);
dgvData.Size = new System.Drawing.Size(750, 400);
dgvData.AutoGenerateColumns = true;
this.Controls.Add(dgvData);
// 読み込みボタン
btnLoad = new Button();
btnLoad.Text = "Excel 読み込み";
btnLoad.Location = new System.Drawing.Point(20, 20);
btnLoad.Click += BtnLoad_Click;
this.Controls.Add(btnLoad);
// 保存ボタン
btnSave = new Button();
btnSave.Text = "Excel 保存";
btnSave.Location = new System.Drawing.Point(150, 20);
btnSave.Click += BtnSave_Click;
this.Controls.Add(btnSave);
// ファイルダイアログ
openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Excel files (*.xlsx;*.xls)|*.xlsx;*.xls|All files (*.*)|*.*";
saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Excel files (*.xlsx)|*.xlsx|All files (*.*)|*.*";
}
private void BtnLoad_Click(object sender, EventArgs e)
{
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
try
{
LoadExcelData(openFileDialog.FileName);
}
catch (Exception ex)
{
MessageBox.Show($"ファイル読み込みエラー: {ex.Message}", "エラー",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void LoadExcelData(string filePath)
{
Application excelApp = null;
Workbook workbook = null;
Worksheet worksheet = null;
try
{
excelApp = new Application();
excelApp.Visible = false;
excelApp.DisplayAlerts = false;
workbook = excelApp.Workbooks.Open(filePath);
worksheet = (Worksheet)workbook.Worksheets[1];
Range usedRange = worksheet.UsedRange;
// DataTableに変換
System.Data.DataTable dataTable = new System.Data.DataTable();
// 列ヘッダーの追加
for (int col = 1; col <= usedRange.Columns.Count; col++)
{
Range headerCell = (Range)usedRange.Cells[1, col];
string columnName = headerCell.Value?.ToString() ?? $"列{col}";
dataTable.Columns.Add(columnName);
}
// データ行の追加
for (int row = 2; row <= usedRange.Rows.Count; row++)
{
var dataRow = dataTable.NewRow();
for (int col = 1; col <= usedRange.Columns.Count; col++)
{
Range cell = (Range)usedRange.Cells[row, col];
dataRow[col - 1] = cell.Value;
}
dataTable.Rows.Add(dataRow);
}
dgvData.DataSource = dataTable;
}
finally
{
// リソースの解放
if (worksheet != null) Marshal.ReleaseComObject(worksheet);
if (workbook != null)
{
workbook.Close(false);
Marshal.ReleaseComObject(workbook);
}
if (excelApp != null)
{
excelApp.Quit();
Marshal.ReleaseComObject(excelApp);
}
}
}
private void BtnSave_Click(object sender, EventArgs e)
{
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
try
{
SaveExcelData(saveFileDialog.FileName);
MessageBox.Show("保存が完了しました", "情報",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show($"ファイル保存エラー: {ex.Message}", "エラー",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void SaveExcelData(string filePath)
{
Application excelApp = null;
Workbook workbook = null;
Worksheet worksheet = null;
try
{
excelApp = new Application();
excelApp.Visible = false;
excelApp.DisplayAlerts = false;
workbook = excelApp.Workbooks.Add();
worksheet = (Worksheet)workbook.Worksheets[1];
worksheet.Name = "データ";
System.Data.DataTable dataTable = (System.Data.DataTable)dgvData.DataSource;
if (dataTable != null)
{
// 列ヘッダーの書き込み
for (int col = 0; col < dataTable.Columns.Count; col++)
{
worksheet.Cells[1, col + 1] = dataTable.Columns[col].ColumnName;
}
// データの書き込み
for (int row = 0; row < dataTable.Rows.Count; row++)
{
for (int col = 0; col < dataTable.Columns.Count; col++)
{
worksheet.Cells[row + 2, col + 1] = dataTable.Rows[row][col];
}
}
// スタイリング
Range headerRange = worksheet.get_Range("A1",
worksheet.Cells[1, dataTable.Columns.Count]);
headerRange.Font.Bold = true;
Range usedRange = worksheet.UsedRange;
usedRange.Columns.AutoFit();
}
workbook.SaveAs(filePath);
}
finally
{
if (worksheet != null) Marshal.ReleaseComObject(worksheet);
if (workbook != null)
{
workbook.Close(true);
Marshal.ReleaseComObject(workbook);
}
if (excelApp != null)
{
excelApp.Quit();
Marshal.ReleaseComObject(excelApp);
}
}
}
}
実践的なフォームアプリケーション開発
アプリケーション設計のベストプラクティス
// データアクセス層
public class DataService
{
private readonly string connectionString;
public DataService(string connectionString)
{
this.connectionString = connectionString;
}
public List<Employee> GetEmployees()
{
// データベースまたはExcelファイルから従業員データを取得
return new List<Employee>();
}
public void SaveEmployee(Employee employee)
{
// 従業員データの保存処理
}
}
// モデル
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public string Department { get; set; }
public DateTime HireDate { get; set; }
public decimal Salary { get; set; }
}
エラーハンドリングとデバッグ
// try-catch文でエラー処理
private void ProcessData()
{
try
{
// 処理コード
string filePath = GetFilePath();
var data = LoadExcelData(filePath);
ProcessExcelData(data);
}
catch (FileNotFoundException ex)
{
MessageBox.Show($"ファイルが見つかりません: {ex.FileName}", "エラー");
// ログ出力
LogError(ex);
}
catch (UnauthorizedAccessException ex)
{
MessageBox.Show("ファイルへのアクセス権限がありません", "エラー");
LogError(ex);
}
catch (Exception ex)
{
MessageBox.Show($"予期しないエラーが発生しました: {ex.Message}", "エラー");
LogError(ex);
}
}
private void LogError(Exception ex)
{
// ログファイルやイベントログにエラー情報を記録
string logMessage = $"[{DateTime.Now}] {ex.GetType().Name}: {ex.Message}\n{ex.StackTrace}";
File.AppendAllText("error.log", logMessage + Environment.NewLine);
}
アプリケーションの配布
// app.config ファイルの設定例
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="ExcelTemplatePath" value="templates/" />
<add key="OutputPath" value="output/" />
<add key="LogLevel" value="Info" />
</appSettings>
<connectionStrings>
<add name="DefaultConnection"
connectionString="Data Source=database.db"
providerName="System.Data.SQLite" />
</connectionStrings>
</configuration>
まとめ
C#を使ったフォームアプリケーション開発とExcel操作について基本から実践まで説明しました。これらの知識を組み合わせることで、業務で役立つ実用的なアプリケーションを開発できるようになります。
学習のポイント:
- 基本文法をしっかり理解する
- Windows Formsの基本操作を習得する
- Microsoft.Office.Interop.ExcelでExcel操作をマスターする
- エラーハンドリングを適切に実装する
- 実際のアプリケーション開発で経験を積む
継続的な学習と実践により、より高度なC#アプリケーションを開発できるようになります。