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

时间:2014-07-15 13:23:46

标签: excel vba excel-vba excel-formula

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

  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
    
  5. 现在,当我运行该宏时,我的表中的整个第二列都会出现#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相同的想法修复它,但我真的很好奇这是一个已知的问题,还是我遗漏的东西/其他变通方法我不熟悉

    希望这有意义!!

    感谢!!!

1 个答案:

答案 0 :(得分:1)

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

  

但我真的很好奇,如果这是一个已知问题,或者我有什么遗漏/其他我不熟悉的变通方法。

不确定这是否是一个已知问题,它肯定似乎是违反直觉的。为什么不行?如果我不得不猜测,这是一个错误。当从工作表调用时,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属性。

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

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