#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
, поскольку это будет ссылочный тип