在使图表可见之后使工作表可见时,Visible属性失败?

以下代码工作:

Sub ShowSheets(vSheets() As Variant) Dim i As Long 'Make worksheets visible For i = LBound(vSheets, 1) To UBound(vSheets, 1) If TypeName(ThisWorkbook.Sheets(vSheets(i, 1))) = "Worksheet" Then ThisWorkbook.Worksheets(vSheets(i, 1)).Visible = xlSheetVisible End If Next i 'Make chart sheets visible For i = LBound(vSheets, 1) To UBound(vSheets, 1) Debug.Print (TypeName(ThisWorkbook.Sheets(vSheets(i, 1)))) If TypeName(ThisWorkbook.Sheets(vSheets(i, 1))) = "Chart" Then ThisWorkbook.Charts(vSheets(i, 1)).Visible = xlSheetVisible End If Next i End Sub 

虽然下面的代码失败:

 Sub ShowSheets(vSheets() As Variant) Dim i As Long 'Make chart sheets visible For i = LBound(vSheets, 1) To UBound(vSheets, 1) Debug.Print (TypeName(ThisWorkbook.Sheets(vSheets(i, 1)))) If TypeName(ThisWorkbook.Sheets(vSheets(i, 1))) = "Chart" Then ThisWorkbook.Charts(vSheets(i, 1)).Visible = xlSheetVisible End If Next i 'Make worksheets visible For i = LBound(vSheets, 1) To UBound(vSheets, 1) If TypeName(ThisWorkbook.Sheets(vSheets(i, 1))) = "Worksheet" Then ThisWorkbook.Worksheets(vSheets(i, 1)).Visible = xlSheetVisible End If Next i End Sub 

它失败并显示错误消息:

 Run-time error '-2147417848 (80010108)' Method 'Visible' of object '_Worksheet'failed 

成功的代码和失败的代码之间唯一不同的是,在成功的代码中,我首先检查Worksheets,然后是Charts,而在失败的代码中,我颠倒了这个顺序。 它总是第一个导致失败的图表之后的工作表。

为什么第二个代码失败?

更多信息:情况在两种情况下都是相同的。 vSheets(i, 1)总是等同于图纸名称。 工作表和工作簿不受保护。

编辑:这是调用例程

 Sub ToggleSheets() 'Save sheets in tToggleSheets.DatabodyRange Dim wksTables As Worksheet Dim loSheets As ListObject Dim vSheets() As Variant Dim bAnySheetVisible As Boolean Set wksTables = GetSheetByCodename(ThisWorkbook, "wTables") Set loSheets = wksTables.ListObjects("tToggleSheets") vSheets = loSheets.DataBodyRange 'Check if all sheets are hidden bAnySheetVisible = AnySheetVisible(vSheets) If bAnySheetVisible = True Then 'If any is visible, hide all Call HideSheets(vSheets) Else 'Else unhide all Call ShowSheets(vSheets) End If End Sub 

问题不在您的发布代码中。 我的子MAIN()运行你的代码“原样”。

主要:

  1. 隐藏除第一张以外的所有图纸(包括作品和图表)
  2. 发出一个MsgBox来validation隐藏状态
  3. 调用你的例程

  Sub ShowSheets(vSheets() As Variant) Dim i As Long 'Make chart sheets visible For i = LBound(vSheets, 1) To UBound(vSheets, 1) Debug.Print (TypeName(ThisWorkbook.Sheets(vSheets(i, 1)))) If TypeName(ThisWorkbook.Sheets(vSheets(i, 1))) = "Chart" Then ThisWorkbook.Charts(vSheets(i, 1)).Visible = xlSheetVisible End If Next i 'Make worksheets visible For i = LBound(vSheets, 1) To UBound(vSheets, 1) If TypeName(ThisWorkbook.Sheets(vSheets(i, 1))) = "Worksheet" Then ThisWorkbook.Worksheets(vSheets(i, 1)).Visible = xlSheetVisible End If Next i End Sub Sub MAIN() Dim vvSheets(1 To 8, 1 To 1) As Variant Dim i As Long, msg As String msg = "" For i = 1 To Sheets.Count If i > 1 Then Sheets(i).Visible = False End If vvSheets(i, 1) = Sheets(i).Name msg = msg & vbCrLf & Sheets(i).Name Next i MsgBox msg Call ShowSheets(vvSheets) End Sub 

您的代码无误地运行。 我怀疑这个错误可能与数组在调用例程中变暗或填充有关。

我的初始configuration:

在这里输入图像描述