string
から数字を見つける必要があります。 VBA Excelのstring
から数字を見つける方法
数字以外を削除したい場合は、次のようなものを使用できるはずです。
Function onlyDigits(s As String) As String
' Variables needed (remember to use "option explicit"). '
Dim retval As String ' This is the return string. '
Dim i As Integer ' Counter for character position. '
' Initialise return string to empty '
retval = ""
' For every character in input string, copy digits to '
' return string. '
For i = 1 To Len(s)
If Mid(s, i, 1) >= "0" And Mid(s, i, 1) <= "9" Then
retval = retval + Mid(s, i, 1)
End If
Next
' Then return the return string. '
onlyDigits = retval
End Function
これを呼び出す:
Dim myStr as String
myStr = onlyDigits ("3d1fgd4g1dg5d9gdg")
MsgBox (myStr)
以下を含むダイアログボックスが表示されます:
314159
これらの最初の2行は、必要に応じて、任意の文字列変数に格納する方法を示しています。
正規表現は解析するために構築されています。構文はこのアプローチを理解するのに時間がかかることがありますが、非常に効率的であり、より複雑な文字列の抽出/置換を処理するために非常に柔軟です
Sub Tester()
MsgBox CleanString("3d1fgd4g1dg5d9gdg")
End Sub
Function CleanString(strIn As String) As String
Dim objRegex
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
.Global = True
.Pattern = "[^\d]+"
CleanString = .Replace(strIn, vbNullString)
End With
End Function
ばらばらの埋め込み数字を個別の数字に解析するために、brettdjの答えを拡張します。
Sub TestNumList()
Dim NumList As Variant 'Array
NumList = GetNums("34d1fgd43g1 dg5d999gdg2076")
Dim i As Integer
For i = LBound(NumList) To UBound(NumList)
MsgBox i + 1 & ": " & NumList(i)
Next i
End Sub
Function GetNums(ByVal strIn As String) As Variant 'Array of numeric strings
Dim RegExpObj As Object
Dim NumStr As String
Set RegExpObj = CreateObject("vbscript.regexp")
With RegExpObj
.Global = True
.Pattern = "[^\d]+"
NumStr = .Replace(strIn, " ")
End With
GetNums = Split(Trim(NumStr), " ")
End Function
数字が文字列の先頭にある場合、組み込みのVBA関数Valを使用します。
Dim str as String
Dim lng as Long
str = "1 149 xyz"
lng = Val(str)
lng = 1149
Byte
配列による代替
Byte
配列に文字列を割り当てると、通常、配列要素のペアの各文字に相当する数が取得されます。 Like
演算子による数値チェックにループを使用し、結合された配列を文字列として返します。
Function Nums(s$)
Dim by() As Byte, i&, ii&
by = s: ReDim tmp(UBound(by)) ' assign string to byte array; prepare temp array
For i = 0 To UBound(by) - 1 Step 2 ' check num value in byte array (0, 2, 4 ... n-1)
If Chr(by(i)) Like "#" Then tmp(ii) = Chr(by(i)): ii = ii + 1
Next i
Nums = Trim(Join(tmp, vbNullString)) ' return string with numbers only
End Function
呼び出し例
Sub testByteApproach()
Dim s$: s = "a12bx99y /\:3,14159" ' [1] define original string
Debug.Print s & " => " & Nums(s) ' [2] display original string and result
End Sub
イミディエイトウィンドウに元の文字列と結果の文字列を表示します:
a12bx99y /\:3,14159 => 1299314159
これはbrettdjとpstratonの投稿の変形です。
これは真の値を返しますが、#NUM!
エラー。そして\D
は、数字以外の短縮形です。残りは、このマイナーな修正を除いて、他のものと非常に似ています。
Function StripChar(Txt As String) As Variant
With CreateObject("VBScript.RegExp")
.Global = True
.Pattern = "\D"
StripChar = Val(.Replace(Txt, " "))
End With
End Function
私は同じ質問の答えを探していましたが、しばらくの間、自分の解決策を見つけ、将来それらのコードを必要とする他の人々と共有したいと思いました。機能のない別のソリューションを次に示します。
Dim control As Boolean
Dim controlval As String
Dim resultval As String
Dim i as Integer
controlval = "A1B2C3D4"
For i = 1 To Len(controlval)
control = IsNumeric(Mid(controlval, i, 1))
If control = True Then resultval = resultval & Mid(controlval, i, 1)
Next i
resultval = 1234
これは、 別の答え に基づいていますが、単に再構成されています:
数字以外を削除したい場合は、次のようなものを使用できるはずです。
'
' Skips all characters in the input string except digits
'
Function GetDigits(ByVal s As String) As String
Dim char As String
Dim i As Integer
GetDigits = ""
For i = 1 To Len(s)
char = Mid(s, i, 1)
If char >= "0" And char <= "9" Then
GetDigits = GetDigits + char
End If
Next i
End Function
これを呼び出す:
Dim myStr as String
myStr = GetDigits("3d1fgd4g1dg5d9gdg")
Call MsgBox(myStr)
以下を含むダイアログボックスが表示されます:
314159
これらの最初の2行は、必要に応じて、任意の文字列変数に格納する方法を示しています。