Excel VBA类与对象基础问题:Location属性报错原因咨询
嘿,我来帮你把这事儿掰扯清楚!先从类和对象的关系讲起,再解决你遇到的报错问题~
类(Class)与对象(Object)的通俗理解
打个很接地气的比方:PivotTable类就像是一张透视表的设计图纸,它规定了所有透视表该有什么特征(比如名字、位置),以及能做什么操作(比如刷新、移动位置)。而你代码里的ActiveSheet.PivotTables(1)、ActiveSheet.PivotTables("PivotTable12")这些,就是根据这张图纸造出来的真实透视表对象——就是你工作表里实实在在存在的那个表格。
每个对象都继承了类定义的“配置”,但要注意:类里的成员分两种:
- 属性:是对象的特征,大部分可以直接读取(比如
Name,就是透视表的名字),有些还能修改; - 方法:是对象能执行的动作,比如移动、刷新,这些需要按特定方式调用,不能像属性那样直接读取。
为什么前半段代码正常,后半段报错?
先把你贴的代码整理成清晰的格式:
' 以下语句正常运行 ? ActiveWorkbook.ActiveSheet.PivotTables.Count ' 返回透视表总数3 ? ActiveWorkbook.ActiveSheet.PivotTables(1).Name ' 返回第一个透视表的名字PivotTable12 ? ActiveWorkbook.ActiveSheet.PivotTables(2).Name ' 返回第二个透视表的名字PivotTable3 ? ActiveWorkbook.ActiveSheet.PivotTables(3).Name ' 返回第三个透视表的名字PivotTable2 ' 以下语句全部报错:Object doesn't support this action (Error 445) ? ActiveSheet.PivotTables(1).Location ? ActiveSheet.PivotTables(2).Location ? ActiveSheet.PivotTables(3).Location ? ActiveSheet.PivotTables("PivotTable12").Location
问题的核心是:你把Location当成了可以直接读取的属性,但它其实是一个方法!在Excel VBA的PivotTable类里,Location的作用是移动透视表到指定位置,而不是返回当前位置的字符串。
如果你想获取透视表的当前位置,应该用TableRange1或者TableRange2属性(这两个属性返回透视表的单元格区域对象),然后通过Address拿到位置字符串,比如:
' 获取第一个透视表的位置地址 ? ActiveSheet.PivotTables(1).TableRange1.Address
而Location方法的正确用法是这样的(比如把透视表移动到Sheet2的A1单元格):
ActiveSheet.PivotTables(1).Location Destination:=Sheet2.Range("A1")
你之前直接像读取Name那样读取Location,相当于让一个“动作”给你返回一个值,这显然不符合它的设计,所以就触发了报错。
最后再划个重点
- 类是模板,对象是模板实例化出来的具体事物;
- 别把类里的方法当成属性用,不同成员的调用方式不一样;
- 你遇到的445错误,就是因为误把“移动透视表”的方法当成了“读取位置”的属性来用。
内容的提问来源于stack exchange,提问作者mopwop
相关产品推荐
相关产品推荐

