运行时公式错误1004 swaformula

我得到公式错误信息:运行时错误1004,代码中公式的第二次重复; 有关的代码段如下,为了快速参考,我粘贴了下面两个公式,第一个运行OK,第二个给出我无法弄清的错误。

ActiveWorkbook.Names.Add Name:="pivotsourceFGPO", RefersToR1C1:=swaFormula (no errors when running the macro) ActiveWorkbook.Names.Add Name:="pivotsourceorderbase", RefersToR1C1:=swaFormula (FORMULA giving error) 

代码:(部分)

 swaFormula = "=OFFSET(" & _ ActiveWorkbook.Worksheets(ActiveSheet.Index).Name & "!R" & ActiveCell.Row & "C" & ActiveCell.Column & ",0,0,COUNTA(" & _ ActiveWorkbook.Worksheets(ActiveSheet.Index).Name & "!C" & ActiveCell.Column & ") -" & swarow & ",COUNTA(" & _ ActiveWorkbook.Worksheets(ActiveSheet.Index).Name & "!R" & ActiveCell.Row & ")-" & swacol & ")" ActiveWorkbook.Names.Add Name:="pivotsourceFGPO", RefersToR1C1:=swaFormula Dim PTCache As PivotCache Dim pt As PivotTable Dim WS As Worksheet Dim pvtfld As PivotField ' define the range which serves as the data range Set WS = Sheets.Add ' add new sheet to hold the pivot table Set PTCache = ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:="=pivotsourceFGPO") ' Create the pivot table Set pt = PTCache.CreatePivotTable(TableDestination:=WS.Range("A1"), TableName:="FGPOPivot") ActiveWorkbook.ShowPivotTableFieldList = True pt.PivotFields("Key").Orientation = xlRowField pt.PivotFields("Key").Position = 1 pt.PivotFields("MTL").Orientation = xlRowField pt.PivotFields("MTL").Position = 2 pt.PivotFields("Size Code").Orientation = xlRowField pt.PivotFields("Size Code").Position = 3 pt.PivotFields("Week").Orientation = xlColumnField pt.PivotFields("Week").Position = 1 pt.AddDataField pt.PivotFields("Wip Qty"), "Sum of Wip Qty", xlSum 'Order base 1 pivot Sheets("Order base (1)").Select Range("A1").Select swarow = ActiveCell.Row - 1 swacol = ActiveCell.Column - 1 ' make it comma and not colon swaFormula = "=OFFSET(" & _ ActiveWorkbook.Worksheets(ActiveSheet.Index).Name & "!R" & ActiveCell.Row & "C" & ActiveCell.Column & ",0,0,COUNTA(" & _ ActiveWorkbook.Worksheets(ActiveSheet.Index).Name & "!C" & ActiveCell.Column & ") -" & swarow & ",COUNTA(" & _ ActiveWorkbook.Worksheets(ActiveSheet.Index).Name & "!R" & ActiveCell.Row & ")-" & swacol & ")" ActiveWorkbook.Names.Add Name:="pivotsourceorderbase", RefersToR1C1:=swaFormula (FORMULA giving error) 

你依靠的是ActiveCell属性 。 有比参考单元更好的方法¹,但如果这些'最佳实践可以忽略一分钟,ActiveCell知道它的.Parent工作表和工作簿是什么。

另外,如果没有提供实际的工作表名称,则不能保证ActiveSheet的.Name属性不包含空格,并且可能需要用tick(例如' )来包装它。 或者应该添加这些内容,或者应该使用Range.Address属性来生成单元格范围的string。

非易失性INDEX函数可以可靠地取代易失性的OFFSET函数,但是我不太了解数据的布局以提供一个可靠的替代公式。

 Dim swaFormula As String, rngName As String Dim swaRow As Long, swaCol As Long rngName = "pivotSourceOrderBase" swaRow = 0: swaCol = 0 With ActiveCell swaFormula = "=OFFSET(" & _ .Cells(1).Address(external:=True, ReferenceStyle:=xlR1C1) & _ ", 0, 0, COUNTA(" & _ .Cells(1).EntireColumn.Address(external:=True, ReferenceStyle:=xlR1C1) & _ ")-" & swaRow & ", COUNTA(" & _ .Cells(1).EntireRow.Address(external:=True, ReferenceStyle:=xlR1C1) & _ ")-" & swaCol & ")" Debug.Print swaFormula '<~~ check the formula in the Immediate window On Error Resume Next 'may be needed for the next line .Parent.Parent.Names(rngName).Delete On Error GoTo 0 .Parent.Names.Add Name:=rngName, RefersToR1C1:=swaFormula End With 

在试图将其应用到命名范围创build之前,请通过此步骤在VBE的“ 立即”窗口中检查公式。


¹ 请参阅如何避免使用在Excel VBAmacros中select更多的方法来摆脱依靠select和激活来实现您的目标。

² 只要整个工作手册中的任何内容发生变化,挥发性函数就会重新计算,而不仅仅是当影响其结果的事情发生变化时。 易失性函数的例子是间接 , 偏移 , 今天 , 现在 , 兰德和兰德维恩 。 CELL和INFO工作表函数的一些子函数也会使它们变得不稳定。