VBA变种数组的错误

我是相当新的Excel VBA,我似乎无法解决与vbArrays这个问题。 我创build了vba中的函数cumsum,只是为了让我的生活更轻松。 不过,我想让代码更加灵活,以至于我可以从函数和范围中传递两个变体。 在我的代码中,当我添加了行vec = vec.value,如果我传入一个范围,它工作得很好,但它不工作,如果我希望它工作,如果我调用该函数并传入非范围types。 我注意到的是,如果我没有在我的代码行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 

@Jake和@chris的答案暗示了正确的方向,但我认为它们不够用。

如果你确定你只会把这个例程作为一个UDF来调用(例如从工作表中的公式),那么你真正需要做的就是添加这个:

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

到你的function的开始。 作为一个UDF调用,它唯一应该传递的对象types是Range 。 另外,作为一个UDF,你可以依靠这样一个事实,即任何获得的数组都将从1开始索引。

我可以根据自己的日常习惯挑选其他问题,但这些问题与您最初的问题不相上下。 简而言之:这只能在列向量上工作,对于单个单元格区域将会失败

请注意,您的getDimension函数为Range s返回零的原因,因为UBound窒息的范围。 您的error handling程序愉快地捕获一个错误(types不匹配),你并不真正期望得到并返回零。 (find“维度”的方法是假定错误将是下标超出范围的错误。)

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

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

最后, VarType的问题是,当传递一个具有默认属性的对象时,它实际上会返回属性的types。 所以VarType(<range>)会告诉你范围内的东西的types,而不是对象的代码,因为Range有一个默认的属性Range.Value

为什么不使用VarType和TypeName检查vec的数据types,然后对vec执行必要的操作

 Public Function cumsum2(vec As Variant) As Variant MsgBox TypeName(vec) MsgBox VarType(vec) cumsum2 = 0 End Function 

修改您的getDimension以包含

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