web-dev-qa-db-ja.com

vba stringが数値の場合、文字列をint型に変換します

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に設定するように指示する方法はありますか?

55
Captastic

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
92
ForEachLoop

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などを考えることもできます。このような場合に機能が必要な場合は、別の解決策を確認する必要があります。

6
PeterH

これを試してみてください。この関数の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)関数の戻り型を変更し、すべてが一致するように関数変数のすべての出現箇所の名前を変更します。

2

一行にするには:

currentLoad = IIf(IsNumeric(oXLSheet2.Cells(4, 6).Value), CInt(oXLSheet2.Cells(4, 6).Value), 0)
0
ray