vba 문자열이 숫자 인 경우 문자열을 int로 변환
VBA에서 Excel에서 얻은 문자열을 interger로 변환해야합니다. 이를 위해 잘 작동하는 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의보기 기능 중 하나입니다. 따라서 유럽의 일부 국가 에서처럼 이중에 쉼표를 사용하면 미국에서 오류가 발생합니다.
예를 들어, 유럽 엑셀 버전 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 천은 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에서 Integer의 최소 / 최대 크기가 형편 없기 때문에 단순히 Integer 대신 Long (Integer)을 선택했습니다 (최소 : -32768, 최대 : +32767). 스프레드 시트 작업에서 해당 범위를 벗어난 정수를 갖는 것이 일반적입니다.
위의 코드는 문자열에서 정수로, 통화로 (CCur () 사용), 10 진수로 (CDec () 사용), 더블로 (CDbl () 사용) 변환을 처리하도록 수정할 수 있습니다. 변환 기능 자체 (CLng). 함수 반환 유형을 변경하고 모든 항목이 일관되도록 모든 함수 변수의 이름을 바꿉니다.
한 줄에 넣으려면 :
currentLoad = IIf(IsNumeric(oXLSheet2.Cells(4, 6).Value), CInt(oXLSheet2.Cells(4, 6).Value), 0)
다음은 유용 할 수있는 세 가지 기능입니다. 먼저 문자열에서 적절한 숫자 형식을 확인하고 두 번째 및 세 번째 함수는 문자열을 Long 또는 Double로 변환합니다.
Function IsValidNumericEntry(MyString As String) As Boolean
'********************************************************************************
'This function checks the string entry to make sure that valid digits are in the string.
'It checks to make sure the + and - are the first character if entered and no duplicates.
'Valid charcters are 0 - 9, + - and the .
'********************************************************************************
Dim ValidEntry As Boolean
Dim CharCode As Integer
Dim ValidDigit As Boolean
Dim ValidPlus As Boolean
Dim ValidMinus As Boolean
Dim ValidDecimal As Boolean
Dim ErrMsg As String
ValidDigit = False
ValidPlus = False
ValidMinus = False
ValidDecimal = False
ValidEntry = True
For x = 1 To Len(MyString)
CharCode = Asc(Mid(MyString, x, 1))
Select Case CharCode
Case 48 To 57 ' Digits 0 - 9
ValidDigit = True
Case 43 ' Plus sign
If ValidPlus Then 'One has already been detected and this is a duplicate
ErrMsg = "Invalid entry....too many plus signs!"
ValidEntry = False
Exit For
ElseIf x = 1 Then 'if in the first positon it is valide
ValidPlus = True
Else 'Not in first position and it is invalid
ErrMsg = "Invalide entry....Plus sign not in the correct position! "
ValidEntry = False
Exit For
End If
Case 45 ' Minus sign
If ValidMinus Then 'One has already been detected and this is a duplicate
ErrMsg = "Invalide entry....too many minus signs! "
ValidEntry = False
Exit For
ElseIf x = 1 Then 'if in the first position it is valid
ValidMinus = True
Else 'Not in first position and it is invalid
ErrMsg = "Invalide entry....Minus sign not in the correct position! "
ValidEntry = False
Exit For
End If
Case 46 ' Period
If ValidDecimal Then 'One has already been detected and this is a duplicate
ErrMsg = "Invalide entry....too many decimals!"
ValidEntry = False
Exit For
Else
ValidDecimal = True
End If
Case Else
ErrMsg = "Invalid numerical entry....Only digits 0-9 and the . + - characters are valid!"
ValidEntry = False
Exit For
End Select
Next
If ValidEntry And ValidDigit Then
IsValidNumericEntry = True
Else
If ValidDigit = False Then
ErrMsg = "Text string contains an invalid numeric format." & vbCrLf _
& "Use only one of the following formats!" & vbCrLf _
& "(+dd.dd -dd.dd +dd -dd dd.d or dd)! "
End If
MsgBox (ErrMsg & vbCrLf & vbCrLf & "You Entered: " & MyString)
IsValidNumericEntry = False
End If
End Function
Function ConvertToLong(stringVal As String) As Long
'Assumes the user has verified the string contains a valide numeric entry.
'User should call the function IsValidNumericEntry first especially after any user input
'to verify that the user has entered a proper number.
ConvertToLong = CLng(stringVal)
End Function
Function ConvertToDouble(stringVal As String) As Double
'Assumes the user has verified the string contains a valide numeric entry.
'User should call the function IsValidNumericEntry first especially after any user input
'to verify that the user has entered a proper number.
ConvertToDouble = CDbl(stringVal)
End Function
참고 URL : https://stackoverflow.com/questions/6202074/vba-convert-string-to-int-if-string-is-a-number
'developer tip' 카테고리의 다른 글
리버스 엔지니어링으로부터 Android 앱을 보호하는 것이 정말 불가능합니까? (0) | 2020.12.08 |
---|---|
라텍스 매우 콤팩트 항목 화 (0) | 2020.12.08 |
CSS에서 '줌'은 무엇을합니까? (0) | 2020.12.08 |
원격 git 브랜치를 로컬 저장소로 깔끔하게 가져오고 복사하는 방법 (0) | 2020.12.08 |
VS2012에서 NuGet 패키지를 프로젝트 참조로 추가하는 가장 좋은 방법은 무엇입니까? (0) | 2020.12.08 |