VBA - 使用用户定义公式的表上的 Range.Copy 方法错误

标签 vba excel excel-formula

我遇到了一个相当奇怪的问题,我想知道我是否做错了什么,或者这是否是一个 Excel 错误(使用 Excel 2010 for PC,顺便说一句)...为了解释一下,让我创建一个简单场景:

  1. 我定义了一个非常简单的 UDF,它使用 Range 对象的属性,例如:

    Public Function SillyThing(rng As Range) As Variant
        SillyThing = rng.IndentLevel
    End Function
    
  2. 我在工作簿中定义了一个简单的表格(例如 Table1 ),开头只有一行:

    Col1:      Col2:
    <blank>    =SillyThing([@col1])
    
  3. 我有一列单元格,例如 Range("F2:F8")

  4. 我有以下Sub定义:

    Sub Macro3()
        Range("F2:F8").Copy Range("Table1[col1]")
    End Sub
    

现在,当我运行该宏时,它会给出 #VALUE!我的表格中整个第二列出现错误(其中公式将自动填充)。

但是,如果我使用以下宏:

Sub Macro2()
    Range("F2:F8").Select
    Selection.Copy
    Range("Table1[col1]").Select
    ActiveSheet.Paste
End Sub

然后就可以正常工作了!

调试时,如果我在 UDF 中放置断点,我发现Range对象在 Macro3 中经过对于其许多属性有以下声明 - : IndentLevel : <Unable to get the IndentLevel property of the Range class> : Variant : Module1.SillyThing

显然,我知道如何使用与Macro2相同的想法来修复它。 ,但我真的很好奇这是否是一个已知问题,或者是否有我遗漏的东西/我不熟悉的其他解决方法。

希望这是有道理的!!

谢谢!!!

最佳答案

我注意到了和你一样的事情。

but I'm really curious if this is a known issue or if there's something I'm missing / other workarounds I'm unfamiliar with.

不确定这是否是一个已知问题,这看起来确实违反直觉。为什么它不起作用???如果我不得不冒险猜测,那就是一个错误。从工作表调用 UDF 时,有一个已知的限制,即它们无法访问某些属性,也无法与未作为参数传递给函数本身的其他范围交互,等等。但在这种情况下唯一被访问的范围是作为参数传递给函数本身的范围,因此这实际上没有意义,但这是我想到的第一件事。

即使这个解释没有意义...如果我这样做,函数会在 ret = ... 行出错:

Public Function SillyThing(rng As Range) As Variant
    Dim ret As Variant
    ret = rng.IndentLevel
    SillyThing = ret
End Function

我什至尝试过评估范围地址缩进级别,例如 [A2].indentLevel ,它引发了相同的错误。该范围确实存在,并且它不是多单元格范围(这可能会引发错误)。

但是,如果我这样做,该函数不会出错并且表格会通过复制/粘贴进行更新:

Public Function SillyThing(rng As Range) As Variant

    SillyThing = rng & " 1"
End Function

因此,这肯定与某些无意的限制有关,这些限制阻止您访问范围参数的 .IndentLevel 属性。

但这里有另一个稍微更优雅的解决方法:尝试这个而不是 Macro2 - 至少比使用 Select 方法更好:)

Range("Table1[Col2]").Copy  'Or Range("F2:F8").Copy - both seem to work the same
Range("Table1[Col1]").PasteSpecial xlPasteFormulas

这个方法也应该有效:

Application.Calculation = xlCalculationManual
Range("E2:E5").Copy Range("Table1[Code]")
Application.Calculation = xlCalculationAutomatic
Application.Calculate

关于VBA - 使用用户定义公式的表上的 Range.Copy 方法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24759419/

相关文章:

excel - 从特定工作表中删除 Excel 中的重复行

vba - 确定给定时间是否在开始时间和结束时间之间

excel - VBA 将单元格格式设置为常规

c# - 如何识别工作表已最小化?

vba - Excel 2003 中的 ActiveSheet.AutoFilter.Sort.SortFields.Clear

vba - 创建工作表,带有模板链接的新行 - 仅一步之遥

excel - 禁用删除工作表

c# Excel 跳过第一行?

excel - 类似于 VLookup 的函数,但返回每个相关的值

excel - Excel 何时以及如何重新计算其公式?