2013-06-20 15 views
2

我从Microsoft Access导入数据,错误检测似乎没有工作。如果代码尝试创建已存在的工作表,请继续并将目标工作表设置为已存在的工作表。任何提示将不胜感激。如果表不存在,创建它(VBA Excel)

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

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

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

这个假设九& “” & modvar(MODI)解析到一个合适的名字。

背景下我的回答的一点:

在核心,你真的不关心,如果纸张存在与否,你只关心它的存在。创建具有特定工作表名称的工作表将生成一个错误,并且不会创建新工作表(由于错误)。因此,在“接下来的错误继续”中包装创建将创建工作表(如果它不存在),并在错误已存在的情况下跳过该错误。下一行(错误转到0)重新打开错误检查,以便您可以适当地处理稍后在代码中可能出现的错误。

+0

非常感谢,我的问题几乎解决。我遇到的最后一个问题是,如果工作表已经存在,它会说“不能将工作表重命名为与另一个工作表相同的名称,引用的对象库或Visual Basic引用的工作簿。我确实使用了错误goto(添加了编辑以上代码),但是我把错误转到了后面,所以我认为它不会导致问题? – user2457541

+0

@ user2457541逻辑可能是同样的权利?将表格重命名为某些内容,如果表格名称已经存在,则跳过该部分并这是一个正确的假设吗?如果是这样,只需在重命名代码的那一行上面的错误恢复中添加另一个错误,并在错误转到行后错误地跳到0处。如果这不正确,则必须编辑您的文章并且我会再试一次它 – sous2817

+0

我编辑了我的问题,你说的是完全有道理的,我尝试着用一个iserror(ws.name)做类似的事情,但是代码正在执行,下一个错误恢复不存在。 – user2457541

0

这可能是一个古老的问题,有很多好的和工作的答案(都在互联网上)。 但我只是偶然发现了它,没有找到直接满足我的编程风格的答案。 最后我最终重新创建了一个try ... catch ... finally结构,我认为它看起来很干净。 所以人们绊脚石后这个问题,并寻找一个generalzied和易于采用的解决方案:

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