这是我的代码
Function copyToNewRange(a As Range, b As Range)
' a is input, b is output
If a.Cells.Count <> b.Cells.Count Then
copyToNewRange = "ERROR"
Exit Function
End If
For i = 1 To a.Cells.Count
b.Cells(i, 1) = a.Cells(i, 1)
Next i
copyToNewRange = "COPIED"
End Function
我会这样使用它:
=copyToNewRange(A11:A30,C11:C30)
在不在输入或输出范围内的单元格中!
为什么我得#VALUE!?
我注意到注释b.Cells(i, 1) = a.Cells(i, 1)
允许它运行,但这一行中的错误是什么?
答案 0 :(得分:2)
UDF(用户定义的函数,从工作表调用)不能直接修改其他单元格,它只能返回一个值。但是,有一些解决方法。
其中一种解决方法是将Sub
作为字符串构建,并使用Evaluate
执行它。
这样的事情:
Function copyToNewRange(rSrc As Range, rDst As Range)
Dim sSub As String
If rSrc.Columns.Count > 1 Or rDst.Columns.Count > 1 Then
copyToNewRange = CVErr(xlErrValue)
ElseIf rSrc.Rows.Count <> rDst.Rows.Count Then
copyToNewRange = CVErr(xlErrValue)
Else
sSub = "copyToNewRangeSub(" & _
rSrc.Address(True, True, xlA1, True) & "," & _
rDst.Address(True, True, xlA1, True) & ")"
rSrc.Worksheet.Evaluate sSub
copyToNewRange = vbNullString
End If
End Function
Sub copyToNewRangeSub(rSrc As Range, rDst As Range)
rDst.Value = rSrc.Value
End Sub
请注意,我已解决的代码中存在其他几个问题
Dim
所有变量(使用Option Explicit强制执行此操作)答案 1 :(得分:0)
在工作表中,无法使用能够完成任务的功能。只有一个返回数据。这是非常合乎逻辑的,因为每次工作表更改时都会评估函数
如果您真的想要这种行为,请使用Worksheet_Change
事件
另请注意,在您的示例中,与一次复制范围相比,将单元格逐个复制1非常无效。