Excel VBAユーザーのためのC#構文入門:Substringの違いとよくある混乱ポイント
1. Substringの違いと注意点
VBAには Mid() 関数がありますが、C#の Substring() は構文も挙動も異なります。特に、文字列に直接メソッドとして呼び出せる点が大きな違いです。
C#の例
string s = "ABCDEF";
string part = s.Substring(1, 3); // → "BCD"
- 第1引数は「開始位置」(0始まり)
- 第2引数は「取得する文字数」
-
Substring(1, 3)は「2文字目から3文字分」="BCD"
string tail = s.Substring(4); // → "EF"
- 引数が1つの場合は、指定位置から末尾までを取得
VBAの例
Dim s As String
s = "ABCDEF"
Dim part As String
part = Mid(s, 2, 3) ' → "BCD"
- VBAでは
Midは関数であり、開始位置は1始まり - 第2引数は「開始位置」、第3引数は「取得する文字数」
| 比較項目 | VBA (Mid) |
C# (Substring) |
|---|---|---|
| 呼び出し方 | 関数として使用 | メソッドとして文字列に直接使用 |
| 開始位置 | 1から始まる | 0から始まる |
| 引数の意味 | 開始位置, 取得文字数 | 開始位置, 取得文字数 |
| 戻り値 | String型 | String型 |
2. よくある構文の混乱ポイント
| 構文 | 意味 | よくある混乱 |
|---|---|---|
Substring(1, 3) |
2文字目から3文字取得 | VBAと開始位置の基準が異なる(VBAは1始まり) |
Substring(4) |
5文字目以降を取得 | 引数1つの場合は「末尾まで」取得される |
Console.WriteLine() |
出力 | 改行付きで表示される。Console.Write()との違いに注意 |
Length |
文字列長の取得 |
Substringの範囲外アクセス防止に使うのが定番 |
ミニコーナー:ABC085AをC#で解いてみよう
ここまで紹介した構文を使って、AtCoderの初級問題「ABC085A」をC#で解いてみましょう。
問題概要
日付文字列 "2017/01/07" が与えられる。先頭の "2017" を "2018" に書き換えて出力せよ。
C#コード例
using System;
class Program
{
static void Main()
{
string s = Console.ReadLine(); // 例: "2017/01/07"
string result = "2018" + s.Substring(4);
Console.WriteLine(result); // → "2018/01/07"
}
}
使用されている構文の復習
-
Substring(4):5文字目以降を取得 -
Console.WriteLine():結果の出力
このように、C#では Substring を使って柔軟に文字列を操作できます。VBAユーザーにとっては、インデックスの違いに注意することで、C#の文字列処理が一気に理解しやすくなります。
このような構文の違いを一つずつ丁寧に押さえていくことで、VBAからC#への移行はぐっとスムーズになります。今後も、条件分岐やループ、配列操作など、他の構文についても比較記事を展開していく予定です。興味があればぜひフォローしてください。