VBA – 使用用户定义公式的表格中的Range.Copy方法错误

我遇到了一个相当奇怪的问题,我想知道如果我做错了什么或如果这是一个Excel错误(使用Excel 2010的PC,BTW)…为了解释,让我创build一个简单的scheme:

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

    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 

现在,当我运行这个macros,它给了我#VALUE! 我的表中整个第二列的错误(公式将被自动填充)。

但是,如果我使用下面的macros代替:

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

那么它工作得很好!

在debugging时,如果我在UDF中放置一个断点,我发现在Macro3传递的Range对象对于其许多属性具有以下语句: IndentLevel : <Unable to get the IndentLevel property of the Range class> : Variant : Module1.SillyThing

显然,我知道如何使用与Macro2相同的想法来解决这个问题,但是我真的很好奇,如果这是一个已知的问题,或者是我缺less的东西或者我不熟悉的其他解决方法。

希望这是有道理的!

谢谢!!!

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

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

不知道这是不是一个已知的问题,它肯定是反直觉的。 为什么不行? 如果我不得不冒险猜测,这是一个错误。 从工作表中调用UDF时存在一个已知的限制,即它们不能访问某些属性,并且不能与其他不作为parameter passing给函数本身的范围进行交互,等等。但是在这种情况下唯一被访问的范围是一个作为parameter passing给函数本身,所以甚至没有意义,但这是我首先想到的。

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

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

我甚至试过这个评估范围地址indentlevel像[A2].indentLevel提出了同样的错误。 范围确实存在,它不是一个多单元格范围(可能会导致错误)。

但是,如果我这样做,而不是错误,并表复制/粘贴更新:

 Public Function SillyThing(rng As Range) As Variant SillyThing = rng & " 1" End Function 

所以它肯定似乎与一些无意中的限制相关,这会阻止您访问range参数的.IndentLevel属性。

但是,这是另一个更优雅的解决方法:而不是Macro2,试试这个 – 至less比使用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