有没有办法将数组的所有元素从字符串转换为double而不必逐个转换每个元素。我想尽可能避免使用循环。我想知道VBA不是VB.Net
答案 0 :(得分:3)
在某些情况下,您可以使用CopyMem在不同类型的数组之间移动数据。 (例如,字符串到整数数组。)但是这不适用于String和Doubles,因为等效值在字节级别以不同方式存储。因此,字符串二进制“1”与双二进制的1和0不同,反之亦然。
一般来说,您需要使用转换功能:
Public Sub Test()
Const clUprBnd As Long = 9&
Dim asTest(clUprBnd) As String
Dim adTest() As Double
Dim lIndx As Long
For lIndx = 0& To clUprBnd
asTest(lIndx) = CStr(lIndx)
Next
adTest = StringArrayToDoubleArray(asTest)
MsgBox adTest(5)
End Sub
Private Function StringArrayToDoubleArray(ByRef values() As String) As Double()
Dim lIndx As Long, lLwrBnd As Long, lUprBnd As Long
Dim adRtnVals() As Double
lLwrBnd = LBound(values)
lUprBnd = UBound(values)
ReDim adRtnVals(lLwrBnd To lUprBnd) As Double
For lIndx = lLwrBnd To lUprBnd
adRtnVals(lIndx) = CDbl(values(lIndx))
Next
StringArrayToDoubleArray = adRtnVals
End Function
答案 1 :(得分:2)
这个确切问题的答案是“不”。没有内置的VBA运算符可以处理类似的类型数组。
但是,您可以拥有一组变体,并且可以包含字符串或双精度的元素(当然还有其他内容)。因此,如果您的关注点是能够传递数组或使用单个元素而无需进行显式转换,那么您可以执行以下操作:
Public Sub passesStuff()
Call expectsNumericStuff(Array("1", "2", "3"))
Call expectsNumericStuff(Array(1, 2, 3))
End Sub
Public Sub expectsNumericStuff(arr)
Debug.Assert IsArray(arr)
Debug.Assert IsNumeric(arr(1))
Debug.Print arr(1) * 42
End Sub
显然,变体的所有优点和缺点都适用,应该牢记在心。
答案 2 :(得分:2)
我正在尝试从概念上思考如何在任何抽象层上对每个(此处的关键字为每个)项目“做某事”在一个数组中,一次不处理一个。
在关于单个CPU的最低抽象级别,数组中的每个项目总是一次处理一个。如果没有迭代通过集合中的每个项,CPU无法获取集合并神奇地转换每个元素。 迭代(以及循环)和每个这两个词非常享受彼此的公司。
现在,在更高层次的抽象中,是否有可能向程序员呈现看起来的方法/函数/过程,就像它在整个集合上一样?是的,这很可能。 LINQ(在.NET中)做了很多。但是,所有LINQ都为程序员提供了一种方法,可以仅使用一个语句对集合中的每个项进行操作。
即使VBA有办法将数组中的元素从一种类型转换为另一种类型(我不相信它),但在一些抽象级别,程序将不得不迭代通过列表中的每个项来执行更改。
话虽如此,我认为你已经陷入了困境。您可以做的最好的事情是将此功能包装在一个Function中。这是一个带有一些测试代码的示例函数:
Function ConvertArray(arrStr() As String) As Double()
Dim strS As String
Dim intL As Integer
Dim intU As Integer
Dim intCounter As Integer
Dim intLen As Integer
Dim arrDbl() As Double
intL = LBound(arrStr)
intU = UBound(arrStr)
ReDim arrDbl(intL To intU)
intCounter = intL
Do While intCounter <= UBound(arrDbl)
arrDbl(intCounter) = CDbl(arrStr(intCounter))
intCounter = intCounter + 1
Loop
ConvertArray = arrDbl
End Function
Sub Test()
Dim strS(0 To 2) As String
Dim dblD() As Double
Dim dbl As Variant
strS(0) = "15.5"
strS(1) = "12"
strS(2) = "4.543"
dblD = ConvertArray(strS)
For Each dbl In dblD
Debug.Print dbl
Next dbl
End Sub