Как мне объявить лист, а не рабочий лист, с включенным «Option Explicit»?

#excel #vba

#excel #vba

Вопрос:

Эта подпрограмма взята из книги. Это работает только тогда, когда «option explicit» не включен:

 Sub Test()
    For Each sheet In ActiveWorkbook.Sheets
        MsgBox sheet.Name
    Next sheet
End Sub
 

Как я могу заставить его работать с включенным «Option Explicit»?

Комментарии:

1. Что происходит с Option Explicit? Есть ли сообщение об ошибке? Что это? Где это происходит? Если вы читали о Option Explicit и его назначении, в чем тогда может быть проблема?

2. @QHarr Это ошибка компиляции, которая говорит «Переменная не определена». Это происходит для листа после «Для каждого». Проблема в том, что нам нужно каким-то образом объявить лист, но я не знаю, как его объявить…

3. Не используйте sheet в качестве имени переменной, используйте что-то вроде sht . А затем добавить Dim sht as Worksheet после изменения всех вхождений sheet в sht

4. @braX Да, это будет работать для моего примера, но разве нет листов, которые могут не быть рабочими листами?

5. Да, диаграммы также можно называть «листами» — их тоже лучше использовать Worksheets

Ответ №1:

Option Explicit просто заставляет вас объявлять переменные перед их использованием. В вашем примере компилятор увидит, что вы используете переменную, вызываемую sheets для вашего цикла ForEach. Без an Option Explicit компилятор неявно создаст для вас новую переменную типа Variant .

С Option Explicit помощью present вам нужно будет явно объявить свою переменную, прежде чем вы сможете использовать ее в цикле ForEach.

 Sub Test()

    Dim mySheet as Object

    For Each mySheet In ActiveWorkbook.Sheets
        MsgBox mySheet.Name
    Next

End Sub
 

Комментарии:

1. Спасибо, но когда я запускаю его, я получаю сообщение об ошибке «Пользовательский тип не определен».

2. Я вижу, что вы изменили «Затемнить mySheet как лист» на «Затемнить mySheet как рабочий лист», проблема в том, что если у нас есть диаграмма в виде листа, мы получаем ошибку.

3. Это потому, что тип Sheet не является типом vba. Если вы хотите иметь возможность выбирать оба типа листа и диаграммы, вам нужно будет объявить вариант. Я не верю, что в vba есть интерфейс, который охватывает как рабочий лист, так и диаграмму

4. Еще лучше было бы объявить его как an Object , поскольку это будет ссылочный тип