【问题标题】:How can I pass a cell range as an argument?如何将单元格范围作为参数传递?
【发布时间】:2020-06-19 19:18:06
【问题描述】:

如何在 VBA 中创建一个函数,以便将单元格区域作为参数传递?

例如,我想在一个随机单元格中调用电子表格中的函数,通过编写

=function_name(A2:A7) 

当我在电子表格中调用它时,我的代码给了我一个 ?NAME# 错误。

Public Function xyz ( ByRef x() As Variant, sizeOfSelection As Integer )
xyz=x(0);
End Function

它被编码在一个模块中,我的宏是打开的。

【问题讨论】:

  • ByVal x As Range。或者stackoverflow.com/q/57159554/11683,如果你想通用的话。
  • 这个函数应该做什么?
  • 您的示例代码有不同的问题。首先它有一个语法错误,其次你从不使用参数`sizeoOfSelection,第三你的调用只有一个参数。范围永远不是数组,您的第一个参数是什么。
  • @Storax,是的,sizeOfSelection 也没有在给定的示例中传递

标签: excel vba excel-2010


【解决方案1】:

请尝试下一种方法:

Public Function xyz (rng as Range) As String
    dim arr as variant
    arr = rng.value
    if rng.cells.count>1 then
        Debug.print arr(1, 1), arr(1, ubound(arr,2))
        xyz = rng.Address & " - " & arr(1, 1)
    Else
        xyz = rng.value
    End if
End Function

这只是一个例子?你希望它做什么/返回?

【讨论】:

    【解决方案2】:

    在下面的代码中,我们简单地评估参数,如果 Range 将调用其默认成员,即 .Value,它将为多个单元格的 Range 返回一个变体数组。相反,将变量数组包含在方括号中什么都不做,因此它不受影响。

    Sub Test()
        Dim rng As Excel.Range
        Set rng = ActiveSheet.Range("FooBar")
    
        AllowBothRangeAndVariantArray rng
        AllowBothRangeAndVariantArray rng.Value2
    End Sub
    
    Function AllowBothRangeAndVariantArray(ByVal v As Variant)
        v = (v)  '* if v is a Range this will call the default member which is value
        'Debug.Print v(1, 1)
    End Function
    

    所以这是一个单行(如果你省略了用于调试的 Debug.Print)

    我也在工作表中对此进行了测试。

    【讨论】:

    • 有同样的问题stackoverflow.com/a/62477223/11683 原来有。如果Range("FooBar") 是单个单元格,则会失败。
    • @GSerg 这不是我想要表达的意思。我试图说明的一点是使用括号将范围转换为变体,同时保持变体不变。也适用于单细胞。当然,如果您的功能逻辑取决于形状,则必须继续检查尺寸..
    • v(1,1) 假定为二维数组。单个单元格的值根本不是数组。
    • 是的,我知道。答案由提问者改编。文本确实说删除括号中的 Debug.Print。
    【解决方案3】:

    范围 UDF

    尝试以下方法:

    Option Explicit
    
    Function xyz(CountRange As Range) As Long
        xyz = Application.WorksheetFunction.Count(CountRange)
    End Function
    
    Function xyzSum(SumRange As Range) As Long
        xyzSum = Application.WorksheetFunction.Sum(SumRange)
    End Function
    
    Function xyzIf(CountRange As Range, Criteria as long) As Long
        xyzIf = Application.WorksheetFunction.CountIf(CountRange, Criteria)
    End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 2015-04-23
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      相关资源
      最近更新 更多