使用函数复制范围并报告错误

时间:2014-06-20 08:06:41

标签: excel-vba vba excel

这是我的代码

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)允许它运行,但这一行中的错误是什么?

2 个答案:

答案 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

请注意,我已解决的代码中存在其他几个问题

  1. 当您希望函数返回错误时,请返回...错误
  2. 为了确保正确塑造范围,单独计数细胞是不够的
  3. 不要在一个范围内循环,一次复制。
  4. 您的函数应返回某些内容
  5. 您应该Dim所有变量(使用Option Explicit强制执行此操作)
  6. 使用有意义的参数名称
  7. 感谢Tim Willaims for the concept

答案 1 :(得分:0)

在工作表中,无法使用能够完成任务的功能。只有一个返回数据。这是非常合乎逻辑的,因为每次工作表更改时都会评估函数 如果您真的想要这种行为,请使用Worksheet_Change事件 另请注意,在您的示例中,与一次复制范围相比,将单元格逐个复制1非常无效。