我遇到了一个相当奇怪的问题,我想知道我是否做错了什么,或者这是否是一个 Excel 错误(使用 Excel 2010 for PC,顺便说一句)...为了解释一下,让我创建一个简单场景:
我定义了一个非常简单的 UDF,它使用 Range 对象的属性,例如:
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
现在,当我运行该宏时,它会给出 #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/