Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel宏加载项重复电子表格弹出窗口_Excel_Vba_Excel Addins - Fatal编程技术网

Excel宏加载项重复电子表格弹出窗口

Excel宏加载项重复电子表格弹出窗口,excel,vba,excel-addins,Excel,Vba,Excel Addins,“我的宏”从集合数据转储从头开始创建透视表。我正在尝试将此宏移动到外接程序。外接程序每次都处理新数据,但出于某种原因,它会弹出我的代码最初处理的第二个工作簿 我已经浏览了外接程序网站,以确保正确设置了外接程序。我的其他外接宏作品(只有2个,仍在学习) 你知道我做错了什么吗?我真的认为你的问题在于你使用的工作簿或工作表的引用不一致(或缺少引用)。具体来说,我认为问题在于线路 Set sht = Sheets.Add 由于您的工作表引用未指定要添加新工作表的工作簿,因此它将默认为当前活动的工作簿,

“我的宏”从集合数据转储从头开始创建透视表。我正在尝试将此宏移动到外接程序。外接程序每次都处理新数据,但出于某种原因,它会弹出我的代码最初处理的第二个工作簿

我已经浏览了外接程序网站,以确保正确设置了外接程序。我的其他外接宏作品(只有2个,仍在学习)


你知道我做错了什么吗?

我真的认为你的问题在于你使用的工作簿或工作表的引用不一致(或缺少引用)。具体来说,我认为问题在于线路

Set sht = Sheets.Add
由于您的
工作表
引用未指定要添加新工作表的工作簿,因此它将默认为当前活动的工作簿,该工作簿可能是您的加载项工作簿。如果你能更清楚地知道你想要哪些工作簿和工作表,你会帮上大忙的。为了用您的示例说明这一点,您可以从

Sub OpenAndHoldPivot()
    Dim workingWB As Workbook
    Dim workingWS As Worksheet
    Set workingWB = ActiveWorkbook
    Set workingWS = activeworksheet

    'Determine the data range you want to pivot
    Dim srcData As Range
    Dim srcDataText As String
    With workingWS
        Dim finRow As Long
        finRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        Set srcData = .Range("A4").Resize(finRow - 1, 67)
        srcDataText = .Name & "!" & srcData.Address(ReferenceStyle:=xlR1C1)
    End With
这清楚地确定了所有代码将操作的工作簿。另外,如果您查看my
With
块并将其与您的块进行比较,您会发现您在
范围
引用之前遗漏了一个
,这很可能再次引用您的外接程序或活动工作簿(您永远也不能太确定)

在那之后,我继续写代码

    'Create a new worksheet in the working workbook
    Dim pivotWS As Worksheet
    Set pivotWS = workingWB.Sheets.Add

    'Pivot Table Start
    Dim StartPvtText As String
    StartPvtText = pivotWS.Name & "!" & pivotWS.Range("A3").Address(ReferenceStyle:=xlR1C1)

    'Create Pivot Cache from Source Data
    Dim pvtCache As PivotCache
    Set pvtCache = ActiveWorkbook.PivotCaches.Create( _
                   SourceType:=xlDatabase, _
                   SourceData:=srcDataText)

    'Create Pivot table from Pivot Cache
    Dim pvt As PivotTable
    Set pvt = pvtCache.CreatePivotTable( _
              TableDestination:=StartPvtText, _
              TableName:="PivotTable1")
还请注意,我声明的所有变量都尽可能接近它们的使用位置。这使您更容易理解,并确保您使用的变量类型正确

进一步往下看你的代码,你已经参考了
ActiveSheet
好几次了。为了保持一致,用一个特定的引用替换它。在我的代码中,我很少使用
ActiveSheet
ActiveCell
。我试图在完整的模块中修复下面的引用,但只有你才能知道这是否准确(因为你想要哪本书或哪张纸并不十分清楚)

最后,还有最后一行代码
工作表(“Sheet1”).Name=“Data”
。我不知道应该引用哪个工作簿,但我猜应该是
工作wb.Sheets(“Sheet1”).Name=“Data”


