Ошибка времени выполнения ‘1004’: ошибка при сбросе ячеек

#vba #excel

#vba #excel

Вопрос:

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

 Private Sub Reset_Click()

Range(Cells(20, 2), Cells(41, 13)).Interior.Color = RGB(217, 217, 217)
Range(Cells(20, 2), Cells(41, 13)).Font.Color = RGB(255, 255, 255)

Range(Cells(3, 2), Cells(11, 13)).Interior.Color = RGB(255, 255, 255)
Range(Cells(13, 2), Cells(18, 13)).Interior.Color = RGB(255, 255, 255)

End Sub
  

Заранее спасибо

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

1. Является ли код модулем рабочего листа? Я предполагаю, что вам нужно квалифицировать свои Range Cells вызовы and вместо использования глобальных значений.

2. Как указано выше в @Comintern. Вам необходимо квалифицировать Range Cells вызовы and, иначе они будут рассматриваться как относящиеся к ActiveSheet , которые могут быть не теми, которые вы ожидаете

3. Вы защитили лист?

4. Я очень новичок в Excel, поэтому я не слишком уверен, что такое модуль рабочего листа. Однако я пишу код на текущем листе, на котором он находится, поэтому мне никогда не приходилось сначала объявлять рабочий лист. Также, когда я пытаюсь объявить рабочий лист, я получаю сообщение об ошибке.

5. Но вы действительно сняли защиту с листа?

Ответ №1:

Вот скорректированный код (который должен работать):

 Option Explicit

Private Sub Reset_Click()

Dim ws As Worksheet

' Change in the following line the name of the sheet (if necessary)
Set ws = ThisWorkbook.Worksheets("Sheet1")

ws.Range(ws.Cells(20, 2), ws.Cells(41, 13)).Interior.Color = RGB(217, 217, 217)
ws.Range(ws.Cells(20, 2), ws.Cells(41, 13)).Font.Color = RGB(255, 255, 255)

ws.Range(ws.Cells(3, 2), ws.Cells(11, 13)).Interior.Color = RGB(255, 255, 255)
ws.Range(ws.Cells(13, 2), ws.Cells(18, 13)).Interior.Color = RGB(255, 255, 255)

End Sub
  

В принципе, вы должны квалифицировать все свои Range and Cells с помощью применимого workbook and worksheet . В противном случае вы оставляете VBA угадывать, какой файл Excel использовать и какой лист в файле следует изменить.

Поскольку это работа сообщества с комментариями выше, я сделаю этот ответ ответом сообщества wiki.

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

1. когда я ввожу это, я получаю эту ошибку. Ошибка времени выполнения ‘9’: индекс вне диапазона

2. Вы изменили имя листа в коде (как указано в коде)? Скорее всего, ваш лист не назван Sheet1 , а имеет другое имя ?!

3. Если у вас в файле только один лист (как указано в комментарии выше), вы также можете использовать Set ws = ThisWorkbook.Worksheets(1) вместо Set ws = ThisWorkbook.Worksheets("Sheet1") .

4. Я изменил его на этот набор ws = ThisWorkbook . Рабочие листы («Лист2 (2)»)

5. Если имя вашего листа Sheet2(2) , то оно должно работать сейчас. В противном случае вы также можете использовать Set ws = ThisWorkbook.Worksheets(1) (как упоминалось выше), поскольку в вашем файле только один лист. Кстати, нам не слишком интересно, как вы изменили имена листов в коде, но нам очень интересно, разрешилась ли ваша проблема с помощью этого ответа. Если да, пожалуйста, отметьте этот ответ как принятый, чтобы мы могли двигаться дальше.

Ответ №2:

Сколько у вас листов?? Если вы не уточните местоположение диапазона, вы получите сообщение об ошибке. Попробуйте что-то вроде:

    Sheets("NameOfTheSheetWhereTheRangeIsLocated").Range(Cells(20, 2), Cells(41, 13)).Interior.Color = RGB(217, 217, 217)
  

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

1. У меня есть только 1 лист.

2. Попробуйте не создавать частный подраздел, если не делайте этого в модуле рабочего листа. Вы создаете модуль рабочего листа, нажав на название листа в редакторе. если вы создали обычный модуль, просто попробуйте изменить свой частный подраздел на общедоступный и укажите лист.

3. @Ary: я хотел бы внести предложение по улучшению вашего решения: вы предлагаете уточнить код (который является правильным и хорошим). Тем не менее, вам не хватает одного шага до полной квалификации вашего кода самостоятельно. Ваше решение квалифицирует лист, но не (пока) рабочую книгу (файл Excel) для работы. Это решение может (потенциально) привести к очень похожей проблеме в будущем. Чтобы полностью квалифицировать ваш код, вы должны включить ThisWorkbook.Sheets("NameOfTheSheetWhereTheRangeIsLocated")... .

4. @Ralph, спасибо 🙂 ! Честно говоря, я гораздо чаще использую этот синтаксис: NameOfMySheet.Range(...) , поэтому я совершенно забыл, что лучше полностью квалифицировать код, добавив ThisWorkbook в этом случае!

Ответ №3:

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