3

我正在从 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
4

4 回答 4

5

这可能是可以接受 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 时)重新打开错误检查,以便您可以适当地处理代码中稍后可能出现的错误。

于 2013-06-20T16:39:33.557 回答
0

这应该有效。祝你好运。

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
于 2019-10-15T23:02:06.687 回答
0

我有一个类似的问题并以这种方式解决了

    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
于 2021-02-11T10:38:08.023 回答
0

这可能是一个老问题,并且有很多好的和有效的答案(在互联网上)。但是我自己偶然发现了它,没有找到直接满足我编程风格的答案。最后,我最终重新创建了一个 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
于 2018-02-23T07:33:51.547 回答