excel 如何避免错误的vba代码最后一个活动的工作表时,它的删除?

tpxzln5u  于 2023-06-30  发布在  其他
关注(0)|答案(2)|浏览(132)

我遇到了一个问题,当删除我的Excel文件中的工作表,有下面的代码。
为了跳到先前选择的工作表,我在ThisWorkbook中有以下基本的vba代码。

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    Set LstSht = Sh
End Sub

下面的代码被添加到一个模块中,并链接到一个按钮以返回到上一个工作表。

Public LstSht As Worksheet
Sub GoToLast()
    LstSht.Activate
End Sub

我注意到,当我在Excel中使用底部的“+”按钮创建一个新工作表时,在已经存在的工作表旁边没有问题。然而,当我按下windows按钮+ F11创建一个新的图表工作表,并删除这一个,我收到一个运行时错误'13':类型不匹配。
如何解决这个问题?
谢谢你的帮助!
亲切问候Jan

qhhrdooz

qhhrdooz1#

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    If Sh Is LstSht Then
        If ThisWorkbook.Sheets.Count > 1 Then
            Set LstSht = ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
        Else
            Set LstSht = Nothing
        End If
    End If
End Sub

在此代码中,我们首先确定停用的表(Sh)和LstSht是否相同。如果它们是相同的,我们检查工作簿中是否还有其他工作表。如果是,我们使用ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)将LstSht设置为最后一个工作表。否则,如果只剩下一个工作表或根本没有工作表,则将LstSht设置为Nothing。

jgwigjjp

jgwigjjp2#

您的代码表明您希望具有对上一个活动工作表的引用。但是如果删除了this,这个引用必须变成Nothing,这样在代码的其他部分它就会被检查而不会被使用。这可以与另一个事件一起完成:
复制模块中的下一个代码(供常用)

Option Explicit

Public justDeactivatedSheet As Worksheet 'the variable you name LstSht
Public justDeletedSheet As Worksheet

复制ThisWorkBook模块中的下一段代码:

Option Explicit

'ON SHEET DELETION THIS IS EXECUTING FIRST
Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)
   Set justDeletedSheet = Sh
   MsgBox ("Workbook_SheetBeforeDelete " & Sh.Name)
End Sub

'ON SHEET DELETION THIS IS EXECUTING AFTER Workbook_SheetBeforeDelete
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
   If Not justDeletedSheet Is Nothing Then
      If justDeletedSheet Is Sh Then
         MsgBox ("deactivate the deleted >" & vbCrLf & _
                 "Set justDeactivatedSheet = Nothing" & vbCrLf & _
                 "Set justDeletedSheet = Nothing")
         Set justDeactivatedSheet = Nothing
         Set justDeletedSheet = Nothing
      Else
         Set justDeactivatedSheet = Sh
      End If
   Else
      Set justDeactivatedSheet = Sh
   End If
End Sub

并复制一个使用justDeactivatedSheet的示例,
在表单模块中。在我的例子中,我使用了一个按钮的click事件

Option Explicit

Private Sub CommandButton1_Click()
'in your code have to check, eg
   If Not justDeactivatedSheet Is Nothing Then
      If Not ActiveSheet Is justDeactivatedSheet Then
         MsgBox ("the previus active sheet was the " _
                  & justDeactivatedSheet.Name)
      End If
   Else
      MsgBox ("The justDeactivatedSheet is NOTHING ")
   End If
End Sub

相关问题