Excelから取得したVBAの文字列を整数に変換する必要があります。そうするために私はうまく動作するCInt()を使っています。ただし、文字列が数値以外のものになる可能性があります。この場合は、整数を0に設定する必要があります。
If oXLSheet2.Cells(4, 6).Value <> "example string" Then
currentLoad = CInt(oXLSheet2.Cells(4, 6).Value)
Else
currentLoad = 0
End If
問題は、このセルに含まれる可能性のあるすべての非数値文字列を予測できないことです。整数の場合は変換し、そうでない場合は0に設定するように指示する方法はありますか?
IsNumericを使用してください。数値の場合はtrue、そうでない場合はfalseを返します。
Public Sub NumTest()
On Error GoTo MyErrorHandler
Dim myVar As Variant
myVar = 11.2 'Or whatever
Dim finalNumber As Integer
If IsNumeric(myVar) Then
finalNumber = CInt(myVar)
Else
finalNumber = 0
End If
Exit Sub
MyErrorHandler:
MsgBox "NumTest" & vbCrLf & vbCrLf & "Err = " & Err.Number & _
vbCrLf & "Description: " & Err.Description
End Sub
Longにキャストするかintにキャストします。次の点に注意してください。
これらの機能は、システムの地域設定に応じて、Excel VBAの表示機能の1つです。そのため、ヨーロッパの一部の国のように二重にカンマを使用すると、米国ではエラーが発生します。
たとえば、ヨーロッパではExcelバージョン0.5がCDbl()でうまく機能しますが、アメリカバージョンでは5になります。したがって、次の代替手段を使用することをお勧めします。
Public Function CastLong(var As Variant)
' replace , by .
var = Replace(var, ",", ".")
Dim l As Long
On Error Resume Next
l = Round(Val(var))
' if error occurs, l will be 0
CastLong = l
End Function
' similar function for cast-int, you can add minimum and maximum value if you like
' to prevent that value is too high or too low.
Public Function CastInt(var As Variant)
' replace , by .
var = Replace(var, ",", ".")
Dim i As Integer
On Error Resume Next
i = Round(Val(var))
' if error occurs, i will be 0
CastInt = i
End Function
もちろん、人々がカンマやドットを使用する場合、たとえば3,000から3,000.00などを考えることもできます。このような場合に機能が必要な場合は、別の解決策を確認する必要があります。
これを試してみてください。この関数のcurrentLoad = ConvertToLongInteger(oXLSheet2.Cells(4, 6).Value)
:
Function ConvertToLongInteger(ByVal stValue As String) As Long
On Error GoTo ConversionFailureHandler
ConvertToLongInteger = CLng(stValue) 'TRY to convert to an Integer value
Exit Function 'If we reach this point, then we succeeded so exit
ConversionFailureHandler:
'IF we've reached this point, then we did not succeed in conversion
'If the error is type-mismatch, clear the error and return numeric 0 from the function
'Otherwise, disable the error handler, and re-run the code to allow the system to
'display the error
If Err.Number = 13 Then 'error # 13 is Type mismatch
Err.Clear
ConvertToLongInteger = 0
Exit Function
Else
On Error GoTo 0
Resume
End If
End Function
VBAでの整数の最小/最大サイズはおかしなので(最小:-32768、最大:+ 32767)、単純な整数の代わりにロング(整数)を選択しました。スプレッドシート操作では、その範囲外の整数を持つのが一般的です。
上記のコードは、文字列から整数へ、通貨へ(CCur()を使用)、10進数(CDec()を使用)、倍精度(CDbl()を使用)などの変換を処理するように変更できます。変換関数自体(CLng)関数の戻り型を変更し、すべてが一致するように関数変数のすべての出現箇所の名前を変更します。
一行にするには:
currentLoad = IIf(IsNumeric(oXLSheet2.Cells(4, 6).Value), CInt(oXLSheet2.Cells(4, 6).Value), 0)