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