【问题标题】:If sheet doesn't exist, create it (VBA Excel)如果工作表不存在,请创建它(VBA Excel)
【发布时间】:2013-06-17 15:01:43
【问题描述】:

我正在从 Microsoft Access 导入数据,错误检测似乎不起作用。如果代码尝试创建一个已经存在的工作表,请继续并将目标工作表设置为已经存在的工作表。任何提示将不胜感激。

For ix = stWW To edWW
    For modi = 0 To mdcnt - 1

  On Error Resume Next
    Sheets.Add(After:=Sheets(Sheets.Count)).Name = ix & " " & modvar(modi)
  On Error GoTo 0

    Set DestinationSheet = Worksheets(ix & " " & modvar(modi))


     'strSQL2 = "SELECT 1302_Scan.* FROM 1302_Scan;"
     strSQL = "SELECT " & ix & "_" & modvar(modi) & ".* FROM " & ix & "_" & modvar(modi) & ";"

    'MsgBox strSQL & "|" & strSQL

    DestinationSheet.Cells.Clear

之前在代码中使用过,可能会导致@sous2817 的建议出错。

On Error GoTo continue
Do While Not IsNull(modvar(ii))
    mdcnt = mdcnt + 1
    ii = ii + 1

Loop
continue:
On Error GoTo 0

【问题讨论】:

    标签: vba excel error-handling exists


    【解决方案1】:

    这可能是可以接受 On Error Resume Next 的受控使用的时候。可能是这样的:

    On Error Resume Next
    Sheets.Add(After:=Sheets(Sheets.Count)).Name = ix & " " & modvar(modi)
    On Error GoTo 0
    

    这假设 ix & " " & modvar(modi) 解析为正确的名称。

    我的回答有点背景:

    本质上,您并不真正关心工作表是否存在,您只关心它是否存在。创建具有特定工作表名称的工作表将产生错误并且不会创建新工作表(因为错误)。因此,将创建包装在“on error resume next”中将在工作表不存在时创建工作表,如果已存在则跳过错误。下一行(在错误转到 0 时)重新打开错误检查,以便您可以适当地处理代码中稍后可能出现的错误。

    【讨论】:

    • 非常感谢,我的问题差不多解决了。我遇到的最后一个问题是如果工作表已经存在,它会说“无法将工作表重命名为与另一个工作表、引用的对象库或由 Visual Basic 引用的工作簿相同的名称。我确实使用了错误转到(添加了一个编辑到上面的代码),但我把错误转到后面所以我认为它不会引起问题?
    • @user2457541 逻辑应该是一样的吧?将工作表重命名为某个名称,如果该工作表名称已经存在,请跳过该部分并继续。这是一个正确的假设吗?如果是这样,只需在重命名代码的行的正上方添加另一个 on error resume,并在该行之后的 error goto 0 上添加另一个。如果这不正确,你将不得不编辑你的帖子,我会再试一次。
    • 我已经编辑了我的问题。您所说的完全有道理,我尝试使用 iserror(ws.n​​ame) 基本上做类似的事情。但是代码正在执行,就好像 on error resume next 不存在一样。
    • @user2457541 我不认为 iserror(ws.n​​ame) 与我的建议相同。您可以编辑您的帖子以包含您正在重命名工作表的行吗?我在您上面发布的内容中看不到这一点。
    • Sheets.Add(After:=Sheets(Sheets.Count)).Name = ix & " " & modvar(modi) 是它说我正在重命名的那一行。在工作簿中,它创建一个工作表*,然后尝试将其命名为 ix & " " & modvar(modi)。
    【解决方案2】:

    这可能是一个老问题,并且有很多好的和有效的答案(互联网上到处都是)。 但是我自己偶然发现了它,没有找到直接满足我编程风格的答案。 最后,我最终重新创建了一个 try...catch...finally 结构,我认为它看起来很干净。 因此,对于偶然发现此问题并寻找通用且易于采用的解决方案的人:

        Dim sheetToCreate As Worksheet
        Dim sheetToCreateName As String: sheetToCreateName = "Name"
    
        On Error GoTo Catch
    Try:
        Set sheetToCreate = wb.Worksheets(sheetToCreateName)
        GoTo Finally
    Catch:
        Set sheetToCreate = wb.Worksheets.Add
        sheetToCreate.Name = sheetToCreateName 
    Finally:
        On Error GoTo 0
    

    【讨论】:

      【解决方案3】:

      这应该可行。祝你好运。

      Function Add_Sheet(sheet_name As String)
          Dim i, sheet_exists As Integer
          sheet_exists = 0
          For i = 1 To Sheets.Count
             If Sheets(i).Visible = -1 Then
                 If Sheets(i).Name = sheet_name Then
                      sheet_exists = 1
                 End If
             End If
          Next
          If sheet_exists = 0 Then
              Sheets.Add(After:=Sheets(Sheets.Count)).Name = sheet_name
          End If
      End Function
      

      【讨论】:

        【解决方案4】:

        我遇到了类似的问题,就这样解决了

            On Error GoTo Catch 
        Try:
            Sheets("name_of_tab").Select 'Try to focus on the tab
            GoTo Finally
        Catch:
            Sheets.Add(After:=Sheets(Sheets.Count)).Name = "name_of_tab" 'If it fails create it
        Finally:
            On Error GoTo 0
        

        【讨论】:

          猜你喜欢
          • 2019-02-11
          • 2019-01-09
          • 2019-07-16
          • 2017-06-26
          • 2013-12-07
          • 1970-01-01
          • 2018-02-26
          • 2016-08-20
          • 1970-01-01
          相关资源
          最近更新 更多