Excel 工作表功能故障

Excel 工作表功能故障,excel,vba,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, ",") SnNum

我有一个版本可以用,但这个版本不行

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
它在第一个版本中返回错误,在第二个版本中工作正常

我用它来删除我在另一个子系统中添加的正确工作表。
我正在使用常量来收集工作表名称,因此如果我必须添加一个,它会更容易。

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

option Explicit
Dim strCancel As String, char As Variant
首先,您应该始终在模块的顶部包含“option explicit”,因为它迫使您正确定义变量。这是问题的根源,因为没有定义
char
变量,并且代码的某些行需要一个数组,因此在该点上失败。至少,在我将
char
更改为变体之前,我就是这样做的。您可能不想为
char
使用变量,我建议您使用此变量研究代码行


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

将工作表倒计时

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。

< P>可以考虑一次删除:

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
Dim ws As工作表
将名称变暗为字符串
对于ActiveWorkbook.Worksheets中的每个ws
如果InStr(GlobalSheetName,ws.Name)=0,那么Name=Name&ws.Name&“|”
下一个
如果名称为“”,则工作表(拆分(左(名称,左(名称)-1),“|”)。删除

我从这个开始,并将它用于我在这个项目中的其他子项目。我尝试了这个,VBE在unicode部分被搞糊涂了,正如你所说的。