检查工作表名称以避免重复

时间:2015-07-01 19:54:51

标签: excel vba excel-vba error-handling rename

我正在处理一个宏,其中一部分从用户那里获取他/她想要重命名表单的输入。它工作正常,但如果用户提供的名称已被其他工作表使用,则会遇到运行时错误。我理解为什么会出现错误,但我不确定如何警告用户并处理错误。

我的代码如下: -

'Change sheet name

Dim sheetname As String

sheetname = InputBox(Prompt:="Enter Model Code (eg 2SV)", _
      Title:="Model Code", Default:="Model Code here")

wsCopyTo.Name = sheetname

4 个答案:

答案 0 :(得分:1)

有两种方法可以解决这个问题。

首先,捕获错误,检查是否有错误,然后建议,然后将错误捕获恢复到原来的状态

Dim sheetname As String

sheetname = InputBox(Prompt:="Enter Model Code (eg 2SV)", _
      Title:="Model Code", Default:="Model Code here")

On Error Resume next
Err.Clear 'ensure previously unhandled errors do not give a false positive on err.number
wsCopyTo.Name = sheetname
If Err.Number = ?? then 'go back and ask for another name
On Error Goto 0

其次,检查所有当前工作表名称,并查看是否存在匹配

Dim sheetname As String
Dim sh 'as Sheet

sheetname = InputBox(Prompt:="Enter Model Code (eg 2SV)", _
      Title:="Model Code", Default:="Model Code here")

for each sh in ActiveWorkbook.Sheets
     If lower(sh.name)=lower(sheetname) then
         'Goback and ask for another name
Next

wsCopyTo.Name = sheetname

答案 1 :(得分:1)

我刚刚写了一篇关于使用Excel的原生重命名工作表对话框的帖子来做这件事。这样,您就可以对重复项,非法字符和太长的名称进行错误检查。这是一个添加工作表并调用对话框的例程。如果用户没有重命名,则删除新工作表:

Sub PromptForNewSheetWithName()
Dim DefaultSheetName As String

ActiveWorkbook.Worksheets.Add
DefaultSheetName = ActiveSheet.Name
Application.Dialogs(xlDialogWorkbookName).Show
If ActiveSheet.Name = DefaultSheetName Then
    MsgBox "You didn't name the new sheet." & vbCrLf & _
           "Processing cancelled", vbExclamation
    Application.DisplayAlerts = False
    ActiveSheet.Delete
    Application.DisplayAlerts = True
End If
End Sub

整个帖子位于:http://yoursumbuddy.com/prompt-to-name-new-sheet/

答案 2 :(得分:0)

首先循环浏览您拥有的名称,并将其名称与用户提供的名称进行比较。如果匹配,请写一条消息说已经使用过。之后退出潜艇。

For i = 1 To ActiveWorkbook.Worksheets.Count
        If Worksheets(i).Name = sheetname then
             msgbox "This name is already in use!"
             exit sub
        End if
Next

答案 3 :(得分:0)

最简单的方法是创建一个Worksheet变量并将其设置为用户输入的内容(您可能希望修剪()以删除前导和尾随空格。)

如果它没有,则名称可以安全使用。如果 Not Is Nothing 那么它已经存在。

Dim oWS As Worksheet

On Error Resume Next
Set oWS = ThisWorkbook.Worksheets(sheetname)

If oWS Is Nothing Then
    ' Safe to use the name
    Debug.Print """" & sheetname & """ is save to use."
    Err.Clear
    wsCopyTo.Name = sheetname
    If Err.Number <> 0 Then
        MsgBox "Cannot use """ & sheetname & """ as worksheet name."
        Err.Clear
    End If
Else
    Debug.Print """" & sheetname & """ exists already! Cannot use."
    ' worksheet with same name already!
    ' handle it here

End If
Set oWS = Nothing
On Error GoTo 0

您也可以将其放入循环中,直到找到未使用的工作表名称。