我遇到了一个相当奇怪的问题,我想知道我做错了什么或者这是一个Excel错误(使用Excel 2010 for PC,BTW)...要解释一下,让我创建一个简单的场景:
我定义了一个非常简单的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
相同的想法修复它,但我真的很好奇这是一个已知的问题,还是我遗漏的东西/其他变通方法我不熟悉
希望这有意义!!
感谢!!!
答案 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