VBA-具有用户定义公式的表上的Range.Copy方法错误
我遇到了一个相当奇怪的问题,我想知道我是否做错了什么,或者这是一个Excel错误(顺便说一句,在PC上使用Excel 2010)。。。为了解释,让我创建一个简单的场景: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
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