2013-06-20 3 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 

это предполагает, что & IX "" & modvar (модусы) решает имя собственное.

Немного контекста на мой ответ:

По сути, вы на самом деле не волнует, если лист существует или нет, вы просто все равно, что она существует. Создание листа с определенным именем листа приведет к возникновению ошибки и не создаст новый лист (из-за ошибки). Таким образом, обертка создания в «on error resume next» создаст лист, если он не существует, и пропустите ошибку, если она уже существует. Следующая строка (при ошибке goto 0) включает проверку ошибок, чтобы вы могли надлежащим образом обрабатывать ошибки, которые могут возникнуть позже в вашем коде.

+0

Спасибо большое, моя проблема практически решить. Последний вопрос, который у меня есть, заключается в том, что если лист уже существует, он говорит: «Нельзя переименовать листок с тем же именем, что и другой лист, ссылочную библиотеку объектов или книгу, на которую ссылается визуальный базовый. Я использовал ошибку goto (добавлено изменение в код выше), но после этого я поместил ошибку goto, поэтому я думал, что это не вызовет проблемы? – user2457541

+0

@ user2457541 Логика, вероятно, такая же право? Переименуйте лист на что-то, и если это имя листа уже существует, пропустите эту часть и Если это так, просто добавьте еще одно сообщение об ошибке рядом прямо над строкой, которая переименует ваш код и по ошибке goto 0 сразу после строки. Если это не так, вам придется отредактировать сообщение и я сделаю еще один удар. – sous2817

+0

Я отредактировал свой вопрос. То, что вы говорите, имеет смысл, я пытался сделать аналогичную вещь в основном с помощью iserror (ws.name). Но код выполняется так, как будто on error resume next is not there. – user2457541

0

Это может быть старый вопрос, и есть много хорошего и рабочего ответа на него (все вокруг Интернета). Но я просто наткнулся на него сам, и никакого ответа, который я нашел, прямо не удовлетворило мой стиль программирования. В конце концов я закончил пересоздать попытку ... поймать ... наконец-то структуру, и я думаю, что она выглядит очень чистой. Так что для людей, наткнуться на эту проблему, и поиск 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