使用 VBA 在 Excel 2016 中复制和粘贴值

使用 VBA 在 Excel 2016 中复制和粘贴值

我是 VBA 新手,我需要帮助编写一个可以在公式中调用的函数,该函数应该复制单元格的值(该单元格不应该是预定义的固定单元格,而应该是我们必须能够在调用该函数时选择它),并将它们粘贴到调用该函数的单元格旁边的单元格中。

例子:

在此处输入图片描述

在上面的函数中,如果单元格 B3 和 C3 中的值相等,则单元格 E3 中的公式应调用函数“Myfunction()”,此函数必须将单元格 D3 中的总和复制到单元格 F3,并且我们必须能够选择要复制的单元格(myfunction(D3),D3 可以变化,可能是 E3 或 F3 等)

我的代码:


Dim c As Range
Function myfunction(c)
myfunction = c.Select
Selection.Copy
Range("c" + 1).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Function

“c”应该是变量。

答案1

并将它们粘贴到调用该函数的单元格旁边的单元格中。

这是不可能的,从工作表中的公式调用的 VBA 函数无法访问工作表中的任何其他单元格。


自定义函数除了向工作表中的公式或其他 VBA 宏或函数中使用的表达式返回值外,不允许执行任何其他操作。例如,自定义函数不能调整窗口大小;不能编辑单元格中的公式;也不能更改单元格中文本的字体、颜色或图案选项。如果在函数过程中包含此类“操作”代码,则该函数将返回 #VALUE! 错误。

Microsoft Excel UDF 指南

答案2

正如 Máté Juhász 所指出的,自定义公式无法改变其他单元格。尝试这样做将返回#价值!公式所在单元格有错误。

关于第一部分(访问随机单元格即 D3 的值),您可以简单地返回价值源单元格范围变量:

Function MyFunction(SourceCell As Range)
    MyFunction = SourceCell.Value
End Function

这可以在您的原始公式中使用=IF(C3=B3,myfunction(D3),""),该公式直接放在例如 F3 中。它也可以通过将 F3 的值更改为 来在例如 E3 中使用=E3

您(显然)不限于一个单元格 - 如果您想在公式本身中进行初始比较,则可以使用=myfunction(B3, C3, D3)如下函数:

Dim ReturnValue As Variant

Function MyFunction(FirstCell As Range, SecondCell As Range, SourceCell As Range)

    If FirstCell.Value = SecondCell.Value Then
        'If our source is empty, return an error
        If SourceCell.Value = "" Then
            ReturnValue = "Empty Source"
        Else
            ReturnValue = SourceCell.Value
        End If
    Else
        'Our input cells aren't equal
        ReturnValue = "Not Equal"
    End If

    'Return our final value to the cell
    MyFunction = ReturnValue

End Function

相关内容