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

VBA-具有用户定义公式的表上的Range.Copy方法错误,vba,excel,excel-formula,Vba,Excel,Excel Formula,我遇到了一个相当奇怪的问题,我想知道我是否做错了什么,或者这是一个Excel错误(顺便说一句,在PC上使用Excel 2010)。。。为了解释,让我创建一个简单的场景: 我定义了一个非常简单的UDF,它使用范围对象的属性,例如: Public Function SillyThing(rng As Range) As Variant SillyThing = rng.IndentLevel End Function 我在工作簿中定义了一个简单的表(Table1),开头只有一行: Col

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

  • 我定义了一个非常简单的UDF,它使用范围对象的属性,例如:

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

    Col1:      Col2:
    <blank>    =SillyThing([@col1])
    
  • 现在,当我运行该宏时,它会给我
    #值错误(公式将在其中自动填充)

    但是,如果改用以下宏:

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

    调试时,如果在UDF中放置断点,我会发现在
    Macro3
    中传递的
    Range
    对象的许多属性都有以下语句-
    :IndentLevel::Variant:Module1.SillyThing

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

    希望这有意义


    谢谢

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

    但我真的很好奇,这是否是一个已知的问题,或者是否有我遗漏的东西/其他我不熟悉的解决方法

    不确定这是否是一个已知的问题,这显然是违反直觉的。为什么它不起作用???如果让我大胆猜测的话,那是个错误。从工作表调用UDF时存在一个已知的限制,即它们不能访问某些属性,也不能与未作为参数传递给函数本身的其他范围交互,等等。但在这种情况下,唯一被访问的范围是作为参数传递给函数本身的范围,这根本没有道理,但这是我想到的第一件事

    即使这种解释没有道理。。。如果我这样做,函数将在
    ret=…
    行出错:

    Public Function SillyThing(rng As Range) As Variant
        Dim ret As Variant
        ret = rng.IndentLevel
        SillyThing = ret
    End Function
    
    我甚至尝试过像
    [A2].indentlevel
    那样评估范围地址indentlevel,这会引发相同的错误。该范围确实存在,并且不是多单元格范围(可能会引发错误)

    但是,如果我改为执行此操作,函数不会出错,并且表会随着复制/粘贴而更新:

    Public Function SillyThing(rng As Range) As Variant
    
        SillyThing = rng & " 1"
    End Function
    
    因此,它显然与一些无意的限制有关,这些限制阻止您访问range参数的
    .IndentLevel
    属性。

    但这里有另一个稍微优雅的解决方法:代替Macro2,试试这个——至少比使用Select方法要好:)

    这种方法也应该有效:

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

    谢谢,David,这正是我最终使用的解决方法-正如我在问题中所说的,不是我不知道如何修复它,而是它是一个奇怪的bug/怪癖。。。听到这不仅仅是我做的愚蠢的错事,我真的很高兴。。。我将把这个问题再留待几天,希望其他人知道这一点,否则,我将用你的答案。。。感谢您抽出时间查看问题!
    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