在Excel VBA中为可变错误分配值

时间:2015-01-14 18:42:09

标签: excel vba excel-vba

我是VBA的新手,从一开始我就遇到了一些问题。我想创建一个新的工作表,其名称与活动单元格中的值相同。我写了这样一个剧本:

Sub Makro1()

Dim country As String
Let country = ActiveCell.Value
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = country

End Sub

调试器点与ActiveSheet.Name = country对齐。这段代码有什么问题?

1 个答案:

答案 0 :(得分:3)

在命名工作表时,您必须牢记限制:

  • 工作表的名称不能与已存在的名称相同 工作表。

  • 工作表的名称不能超过31个字符。

  • 不允许使用某些特殊字符:包括转发/盲文斜杠,方括号,问号,星号和冒号。

工作表名称可能还有其他限制,但我会立即想到这些限制因为我过去遇到过它们。

这是一个处理工作表名称验证的代码片段:

Function validateWSName(ByVal test_name As String) As String
    'if name is blank, give a valid name to continue testing
     If test_name = "" Then test_name = "wsName"
     'if name is longer than 31 characters, then cut it off
     If Len(test_name) > 31 Then test_name = Left(test_name,31)
     'if name contains forbidden characters : \ / ? * [ or ] then eliminate them
     test_name = Replace(test_name, ":", "")
     test_name = Replace(test_name, "/", "")
     test_name = Replace(test_name, "\", "")
     test_name = Replace(test_name, "?", "")
     test_name = Replace(test_name, "*", "")
     test_name = Replace(test_name, "[", "")
     test_name = Replace(test_name, "]", "")
     'if name already exists in the worbook, then add a counter at the end
     For Each ws In ThisWorkbook.Sheets
         If ws.Name = test_name Then
             keyName = ws.Name
             counter = 1
             test_name = test_name & counter
             Do While test_name = keyName
                 If counter < 10 Then
                     test_name = Left(test_name, Len(test_name)-1) & counter 
                 Else
                     test_name = Left(test_name, Len(test_name)-2) & counter
                 End If
                 counter = counter + 1
             Loop
             Exit For
         End If
     Next ws

     validateWSName = test_name
End Function

如果您将此代码段添加到项目中并按以下方式重写代码,那么您在那里获得错误的可能性会因此而减少很多:

Sub Makro1()

Dim country As String
Let country = ActiveCell.Value
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = validateWSName(country)

End Sub