首页 > 解决方案 > 使用带有 vba 的变体数据类型时出现问题

问题描述

我正在尝试学习使用变体数据类型但面临问题。

Public Function z_score(sections As Range, marks As Range) As Variant

    Dim n As Integer
    Dim score() As Variant 'marks range has a few empty cells and error cells as well
                           'hence using variant data type
    
    n = UBound(sections.Value)
    ReDim score(1 To n, 1 To 2)
    score = marks.Value   'assigning marks range values to first column of score

    For i = 1 To n        'adding second column with integer index for calling later
        score(i, 2) = i
    Next i

    z_score = score

End Function

我得到值错误而不是 nx2 矩阵作为输出。你能帮忙解决这个错误吗?非常感谢任何帮助,谢谢..

标签: arraysvbavariant

解决方案


恐怕有几个方面可能导致此代码失败:

  1. 如果传入的范围只有 1 个单元格,则对数组的赋值将引发错误。
  2. VBA 没有复制或克隆数组的方法,因此您的代码score = marks.Value没有按照您的评论所说的那样做,
  3. sections参数似乎没有做任何事情。您正在根据它调整数组的大小,然后迭代marks数组以分配值。
  4. 我不确定你想用这个函数做什么,但如果它是从工作表调用的 UDF,它需要是一个公式数组。

您可以按如下方式调整您的代码,使其更加健壮:

Public Function z_score(marks As Range) As Variant
    Dim scoreArray() As Variant, marksArray() As Variant
    Dim i As Long
    
    marksArray = RangeValueToArray(marks)
    
    ReDim scoreArray(1 To UBound(marksArray, 1), 1 To 2)
    
    For i = 1 To UBound(marksArray, 1)
        scoreArray(i, 1) = i
        scoreArray(i, 2) = marksArray(i, 1)
    Next
    
    z_score = scoreArray
    
    
End Function

Private Function RangeValueToArray(rng As Range) As Variant
    Dim v() As Variant
    
    If rng.Cells.Count = 1 Then
        ReDim v(1 To 1, 1 To 1)
        v(1, 1) = rng.Value2
        RangeValueToArray = v
        Exit Function
    End If
    
    v = rng.Value2
    RangeValueToArray = v
End Function

推荐阅读