VBA – 使用用户定义公式的表格中的Range.Copy方法错误
我遇到了一个相当奇怪的问题,我想知道如果我做错了什么或如果这是一个Excel错误(使用Excel 2010的PC,BTW)…为了解释,让我创build一个简单的scheme:
-
我定义了一个非常简单的使用Range对象属性的UDF,例如:
Public Function SillyThing(rng As Range) As Variant SillyThing = rng.IndentLevel End Function
-
我有一个简单的表在我的工作簿(
Table1
,说),在开始只有一行:Col1: Col2: <blank> =SillyThing([@col1])
-
我有一列的单元格,比如
Range("F2:F8")
-
我有以下的
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