Выполнение кнопки из пользовательской формы, выбрасывающей подпись из диапазона Ошибка - PullRequest
0 голосов
/ 21 декабря 2018

Кнопка для кода ранее присутствовала в Листе Excel, протестирована и успешно выполнена. Теперь я переместил эту кнопку в пользовательскую форму, при выполнении я получаю сообщение об ошибке «индекс вне диапазона». При использовании пошаговой отладки возникает ошибкав строке 1 Рабочие листы («Лист1»). Столбцы (5) .ClearContents. Я не могу выяснить причину.

Private Sub OUTCLR_Click()
Worksheets("Sheet1").Columns(5).ClearContents
Worksheets("Sheet1").Columns(2).ClearContents
Sheet1.Cells(1, 5).Value = "RESULT"
Sheet1.Cells(1, 2).Value = "PROCESSED UNIQUE STRINGS"
End Sub

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Когда кнопка находилась в выделенном коде рабочего листа, ActiveWorkbook гарантированно равнялся ThisWorkbook.

Теперь, когда она находится в пользовательской форме, ActiveWorkbook - это то, какая рабочая книга оказывается активнойкогда форма отображается, и она может даже изменить , тогда как форма отображается в зависимости от того, какой код там находится.

Неквалифицированные Worksheets вызовы неявно ссылаются на ActiveWorkbook:как будто они неявно делают это:

ActiveWorkbook.Worksheets("Sheet1")...

Может сработать, но если активная рабочая книга не соответствует ожидаемой, или , если кто-то зашел и изменил вкладку /имя листа от Sheet1 до Summary 2018-12-21, затем оно разбивается: «индекс вне диапазона» означает, что к какой бы книге ни обращались, в ней нет листа с именем «Sheet1».

Это с другой стороны...

Sheet1.Cells(....)

Используется кодовое имя листа , которое не зависит от изменяемого пользователем имени вкладки.Единственный способ изменить это - вызвать редактор VBA, найти лист в Project Explorer (Ctrl + R) и изменить его свойство (Name) в окне инструментов Свойства (F4).

Есливсе 4 инструкции означают отработку одного и того же листа, и этот лист существует во время компиляции в ThisWorkbook (то есть в файле с кодом VBA), заставьте их все работать от Sheet1 - не извлекайте этот объект из ThisWorkbook.Worksheets, даже меньше от ActiveWorkbook.Worksheets.

0 голосов
/ 21 декабря 2018

Здесь есть 2 проблемы.

  1. Неявная коллекция Worksheets привязана к любой активной книге, когда код выполняется, и может очень хорошо не будьте ожидаемой книгой.Другая рабочая книга не обязательно должна содержать рабочую таблицу, имя которой, как видно из Excel на вкладке рабочей таблицы, называется «Лист1».

  2. При условии, что ожидаемая рабочая книга активна, Worksheets("Sheet1") завершится с ошибкой«Индекс вне диапазона», если ни одна из его таблиц не имеет названия «Лист1», как видно из Excel.Обратите внимание, что любой заданный лист имеет свойства Name и CodeName.Name, как видно из Excel, и может измениться в любое время.CodeName, как видно из редактора Visual Basic, в свойствах рабочего листа в (Имя).Это имя, которое вы можете установить по своему вкусу, будет оставаться стабильным в течение долгого времени.Вы можете использовать его непосредственно в коде, как вы это делали в последних 2 строках кода.

Если вы намереваетесь манипулировать рабочим листом с помощью CodeName Sheet1 в книге, выполняя код,напрямую используйте Sheet1 в ваших 4 строках кода;не беспокойтесь о коллекции Worksheets.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...