我们可以在功能上更改工作表吗?

时间:2010-09-06 02:58:38

标签: excel-vba vba excel

我正在尝试编写一个以范围作为参数的vba函数,并将一些系数返回到工作表。但是当我尝试从函数中向我的工作表写入任何内容时,我得到一个未定义的值(#VALUE!)。当我将函数更改为宏(子)并对函数中的参数进行硬编码时,它允许我在工作表中设置值。

' these don't work
Sheets("Sheet1").Cells(4, 1) = x
Sheets("Sheet1").Range(4, 1) = x

你能给我一个函数的简单例子,它将一系列值作为参数,计算一些东西,并将答案写回工作表。

2 个答案:

答案 0 :(得分:1)

此功能可以像许多单个单元格中使用的内置函数一样使用

Public Function TestMe(rangeX As Range) As String
    TestMe = "This is a test - " & rangeX.Value
End Function

但如果您尝试影响其他单元格则会出错

下一个方法需要从按钮或手动运行宏作为宏运行。此方法假定它将传递两个单个单元格范围。

Public Sub RunTest()
    'A1 and A2'
    Test2 Sheets("Sheet1").Cells(1, 1), Sheets("Sheet1").Cells(2, 1)
End Sub

Public Sub Test2(rangeX as Range, rangeY as Range)
    'write values out to A4 and B4'
    Sheets("Sheet1").Cells(4, 1) = rangeX
    Sheets("Sheet1").Cells(4, 2) = rangeY
End Function

答案 1 :(得分:0)

如果您想要的是一个返回多个值的用户定义函数,请尝试使用数组函数 通过选择工作表中的单元格范围,键入函数并按Ctrl-Shift-Enter输入数组函数。结果是您键入的函数位于您选择的每个单元格中,包含在{}

您的用户定义函数需要返回一组值 例如

Function MyArrayFunction(r As Range) As Variant
Dim cl As Range
Dim i As Long, j As Long
Dim v() As Variant

ReDim v(1 To Application.Caller.Rows.Count, 1 To Application.Caller.Columns.Count)
For i = 1 To UBound(v, 1)
    For j = 1 To UBound(v, 2)
        v(i, j) = i * j + r.Value
    Next
Next

MyArrayFunction = v

结束功能

要使用,请选择范围,例如A1:B4,键入=MyArrayFunction(D1),按Ctrl-Shift-Enter 如果D1包含0,则结果为A1 = 1,B1 = 2,A2 = 2,B2 = 4,A3 = 3,B3 = 6,A4 = 4,B4 = 8