作成日: 2020/08/11 最終更新日: 2020/08/26
文書種別
不具合
状況
修正済み
詳細
IWorksheetインターフェースのRangeメソッドの引数として数字の文字列を指定すると、不正にIRangeインターフェースのオブジェクトを返す場合があります。数字の文字列はセル参照として有効な値ではないため、null(Nothing)を返すのが本来の動作です。
【再現手順】
1.新規作成したプロジェクトのForm1にFpSpreadとButtonを張り付ける。
2.下記サンプルコードを記述し、プロジェクトを実行する。
※以下の例ではi=0~2の場合にはrangeはnullになるのが本来の動作です。
■サンプルコード(VB.NET)
【再現手順】
1.新規作成したプロジェクトのForm1にFpSpreadとButtonを張り付ける。
2.下記サンプルコードを記述し、プロジェクトを実行する。
※以下の例ではi=0~2の場合にはrangeはnullになるのが本来の動作です。
■サンプルコード(VB.NET)
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim check As String() = {"121234567890", "12345678901", "123456789012", "1:2"}
For i = 0 To 3
Dim range As GrapeCity.Spreadsheet.IRange = FpSpread1.ActiveSheet.AsWorksheet().Range(check(i))
Console.WriteLine($"i={i} range={range}")
'出力結果
'【正しい動作です】i = 0 range=
'【不正な動作です】i = 1 range=[FpSpread1]Sheet1!
'【不正な動作です】i = 2 range=[FpSpread1]Sheet1!
'【正しい動作です】i = 3 range=[FpSpread1]Sheet1!$1:$2
Next
End Sub
Dim check As String() = {"121234567890", "12345678901", "123456789012", "1:2"}
For i = 0 To 3
Dim range As GrapeCity.Spreadsheet.IRange = FpSpread1.ActiveSheet.AsWorksheet().Range(check(i))
Console.WriteLine($"i={i} range={range}")
'出力結果
'【正しい動作です】i = 0 range=
'【不正な動作です】i = 1 range=[FpSpread1]Sheet1!
'【不正な動作です】i = 2 range=[FpSpread1]Sheet1!
'【正しい動作です】i = 3 range=[FpSpread1]Sheet1!$1:$2
Next
End Sub
回避方法
Service Pack 5(v12.0.4508.2012)で修正済み。
Service Pack を適用せずに対処する場合、引数を事前にチェックして数字の文字列の場合にはIRangeがnullとなるように実装する対応で回避可能です。
■サンプルコード(VB.NET)
Service Pack を適用せずに対処する場合、引数を事前にチェックして数字の文字列の場合にはIRangeがnullとなるように実装する対応で回避可能です。
■サンプルコード(VB.NET)
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim check As String() = {"121234567890", "12345678901", "123456789012", "1:2"}
For i = 0 To 3
Dim range As GrapeCity.Spreadsheet.IRange = If(String.IsNullOrEmpty(check(i)) OrElse ContainsDigitOnly(check(i)), Nothing, FpSpread1.ActiveSheet.AsWorksheet().Range(check(i)))
Console.WriteLine($"i={i} range={range}")
Next
End Sub
Private Function ContainsDigitOnly(ByVal text As String) As Boolean
Dim i As Integer = 0, length As Integer = text.Length
While i < length
If Not Char.IsDigit(text(i)) Then
Return False
End If
i += 1
End While
Return True
End Function
Dim check As String() = {"121234567890", "12345678901", "123456789012", "1:2"}
For i = 0 To 3
Dim range As GrapeCity.Spreadsheet.IRange = If(String.IsNullOrEmpty(check(i)) OrElse ContainsDigitOnly(check(i)), Nothing, FpSpread1.ActiveSheet.AsWorksheet().Range(check(i)))
Console.WriteLine($"i={i} range={range}")
Next
End Sub
Private Function ContainsDigitOnly(ByVal text As String) As Boolean
Dim i As Integer = 0, length As Integer = text.Length
While i < length
If Not Char.IsDigit(text(i)) Then
Return False
End If
i += 1
End While
Return True
End Function
旧文書番号
85887