繁体   English   中英

vba变种数组bug

[英]vba variant array bug

我是excel vba的新手,我似乎无法解决vbArrays的这个问题。 我在vba中创建了函数cumsum只是为了让我的生活更轻松。 但是,我想使代码变得灵活,以便我可以从函数和范围传递两种变体。 在我的代码中,当我添加行vec = vec.value如果我在一个范围内传递时,它工作得很好但是如果我想要它工作,如果我调用该函数并传入非范围类型它不起作用。 我注意到的是如果我的代码中没有行vec = vec.value并且我传入一个范围,它的维度为0,我通过编写自己的函数来检查。 有人可以向我解释如何解决这个问题吗? 谢谢。

Public Function cumsum(vec As Variant) As Variant
    Dim temp() As Variant
    MsgBox (getDimension(vec))
    'works if i use vec=vec.value if vec is a range but has 0 if i do not vec = vec.values
    ReDim temp(LBound(vec, 1) To UBound(vec, 1), 1 To 1) As Variant
    Dim intCounter As Integer
    For intCounter = LBound(vec) To UBound(vec)
        If intCounter = LBound(vec) Then
            temp(intCounter, 1) = vec(intCounter, 1)
        Else
            temp(intCounter, 1) = temp(intCounter - 1, 1) + vec(intCounter, 1)
        End If
    Next
    cumsum = temp()
End Function
Function getDimension(var As Variant) As Integer
On Error GoTo Err:
    Dim i As Integer
    Dim tmp As Integer
    i = 0
    Do While True:
        i = i + 1
        tmp = UBound(var, i)
    Loop
Err:
    getDimension = i - 1
End Function

为什么不通过使用VarTypeTypeName检查vec的数据类型,然后在vec上执行必要的操作

Public Function cumsum2(vec As Variant) As Variant
    MsgBox TypeName(vec)
    MsgBox VarType(vec)

    cumsum2 = 0
End Function

来自@Jake和@chris的答案是正确方向的提示,但我认为它们还远远不够。

如果您完全确定您只将此例程称为UDF(即来自工作表中的公式),那么您真正需要做的就是添加:

If IsObject(vec) Then
    Debug.Assert TypeOf vec Is Range

    vec = vec.Value2
End If

到你的功能的开始。 被称为UDF,它应该传递的唯一对象类型是Range 此外,称为UDF,您可以依赖于它传递的任何数组将从1开始索引的事实。

我可以通过你的日常工作来解决其他问题,但它们将与你原来的问题无关。 简而言之:这只适用于列向量,对于单格范围等,它将失败。

请注意, getDimension函数为Range s返回零的原因是因为UBound在范围内阻塞。 您的错误处理程序很乐意捕获您实际上并不期望获得并返回零的错误(类型不匹配)。 (找到“维度”的方法是假设错误将是下标范围错误。)

我写了一个回答,前后描述了为什么在使用Excel时,我不认为一般的getDimension方法是一个好方法:

https://stackoverflow.com/a/6904433/58845

最后, VarType的问题在于,当传递具有默认属性的对象时,它实际上将返回属性的类型。 因此VarType(<range>)将告诉您范围内的东西的类型,而不是对象的代码,因为Range具有默认属性Range.Value

修改你的getDimension以包含

If TypeName(var) = "Range" Then
    var = var.Value
End If

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM