私はstring col= "AB21"
Excelセルの場所です。
string column = "AB"
&として解析したいint row = 21;
どうやってやるの?
string col = "AB21";
int startIndex = col.IndexOfAny("0123456789".ToCharArray());
string column = col.Substring(0, startIndex);
int row = Int32.Parse(col.Substring(startIndex));
もちろん、入力文字列が正しい形式になることを保証する必要があります。
必要なオプションの1つは、正規表現を使用して入力文字列を検証および解析することです。以下のコードを参照してください。
using System;
using System.Text.RegularExpressions;
namespace DemoRegExForStackOverflow
{
class Program
{
static void Main(string[] args)
{
var regex = new Regex(@"(?<col>([A-Z]|[a-z])+)(?<row>(\d)+)");
var input = @"AB12";
var match = regex.Match(input);
if( match != null )
{
var col = match.Groups["col"];
var row = match.Groups["row"];
Console.WriteLine("Input is: {0}", input);
Console.WriteLine("Column is {0}", col.Value);
Console.WriteLine("Row is {0}", row.Value);
}
else
{
throw new ArgumentException("Invalid input");
}
}
}
}
これがExcelの場合、有効な範囲の定義はバージョンによって異なるため、Excelを使用します。前の回答とは異なり、このルーチンは、範囲のように見えるが、Excel 2003の場合、「XB21」や「AB66000」などの有効な範囲ではない文字列を拒否します。以下の関数はC#に変換できると思います。
Sub SplitRangeStg(ByVal RngStg As String, ByRef RowNum As Long, _
ByRef ColNum As Long)
Dim RngErr As Boolean
Err.Number = 0
RngErr = False
On Error Resume Next
RowNum = Range(RngStg).Row ' Sets Err.Number if range invalid
If Err.Number <> 0 Then
RngErr = True
Err.Number = 0
End If
ColNum = Range(RngStg).Column ' Sets Err.Number if range invalid
If Err.Number <> 0 Then
RngErr = True
Err.Number = 0
End If
If RngErr Then
RowNum = 0
ColNum = 0
Call MsgBox(RngStg & " not recognised as an Excel range", vbOKOnly)
End If
On Error GoTo 0
End Sub
主に私自身の将来の参考のために:
public static void Parse( string address )
{
string sheet;
string col;
int row;
int sheetLength = address.IndexOf( '!' );
if ( sheetLength > 0 )
{
sheet = address.Substring( 0, sheetLength );
}
else
{
sheet = string.Empty;
}
++sheetLength; //skip the ! or start at 0
int i = sheetLength;
StringBuilder sb = new StringBuilder( );
for( ; i < address.Length
&& ! Char.IsDigit( address[ i ] )
; ++i )
{
sb.Append( address[ i ] );
}
col = sb.ToString( );
sb.Clear( );
for ( ; i < address.Length
&& Char.IsDigit( address[ i ] )
; ++i )
{
sb.Append( address[ i ] );
}
row = Int32.Parse( sb.ToString( ) );
}
IndexOfAnyを使用したアプローチはあまり効率的ではなく、正規表現ソリューションでもありません。また、どちらのソリューションもシートを無視します。