Индекс вне диапазона Ошибка после переименования листов - PullRequest
6 голосов
/ 29 марта 2012

Я выполнил небольшой проект, состоящий из 5 листов Excel, код работает нормально, и я также получаю точный результат, но если я переименую листы из sheet1 в другое имя, я получаю Subscript вне диапазона Error.

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

Ниже приведен код

Public  Sub amount_final()

Dim Row1Crnt As Long
Dim Row2Crnt As Long


With Sheets("sheet4")
Row1Last = .Cells(Rows.Count, "B").End(xlUp).Row
End With

Row1Crnt = 2
With Sheets("sheet3")
Row2Last = .Cells(Rows.Count, "B").End(xlUp).Row
End With

Ответы [ 5 ]

12 голосов
/ 29 марта 2012

В самом коде нет ничего плохого. Вы получите ошибку Subscript out of range, если Excel не сможет найти конкретный лист, что вполне очевидно, поскольку вы переименовали его. Например, если вы переименуете свой лист «Sheet3» в «SheetXYZ», Excel не сможет его найти.

Единственный способ избежать ошибок такого рода - использовать CODENAME листов. Посмотреть снимок

enter image description here

Здесь у нас есть лист с именем «Образец перед переименованием»

Так что рассмотрите этот код

Sheets("Sample Name before Renaming").Range("A1").Value = "Blah Blah"

Тот же код можно записать как

Sheet2.Range("A1").Value = "Blah Blah"

Теперь, независимо от того, сколько раз вы переименовываете лист, приведенный выше код всегда будет работать:)

НТН

Sid

1 голос
/ 29 марта 2012

Основная проблема заключается в том, что вы обращаетесь к листам, используя их общие имена, а не их кодовые имена. Всякий раз, когда вы ссылаетесь на Sheets («sheet4»), вы полагаетесь на лист с таким именем в Excel. Кодовые имена - это имена, назначенные в Visual Basic, поэтому конечный пользователь не взаимодействует с ними / как разработчик, вы можете изменить имена Excel в любое время, когда захотите

Использование кодовых имен рассматривается в 9:40 в этом справочном видео Excel * . Вы заметите, что они быстрее набираются, чем имена Excel, так как не требуют квалификатора Sheets ()

Я не смог увидеть Sheets ("Sheet1") в вашем примере кода, но вы можете очень быстро переключиться на кодовое имя для всех листов, найдя / заменив все примеры, например, 'Листы ( "Лист2").' с «Листом 2».

0 голосов
/ 23 октября 2015

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

Моя ситуация состояла в том, что у меня был список, содержащийся в столбце А. Для каждой ячейки со значением я сохранял значение в переменной, создавал новый лист и назвал лист в соответствии со значением, хранящимся в переменной.

Чуть позже в коде я попытался выбрать вновь созданный лист, используя код:

Sheets(ValueVariable).Select

Я столкнулся с ошибкой "Подпись вне диапазона" и не смог понятьпочему.Я использовал подобный код раньше с успехом.Однако я решил ее, приведя переменную как строку.Объявление переменной в виде строки, похоже, не работает для меня.

Итак, если кто-то еще столкнется с этой ошибкой и захочет что-то попробовать, возможно, это подойдет вам:

Sheets(Cstr(ValueVariable)).Select
0 голосов
/ 24 ноября 2014

Я хотел бы поделиться своим опытом борьбы с этой проблемой.Вот ошибка, которую я совершил:

Dim DailyWSNameNew As String
lastrow = Sheets("DailyWSNameNew").Range("A65536").End(xlUp).Row + 1 -- This is wrong as I included a placeholder worksheet name in quotes

Исправление:

lastrow = Sheets(DailyWSNameNew).Range("A65536").End(xlUp).Row + 1

Это решило ее.

0 голосов
/ 29 марта 2012

Вместо этого обращайтесь к каждому листу по их кодовым именам. По умолчанию они установлены на Sheet1, Sheet2 и т. Д., Но вы можете переименовать их в окне Properties для каждого листа, если хотите. Таким образом, вы можете написать свой код, как показано ниже, независимо от того, как вы называете листы.

With Sheet1
Row1Last = .Cells(Rows.Count, "B").End(xlUp).Row
End With

Row1Crnt = 2
With Sheet2
Row2Last = .Cells(Rows.Count, "B").End(xlUp).Row
End With

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