0

请参阅下面的代码。我在 Workbook 模块中有“beforesave”代码,当我在活动工作表中时它工作正常。但是,从我在表 2 上使用的表中,我在表 1 上也有一个数据透视表。要刷新我的数据透视表,我使用了一个带有附加宏的插入按钮(这是在模块部分中)

 Sub Refresh_Pivot()
 '
 ' Refresh_Pivot Macro

   ActiveSheet.PivotTables("PivotTable1").PivotCache.Refresh
   ActiveWorkbook.Save

 End Sub

在 Activate.Workbook.Save 上,它开始作用于我的其他代码(位于工作簿模块中),我希望这种情况发生,因为缺少数据的数据透视表不是一个好工具。但是,在使用它时,它默认会出现错误并突出显示 cell.Offset(0, 1).Select - 我该如何防止这种情况发生?

理想情况下,我希望用户在 msgbox 上选择 OK,然后屏幕页面变为 Sheet 2 并突出显示有问题的单元格。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Dim esave As Range
Dim psave As Range
Dim jsave As Range
Dim RAll As Range
Dim cell As Range
Set esave = Sheet2.Range("Table1[Estimated Claim (USD)]")
Set psave = Sheet2.Range("Table1[Provisional Claim (USD)]")
Set jsave = Sheet2.Range("Table1[Agreed Claim (USD)]")

Set RAll = Union(esave, psave, jsave)

    For Each cell In RAll

    If cell.Value <> "" And cell.Offset(0, 1).Value = "" Then

      Dim missdata
      missdata = MsgBox("Missing Data - Enter the Date for WorkBook to Save", vbOKOnly, "Missing Data")
      Cancel = True
      cell.Offset(0, 1).Select


    Exit For

    End If

    Next cell

 End Sub
4

1 回答 1

1

.Select应该避免。 有趣的阅​​读

我也想知道你为什么要选择那个单元格?什么目的。如果您想与它进行交互,那么您可以在不选择它的情况下进行操作。例如

If cell.Value <> "" And cell.Offset(0, 1).Value = "" Then
    Dim missdata
    missdata = MsgBox("Missing Data - Enter the Date for WorkBook to Save", vbOKOnly, "Missing Data")
    Cancel = True
    With cell.Offset(0, 1)
        '
        ''~~> Do something
        '
    End With
    Exit For
End If

话虽如此,如果您仍想选择该单元格,那么您需要在该表上。现在有两种方法。一个就像我在上面的评论中提到的那样。

在事件Sheet2.Activate之前添加或在按钮的单击事件中添加。For Each cell In RAllWorkbook_BeforeSave

Sub Refresh_Pivot()
   ActiveSheet.PivotTables("PivotTable1").PivotCache.Refresh
   Sheet2.Activate
   ActiveWorkbook.Save
End Sub

还有一点。您可能想在禁用保存Cancel = True之前通过?Exit For

于 2013-12-13T17:15:59.230 回答