2014-12-05 69 views
1

我有一个包含一些像“12_34_56”拆分单元值成数字数组

我使用的小区:

MyNumbers = Split(Cells(1, 1).Value, "_") 

到的数值分成数组,但结果是一个字符串数组!

我知道我可以在数组的每个值上使用CInt,但不是以任何方式直接获取数值数组吗?

在此先感谢

+0

请问直接把它拆分成一个'Integer'数组的目的是什么? – 2014-12-05 10:36:36

+1

['Split()'function](http://msdn.microsoft.com/en-us/library/gg278528(v = office.14).aspx)总是返回一个基于字符串的数组。在VBA中没有直接的'.Cast '。你需要一个包装器来将基于String的数组转换为基于Integer的数组。 – 2014-12-05 10:39:12

+0

1)只能避免在从数组中提取每个值时使用CInt。 2)所以在每个值上使用CInt是最简单的解决方案? – genespos 2014-12-05 10:45:41

回答

1

据我知道这是不可能的,以一个类型的数组转换为另一种类型的单次调用,但如果你打算做在多个位置这个转换显而易见的选择是编写返回所需的结果的功能,如下图所示:

Public Function SplitIntegers(StringToSplit As String, Sep As String) As Variant 
    Dim arrStrings() As String 
    Dim arrIntegers() As Integer 
    Dim i As Long 

On Error GoTo Err_SplitIntegers 
    arrStrings = Split(StringToSplit, Sep) 
    ReDim arrIntegers(LBound(arrStrings) To UBound(arrStrings)) 

    For i = LBound(arrStrings) To UBound(arrStrings) 
     arrIntegers(i) = CInt(arrStrings(i)) 
    Next i 

    SplitIntegers = arrIntegers 
    Exit Function 

Err_SplitIntegers: 
    Select Case Err.Number 
     Case 13 'Type Mismatch Error: StringToSplit contains non-numeric substrings 
      On Error GoTo 0 
      Err.Raise 9114, "SplitIntegers", _ 
         "SplitIntegers failed: substring '" & arrStrings(i) & "' of string '" & StringToSplit & "' is not numeric" 
     Case Else 'Unhandled error, return to calling code 
      Dim iErrNum As Integer, strErrDesc As String 
      iErrNum = Err.Number 
      strErrDesc = Err.Description 
      On Error GoTo 0 
      Err.Raise iErrNum, "SplitIntegers", strErrDesc 
    End Select 
End Function 

当你需要这个功能,你可以调用这个函数作为一个班轮,你会分流功能。

Dim arrMyInts() As Integer 
arrMyInts = SplitIntegers(Cells(1,1).Value, "_") 
+0

错误处理! – 2014-12-05 11:13:23

+2

@ vba4all真的值得处理函数中的错误吗?如果我运行(或可能运行)语句'SplitIntegers(“Bob_Alice_Fred_Emily”,“_”)'我完全期望类型不匹配错误,并且包含调用代码中的错误处理,我可以修改或以更好的上下文感觉回应无效输入。验证这种输入可能是正则表达式的工作。 – Aiken 2014-12-05 12:03:24

+0

任何函数都可以处理可能由函数引起的错误。 Type-mismatch不是来自传入错误的类型参数,而是来自函数体内的Cint。如果你允许某人传递一个字符串,他们这样做 - 他们不会通过传递一个字符串知道他们做错了什么 - 一个简单的错误转到

1

这对我很好,非常容易设置!我将用单元格A1作为数字串的例子。

Dim strarray as Variant 
Dim intarray as Variant 
Dim x as Long 

strarray = Split(Range("A1").Value, "_") 
ReDim intarray(LBound(strarray) to UBound(strarray)) 
For x = LBound(strarray) To UBound(strarray) 
    intarray(x) = CInt(strarray(x)) 
Next x