出于某种原因,它会弹出我的代码最初处理的第二个工作簿-不清楚这到底是什么意思。您是否尝试过单步执行代码(F9在宏顶部附近设置断点,然后F8在中断模式下逐行运行一次),并查看第二个工作簿“弹出”的确切位置?当我运行外接程序时,会打开第二个Excel页面。该页面上有特定日期的旧数据。它仍然会对新信息运行宏。我尝试使用F8。在运行代码时,第二个工作簿没有打开。感谢您的指示,并且不再弹出额外的工作簿。感谢您帮助清理我的工作表密码
    'Create a new worksheet in the working workbook
    Dim pivotWS As Worksheet
    Set pivotWS = workingWB.Sheets.Add

    'Pivot Table Start
    Dim StartPvtText As String
    StartPvtText = pivotWS.Name & "!" & pivotWS.Range("A3").Address(ReferenceStyle:=xlR1C1)

    'Create Pivot Cache from Source Data
    Dim pvtCache As PivotCache
    Set pvtCache = ActiveWorkbook.PivotCaches.Create( _
                   SourceType:=xlDatabase, _
                   SourceData:=srcDataText)

    'Create Pivot table from Pivot Cache
    Dim pvt As PivotTable
    Set pvt = pvtCache.CreatePivotTable( _
              TableDestination:=StartPvtText, _
              TableName:="PivotTable1")
Option Explicit

Sub OpenAndHoldPivot()
    Dim workingWB As Workbook
    Dim workingWS As Worksheet
    Set workingWB = ActiveWorkbook
    Set workingWS = activeworksheet

    'Determine the data range you want to pivot
    Dim srcData As Range
    Dim srcDataText As String
    With workingWS
        Dim finRow As Long
        finRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        Set srcData = .Range("A4").Resize(finRow - 1, 67)
        srcDataText = .Name & "!" & srcData.Address(ReferenceStyle:=xlR1C1)
    End With

    'Create a new worksheet in the working workbook
    Dim pivotWS As Worksheet
    Set pivotWS = workingWB.Sheets.Add

    'Pivot Table Start
    Dim StartPvtText As String
    StartPvtText = pivotWS.Name & "!" & pivotWS.Range("A3").Address(ReferenceStyle:=xlR1C1)

    'Create Pivot Cache from Source Data
    Dim pvtCache As PivotCache
    Set pvtCache = ActiveWorkbook.PivotCaches.Create( _
                   SourceType:=xlDatabase, _
                   SourceData:=srcDataText)

    'Create Pivot table from Pivot Cache
    Dim pvt As PivotTable
    Set pvt = pvtCache.CreatePivotTable( _
              TableDestination:=StartPvtText, _
              TableName:="PivotTable1")

    '------------------------------------------------------------------------------
    Set pvt = pivotWS.PivotTables("PivotTable1")

    'Add item to the Report Filter
    pvt.PivotFields("Future Fill Date").Orientation = xlPageField

    'Add item to the Column Labels
    pvt.PivotFields("Worker Type").Orientation = xlColumnField

    'Add item to the Row Labels
    pvt.PivotFields("Flex Division").Orientation = xlRowField

    'Turn on Automatic updates/calculations --like screenupdating to speed up code
    pvt.ManualUpdate = False

    '------------------------------------------------------------------------------
    pivotWS.Name = "Pivot"

    '------------------------------------------------------------------------------
    Dim pf As String
    Dim pf_Name As String
    pf = "FT/PT"
    pf_Name = "Sum of FT/PT"
    Set pvt = pivotWS.PivotTables("PivotTable1")
    pvt.AddDataField pvt.PivotFields("FT/PT"), pf_Name, xlCount

    '------------------------------------------------------------------------------
    Dim pm As PivotField
    Set pm = pivotWS.PivotTables("PivotTable1").PivotFields("Future Fill Date")

    'Clear Out Any Previous Filtering
    pm.ClearAllFilters

    'Filter on 2014 items
    pm.CurrentPage = "(blank)"

    '------------------------------------------------------------------------------
    workingWB.Sheets("Sheet1").Name = "Data"
End Sub