工作表功能麻烦

时间:2018-03-23 15:16:57

标签: excel vba

我有一个适用的版本,但这个版本选择

Public Const GlobalSheetName As String = "Sammanställning,Pris_Schrack,Pris_Pelco,Pris_Swansson,Pris_Övrig" 

Sub Tabortblad()
 Dim ws As Worksheet
 Dim ShName As String
 Dim SnNumm As Long
 char = Split(GlobalSheetName, ",")
 SnNumm = UBound(char) - LBound(char) + 1
    If Worksheets.Count = SnNumm Then    'bör ändra denna till större antal
       MsgBox "Där finns bara " & SnNumm & " blad"
    Else
       strCancel = MsgBox("Är du säker på att du vill radera bladen", vbOKCancel, "Radera Blad")
           If strCancel = "1" Then
              Application.ScreenUpdating = False
               Application.DisplayAlerts = False
                For Each ws In ActiveWorkbook.Worksheets
                   For Each char In Split(GlobalSheetName, ",")
                        If Not ws.Name = char Then
                           ws.Activate
                           Worksheets(ws.Name).Delete
                        End If
                   Next
                Next
                 Sheets("Sammanställning").Range("B:B").Value = ""
                 Sheets("Sammanställning").Range("P68:R" & Sheets("Sammanställning").Cells(Rows.Count, "R").End(xlUp).Row + 1).Value = ""
                 Application.DisplayAlerts = True
            End If
       Application.ScreenUpdating = True
       Worksheets("Sammanställning").Activate
       Range("A1").Select
     End If
End Sub

现在这是适用的版本

Sub Tabortblad()
 Dim ws As Worksheet
 Dim ShName As String
 If Worksheets.Count = "5" Then    'bör ändra denna till större antal
    MsgBox "Där finns bara 5 blad"
 Else
    strCancel = MsgBox("Är du säker på att du vill radera bladen", vbOKCancel, "Radera Blad")
    If strCancel = "1" Then
       Application.ScreenUpdating = False
        Application.DisplayAlerts = False
         For Each ws In ActiveWorkbook.Worksheets
          If Not ws.Name = "Sammanställning" Then
          If Not ws.Name = "Pris_Schrack" Then
          If Not ws.Name = "Pris_Pelco" Then
          If Not ws.Name = "Pris_Swansson" Then
          If Not ws.Name = "Pris_Övrig" Then
            ws.Activate
               Worksheets(ws.Name).Delete
          End If
          End If
          End If
          End If
          End If
         Next
          Sheets("Sammanställning").Range("B:B").Value = ""
          Sheets("Sammanställning").Range("P68:R" & Sheets("Sammanställning").Cells(Rows.Count, "R").End(xlUp).Row + 1).Value = ""
         Application.DisplayAlerts = True
     End If
   Application.ScreenUpdating = True
   Worksheets("Sammanställning").Activate
   Range("A1").Select
  End If
End Sub

问题是ws.Name它在第一个版本中返回错误,在第二个版本中它运行正常。

我用它来删除我在另一个sub中添加的正确工作表。 我使用常量来收集工作表名称,所以如果我必须添加一个更容易。

3 个答案:

答案 0 :(得分:1)

我确认第一个子程序有效,然后确认我无法获得第二个“不工作”的子程序。然后,通过添加以下内容,我能够完全运行第二个子例程:

option Explicit
Dim strCancel As String, char As Variant

首先,您应该始终在模块顶部包含“option explicit”,因为它会强制您正确定义变量。这是问题的根源,因为char变量未定义,并且您的代码的某些行需要一个数组,所以它在那时失败了。至少,在我将char更改为Variant之前,这就是我发生的事情。您可能不想使用char的变体,我建议使用此变量研究代码行。

我无法进一步帮助,因为我不完全清楚代码的目标是什么,而且我不理解所使用的非英语单词。如果您有更多问题,请与我们联系。

答案 1 :(得分:0)

将工作表作为向后计数运行。

dim w as long
For w=ActiveWorkbook.Worksheets.count to 1 step-1
  If iserror(application.match(Worksheets(w).Name, array("Sammanställning", "Pris_Schrack", "Pris_Pelco", "Pris_Swansson", "Pris_Övrig"), 0)) Then
       Worksheets(w).Delete
  End If
Next w

小心VBE不会将äÖ等字母转换为?。 VBE不处理unicode。

答案 2 :(得分:0)

you could consider deleting in one shot:

Dim ws As Worksheet
Dim names As String
For Each ws In ActiveWorkbook.Worksheets
    If InStr(GlobalSheetName, ws.Name) = 0 Then names = names & ws.Name & "|"
Next
If names <> "" Then Worksheets(Split(Left(names, Len(names) - 1), "|")).Delete