Вопрос:

Если Лист существует, запустите sub. Если нет, отобразить сообщение и выйти из суб

excel vba excel-vba boolean

946 просмотра

4 ответа

8 Репутация автора

Я застрял, несмотря на поиск этой темы в других темах. Я хотел бы помочь со следующим:

Если макрос может найти лист с именем «Transfers», я бы хотел, чтобы он активировал этот лист и запустил оставшуюся часть подпрограммы, что делает «Transfers» последним листом.

Если он не может найти лист с именем «Переводы», я бы хотел, чтобы он отправил сообщение (Пожалуйста, убедитесь, что вы переименовали свой лист данных: «Переводы») и выйдите из подпункта. Мой код ниже не работает.

Sub Double_Transfer_Report()
Dim er As Boolean
er = False

On Error Resume Next
'Worksheets("Transfers").Activate
er = true

If er Then
MsgBox ("Please make sure that you renamed your data sheet : Transfers)
Exit Sub
End If

ActiveSheet.Move _
After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
Автор: Mark O'Donnell Источник Размещён: 08.11.2017 10:41

Ответы (4)


2 плюса

2192 Репутация автора

Решение

Ваша идея состоит в том, чтобы попытаться активировать рабочий лист, и если это не удается, обратите внимание, что произошла ошибка.

Вы можете изменить свой код, как показано ниже. Модификация относится к тому, как ваша erпеременная получает свое значение. После Activateсбоя метода Errобъект будет содержать номер ошибки (и другие подробности), пока не произойдет другая ошибка или не On Errorбудет обнаружен другой оператор (среди прочего). Установка erлогического теста для логического теста Err.Number <> 0обнаружит, что произошла ошибка.

Sub Double_Transfer_Report()
    Dim er As Boolean

    er = False
    On Error Resume Next
    Worksheets("Transfers").Activate
    er = (Err.Number <> 0)
    On Error GoTo 0

    If er Then
        MsgBox "Please make sure that you renamed your data sheet : Transfers)"
    Else
        ActiveSheet.Move After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
    End If
End Sub
Автор: Excelosaurus Размещён: 08.11.2017 10:45

4 плюса

9106 Репутация автора

Не делайте гимнастику с ошибкой объекта. Просто проверьте, существует ли лист или нет через цикл.


Sub Double_Transfer_Report()
    Dim found As Boolean

    found = SheetExists("Transfers")

    If Not found Then
        MsgBox "Please make sure that you renamed your data sheet : Transfers"
    Else
        ActiveSheet.Move After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
    End If
End Sub

Function SheetExists(strSheetName As String) As Boolean

    Dim wks As Worksheet

    For Each wks In ThisWorkbook.Worksheets

        If wks.Name = strSheetName Then
            SheetExists = True
            Exit Function
        End If
    Next

    SheetExists = False

End Function
Автор: cyboashu Размещён: 08.11.2017 10:50

0 плюса

78625 Репутация автора

Если вы можете сэкономить две ячейки где-нибудь, вы можете избежать как зацикливания, так и обработки ошибок, скажем, мы используем B1 и B2 . В B1 поместите название предложенного листа и заполните B2, используя:

Range("B2").Value = "=ISNUMBER(ROWS(INDIRECT(""'""&B1&""'!A1"")))"

Затем проверьте логический результат в B2 :

введите описание изображения здесь

Автор: Gary's Student Размещён: 08.11.2017 11:28

0 плюса

330 Репутация автора

Просто другой подход, не говоря о том, что он лучше, чем у Cyboashu (или другого ответа).

Создайте именованный диапазон с помощью Xl4Macro, например, SheetExistsи поместите его в Refersto: =SUBSTITUTE(GET.WORKBOOK(1),"[" &GET.WORKBOOK(16)&"]","")

Теперь на любой лист вы можете добавить эту (массив) формулу, и она вернет фактический индекс листа, если он доступен.

{=MATCH("Sheet1091",TRANSPOSE(SheetExists),0)}

Просто еще один способ сделать вещи. :)

Автор: teddy2 Размещён: 08.11.2017 11:56
32x32