如何使宏不是特定于工作表

时间:2015-04-07 20:25:32

标签: excel vba excel-vba

如果可能的话,无论表单的名称是什么,我都希望下面的宏以相同的方式运行。例如,在这个文件中它是2015年3月和#34;的ZPPV决赛。但那个三月,可能会改为4月或5月等。无论该工作表标签上的月份是什么,我都能运行此宏吗?请参阅以下内容:

Sub PPV()
'
' PPV Macro
'

'
    Sheets("ZPPV Final for March 2015").Select
    Range("Z3").Select
    ActiveCell.FormulaR1C1 = "Week"
    Range("Z4").Select
    ActiveCell.FormulaR1C1 = "=WEEKNUM(RC[-9])"
    Range("Z4").Select
    Selection.AutoFill Destination:=Range("Z4:Z8858")
    Range("Z4:Z8858").Select
    Range("Z3").Select
    Range(Selection, Selection.End(xlToLeft)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Sheets.Add
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "***ZPPV Final for March 2015***!R3C2:R8858C26", Version:=xlPivotTableVersion14). _
        CreatePivotTable TableDestination:="Sheet2!R3C1", TableName:="PivotTable9" _
        , DefaultVersion:=xlPivotTableVersion14
    Sheets("Sheet2").Select
    Cells(3, 1).Select
    With ActiveSheet.PivotTables("PivotTable9").PivotFields("Plant")
        .Orientation = xlPageField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("PivotTable9").PivotFields("Week")
        .Orientation = xlRowField
        .Position = 1
    End With
    ActiveSheet.PivotTables("PivotTable9").AddDataField ActiveSheet.PivotTables( _
        "PivotTable9").PivotFields("           PPV"), "Sum of            PPV", xlSum
    ActiveSheet.PivotTables("PivotTable9").PivotFields("Plant").ClearAllFilters
    ActiveSheet.PivotTables("PivotTable9").PivotFields("Plant").CurrentPage = _
        "1027"
    Sheets("**ZPPV Final for March 2015").**Select
    ActiveWorkbook.Worksheets("Sheet2").PivotTables("PivotTable9").PivotCache. _
        CreatePivotTable TableDestination:="Sheet2!R1C6", TableName:="PivotTable10" _
        , DefaultVersion:=xlPivotTableVersion14
    Sheets("Sheet2").Select
    Cells(1, 6).Select
    With ActiveSheet.PivotTables("PivotTable10").PivotFields("Plant")
        .Orientation = xlPageField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("PivotTable10").PivotFields("Week")
        .Orientation = xlRowField
        .Position = 1
    End With
    ActiveSheet.PivotTables("PivotTable10").AddDataField ActiveSheet.PivotTables( _
        "PivotTable10").PivotFields("           PPV"), "Sum of            PPV", xlSum
    With ActiveSheet.PivotTables("PivotTable10").PivotFields("Vendor Name")
        .Orientation = xlRowField
        .Position = 1
    End With
    Range("F4").Select
    ActiveSheet.PivotTables("PivotTable10").PivotFields("Vendor Name").ShowDetail _
        = False
    ActiveSheet.PivotTables("PivotTable10").PivotFields("Plant").ClearAllFilters
    ActiveSheet.PivotTables("PivotTable10").PivotFields("Plant").CurrentPage = _
        "1027"
    Sheets("ZPPV Final for March 2015").Select
    ActiveWorkbook.Worksheets("Sheet2").PivotTables("PivotTable10").PivotCache. _
        CreatePivotTable TableDestination:="Sheet2!R1C10", TableName:= _
        "PivotTable11", DefaultVersion:=xlPivotTableVersion14
    Sheets("Sheet2").Select
    Cells(1, 10).Select
    With ActiveSheet.PivotTables("PivotTable11").PivotFields("Plant")
        .Orientation = xlPageField
        .Position = 1
    End With
    ActiveSheet.PivotTables("PivotTable11").AddDataField ActiveSheet.PivotTables( _
        "PivotTable11").PivotFields("           PPV"), "Sum of            PPV", xlSum
    With ActiveSheet.PivotTables("PivotTable11").PivotFields("Material No.")
        .Orientation = xlRowField
        .Position = 1
    End With
    ActiveSheet.PivotTables("PivotTable11").PivotFields("Plant").ClearAllFilters
    ActiveSheet.PivotTables("PivotTable11").PivotFields("Plant").CurrentPage = _
        "1027"
    Range("A3").Select
    ActiveSheet.PivotTables("PivotTable9").CompactLayoutRowHeader = "Week"
    Range("F3").Select
    ActiveSheet.PivotTables("PivotTable10").CompactLayoutRowHeader = "Vendor"
    Range("J3").Select
    ActiveSheet.PivotTables("PivotTable11").CompactLayoutRowHeader = _
        "Material Number"
    Range("A2").Select
    ActiveCell.FormulaR1C1 = "PPV By Week"
    Range("F2").Select
    ActiveCell.FormulaR1C1 = "PPV By Vendor"
    Range("J2").Select
    ActiveCell.FormulaR1C1 = "PPV By Material #"
    Range("J2").Select
    Selection.Font.Bold = True
    Range("F2").Select
    Selection.Font.Bold = True
    Range("A2").Select
    Selection.Font.Bold = True
    Range("D3").Select
End Sub

2 个答案:

答案 0 :(得分:1)

这是一个简单的例子

Dim sh as worksheet
Dim ws as worksheet
set ws=sheets("Sheet2")
set sh=activesheet
sh.Range("Z3") = "Week"

with ws
'do something
end with

答案 1 :(得分:1)

  1. 如果工作簿中只有一个工作表,请使用索引。

    Dim ws As Worksheet ' Declare a worksheet type variable
    Set ws = Thisworksbook.Sheets(1) ' assign the worksheet object
    
  2. 如果有其他工作表,但始终使用相同的工作表(意味着,工作表名称仅针对新月编辑),请使用工作表codename

    Dim ws As Worksheet ' Declare a worksheet type variable
    Set ws = Sheet1 ' use Codename to assign worksheet object to variable
    
  3. enter image description here

    您只能在属性窗口中编辑Codename,如上所示 用户可以更改工作表名称,但不能更改Codename

    1. 如果每月创建一个新工作表,请使用循环。

      Dim ws As Worksheet, i As Integer
      Dim MoYr As String
      
      MoYr = Format(Date, "mmmm yyyy") ' Returns April 2015 if run now
      With ThisWorkbook
          For i = 1 To .Sheets.Count
              If InStr(.Sheets(i).Name, MoYr) <> 0 Then
                  Set ws = .Sheets(i): Exit For
              End If
          Next
      End With
      If ws Is Nothing Then Exit Sub ' Just in case nothing is found