VBA数据透视表代码仅能运行一次,运行时报438错误求助
解决VBA创建透视表时的运行时错误'438'问题
嘿,我一眼就揪出问题啦!你的代码里藏着个拼写错误,这正是触发运行时错误438的元凶。
核心问题:属性名拼写失误
在设置FACULTY_ID字段的位置时,你把.Position写成了.Postion(少了一个s):
With .PivotFields("FACULTY_ID") .Orientation = xlDataField .Postion = 1 ' 这里拼写错误!正确写法是 .Position End With
PivotField对象根本没有Postion这个属性,VBA找不到对应的方法,自然就抛出了“Object doesn't support this property or method”的错误。
为什么第一次能生成透视表,第二次不行?
- 第一次运行时,错误发生在代码后半段:前面的逻辑已经完成了透视表的创建、基础属性配置,以及
STUDYBOARD_ID字段的设置,所以哪怕报错中断,已经执行的部分还是能生成透视表。 - 第二次运行时,第一次的错误可能让PivotCache处于异常状态,加上错误直接打断了代码执行,后续的透视表创建步骤没走完,自然就生成失败了。
修正后的完整代码
只需要把拼写错误的.Postion改成.Position就能解决问题,下面是修正后的完整代码:
Sub Pivot1() Dim PvtTbl As PivotTable Dim PvtCache As PivotCache Dim PvtTblName As String Dim pivotTableWs As Worksheet PvtTblName = "pivotTableName" Set pivotTableWs = Sheets("Delayed Students") Set PvtCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:="Delayed Students!R1C1:R1532C7") Set PvtTbl = pivotTableWs.PivotTables.Add(PivotCache:=PvtCache, TableDestination:=pivotTableWs.Range("J1"), TableName:=PvtTblName) With PvtTbl .ColumnGrand = True .HasAutoFormat = True .DisplayErrorString = False .DisplayNullString = True .EnableDrilldown = True .ErrorString = "" .MergeLabels = False .NullString = "" .PageFieldOrder = 2 .PageFieldWrapCount = 0 .PreserveFormatting = True .RowGrand = True .SaveData = True .PrintTitles = False .RepeatItemsOnEachPrintedPage = True .TotalsAnnotation = False .CompactRowIndent = 1 .InGridDropZones = False .DisplayFieldCaptions = True .DisplayMemberPropertyTooltips = False .DisplayContextTooltips = True .ShowDrillIndicators = True .PrintDrillIndicators = False .AllowMultipleFilters = False .SortUsingCustomLists = True .FieldListSortAscending = False .ShowValuesRow = False .CalculatedMembersInFilters = False .RowAxisLayout xlCompactRow With .PivotCache .RefreshOnFileOpen = False .MissingItemsLimit = xlMissingItemsDefault End With .RepeatAllLabels xlRepeatLabels With .PivotFields("STUDYBOARD_ID") .Orientation = xlRowField .Position = 1 End With With .PivotFields("FACULTY_ID") .Orientation = xlDataField .Position = 1 ' 已修正拼写错误 End With End With End Sub
额外优化建议(可选)
你当前用了固定数据源范围R1C1:R1532C7,如果后续数据行数变化,这个范围就会失效。可以改成动态获取数据源,适配数据量的变化:
Dim sourceRange As Range Set sourceRange = pivotTableWs.Range("A1").CurrentRegion Set PvtCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=sourceRange)
这样不管数据行数怎么变,都能自动抓取完整的数据源。
内容的提问来源于stack exchange,提问作者J. Carter
相关产品推荐
相关产品推荐

