Здравствуйте уважаемые форумчане, суть проблемы в смене названия листов на исходные при переименовании. Ввиду поверхностного знания средств VBA, для решения возникающих проблем всегда пользуюсь гуглом. Нагуглил из примера пользователя New с ресурса planetaexcel.ru (http://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=8&TID=7135) следующий пример
[vba]
Код
Option Explicit
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) 'проверка будет срабатывать при изменении информации на листе 'сейчас все кодовые имена листов равны названиям листов 'т.е. кодовое имя Лист1 и название листа тоже Лист1 Dim iSht As Worksheet For Each iSht In ThisWorkbook.Worksheets If iSht.CodeName <> iSht.Name Then iSht.Name = iSht.CodeName Next iSht End Sub
[/vba]
данный подход мне не очень походит, напрашивается решение со сравнением не имен codename, а например с каким то заданным списком названий листов например у меня фиксированное количество листов с фиксированными названиями: у codename лист1 имя (абв), у codename лист2 имя (где) и так далее. Затем зациклить всё это, чтобы при переименовании сравнивалось не с codename, а вот с этим фиксированным списком названий и переименовывалось обратно. понимание проблемы вроде есть, но вот реализовать всё вышеперечисленное только научным методом тыка и гуглом не получается, помогите пож-та
Здравствуйте уважаемые форумчане, суть проблемы в смене названия листов на исходные при переименовании. Ввиду поверхностного знания средств VBA, для решения возникающих проблем всегда пользуюсь гуглом. Нагуглил из примера пользователя New с ресурса planetaexcel.ru (http://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=8&TID=7135) следующий пример
[vba]
Код
Option Explicit
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) 'проверка будет срабатывать при изменении информации на листе 'сейчас все кодовые имена листов равны названиям листов 'т.е. кодовое имя Лист1 и название листа тоже Лист1 Dim iSht As Worksheet For Each iSht In ThisWorkbook.Worksheets If iSht.CodeName <> iSht.Name Then iSht.Name = iSht.CodeName Next iSht End Sub
[/vba]
данный подход мне не очень походит, напрашивается решение со сравнением не имен codename, а например с каким то заданным списком названий листов например у меня фиксированное количество листов с фиксированными названиями: у codename лист1 имя (абв), у codename лист2 имя (где) и так далее. Затем зациклить всё это, чтобы при переименовании сравнивалось не с codename, а вот с этим фиксированным списком названий и переименовывалось обратно. понимание проблемы вроде есть, но вот реализовать всё вышеперечисленное только научным методом тыка и гуглом не получается, помогите пож-таSkynet
Солидарен с Ran, но исходя из прочитанного напрашивается сразу вопрос, а может совсем запретить их переименовывать через защиту структуры книги, без макросов? Попробуйте переименовать листы в файле.
Солидарен с Ran, но исходя из прочитанного напрашивается сразу вопрос, а может совсем запретить их переименовывать через защиту структуры книги, без макросов? Попробуйте переименовать листы в файле.DJ_Marker_MC
Солидарен с Ran, но исходя из прочитанного напрашивается сразу вопрос, а может совсем запретить их переименовывать через защиту структуры книги, без макросов? Попробуйте переименовать листы в файле.
На листах есть макросы, которые скрывают и отображают листы по условиям в ячейках, так что защита структуры не очень подходит
на ум приходит заменить [vba]
Код
If iSht.CodeName <> iSht.Name Then iSht.Name = iSht.CodeName
[/vba] на сравнения кодовых имен с заданными именами листов [vba]
Код
If Лист1.CodeName <> a.Name Then iSht.Name = "a" If Лист2.CodeName <> b.Name Then iSht.Name = "b" If Лист3.CodeName <> c.Name Then iSht.Name = "c"
Солидарен с Ran, но исходя из прочитанного напрашивается сразу вопрос, а может совсем запретить их переименовывать через защиту структуры книги, без макросов? Попробуйте переименовать листы в файле.
На листах есть макросы, которые скрывают и отображают листы по условиям в ячейках, так что защита структуры не очень подходит
на ум приходит заменить [vba]
Код
If iSht.CodeName <> iSht.Name Then iSht.Name = iSht.CodeName
[/vba] на сравнения кодовых имен с заданными именами листов [vba]
Код
If Лист1.CodeName <> a.Name Then iSht.Name = "a" If Лист2.CodeName <> b.Name Then iSht.Name = "b" If Лист3.CodeName <> c.Name Then iSht.Name = "c"
Доброе время суток. Вариант, хотя защита структуры книги без условно правильнее. Упехов.
всё работает, но понять как пока не могу, если не сложно напишите в личку рекомендуемую литературу по VBA, очень хочется начать разбираться самомуSkynet
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Dim iSht As Worksheet For Each iSht In ThisWorkbook.Worksheets iSht.Name = Switch(iSht.CodeName = "Лист1", "a", _ iSht.CodeName = "Лист2", "b", iSht.CodeName = "Лист3", "c") Next iSht End Sub
[/vba]
PS Одна беда - при использовании этих макросов с событием Workbook_SheetSelectionChange практически любая отмена изменений в книге станет невозможной.
[vba]
Код
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Dim iSht As Worksheet For Each iSht In ThisWorkbook.Worksheets iSht.Name = Switch(iSht.CodeName = "Лист1", "a", _ iSht.CodeName = "Лист2", "b", iSht.CodeName = "Лист3", "c") Next iSht End Sub
[/vba]
PS Одна беда - при использовании этих макросов с событием Workbook_SheetSelectionChange практически любая отмена изменений в книге станет невозможной.RAN
Быть или не быть, вот в чем загвоздка!
Сообщение отредактировал RAN - Вторник, 29.04.2014, 09:56
вроде работает, но с изьяном, ставлю защиту книги с паролем, всё работает, как только срабатывает макрос скрытия листов по событию закрытия книги, выдает ошибку
run-time error '1004'
Неверный пароль.Убедитесь что выключен caps и используется правильный регистр
после этого книга по-прежнему защищена но уже без пароля.
вроде работает, но с изьяном, ставлю защиту книги с паролем, всё работает, как только срабатывает макрос скрытия листов по событию закрытия книги, выдает ошибку
run-time error '1004'
Неверный пароль.Убедитесь что выключен caps и используется правильный регистр
после этого книга по-прежнему защищена но уже без пароля.Skynet
как только срабатывает макрос скрытия листов по событию закрытия книги, выдает ошибку
А вы вначале этого макроса снимаете защиту? Также проверьте пароли чтоб совпадали когда ставите и когда снимаете... попробуйте поставить числовой пароль чтоб избежать проблем с регистром и rus/eng алфавитом.
Перед закрытие снимайте защиту, а при входе ставьте.
Цитата
как только срабатывает макрос скрытия листов по событию закрытия книги, выдает ошибку
А вы вначале этого макроса снимаете защиту? Также проверьте пароли чтоб совпадали когда ставите и когда снимаете... попробуйте поставить числовой пароль чтоб избежать проблем с регистром и rus/eng алфавитом.
Перед закрытие снимайте защиту, а при входе ставьте.DJ_Marker_MC
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Dim iSht As Worksheet For Each iSht In ThisWorkbook.Worksheets iSht.Name = Switch(iSht.CodeName = "Лист1", "a", _ iSht.CodeName = "Лист2", "b", iSht.CodeName = "Лист3", "c") Next iSht End Sub
[/vba]
в том, что это можно обойти через запрет макросов, а потом зайти и переименовать листы, и включить их обратно
проблема решения anvq и RAN
[vba]
Код
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Dim iSht As Worksheet For Each iSht In ThisWorkbook.Worksheets iSht.Name = Switch(iSht.CodeName = "Лист1", "a", _ iSht.CodeName = "Лист2", "b", iSht.CodeName = "Лист3", "c") Next iSht End Sub
[/vba]
в том, что это можно обойти через запрет макросов, а потом зайти и переименовать листы, и включить их обратноSkynet
Skynet, Запрет запрета макросов тоже уже давно продуман через лист Warning В гугле "лист Warning в Excel" первая же ссылка в списке... Где то и у нас на форуме было, но что то не нашел.
Skynet, Запрет запрета макросов тоже уже давно продуман через лист Warning В гугле "лист Warning в Excel" первая же ссылка в списке... Где то и у нас на форуме было, но что то не нашел.DJ_Marker_MC
А зачем вообще запрещать переименование листов? В чем великий смысл сего действа?
макросы на энном количестве листов оперируют скрытием/раскрытием этих самых листов по различным условиям в ячейках, если переименовывать листы, то возникают ошибки и не отображается необходимый набор листов. Сделал небольшое расчетное приложение мега на 1,5. На работе подчиненные пользуются, но они настолько далекие от экселевских тонкостей, что дальше функции сумм ничего не знают. Сей факт приводит к некоторому ступору малограмотных юзеров и косякам дальнейших ручных расчетах.
А зачем вообще запрещать переименование листов? В чем великий смысл сего действа?
макросы на энном количестве листов оперируют скрытием/раскрытием этих самых листов по различным условиям в ячейках, если переименовывать листы, то возникают ошибки и не отображается необходимый набор листов. Сделал небольшое расчетное приложение мега на 1,5. На работе подчиненные пользуются, но они настолько далекие от экселевских тонкостей, что дальше функции сумм ничего не знают. Сей факт приводит к некоторому ступору малограмотных юзеров и косякам дальнейших ручных расчетах.Skynet
еще не совсем отошел от мозгового штурма реализации базы данных в гугл таблицах, чтобы перед открытием файла xlsm копировало через интернет от туда на лист массив данных, а перед закрытием удалялось, тем самым добивается что база всегда последней версии и проверенная мной лично.
еще не совсем отошел от мозгового штурма реализации базы данных в гугл таблицах, чтобы перед открытием файла xlsm копировало через интернет от туда на лист массив данных, а перед закрытием удалялось, тем самым добивается что база всегда последней версии и проверенная мной лично.Skynet
если переименовывать листы и использовать CodeName , то НЕ возникают ошибки и отображается необходимый набор листов
было [vba]
Код
If Target.Address = [V19].Address Then Select Case Target Case 0 Sheets("Лист1").Visible = xlSheetVeryHidden Case 1 Sheets("Лист1").Visible = True End Select End If
[/vba]
ставлю
[vba]
Код
[vba][code]If Target.Address = [V19].Address Then Select Case Target Case 0 Sheets("Лист1").codename.Visible = xlSheetVeryHidden Case 1 Sheets("Лист1").codename.Visible = True End Select End If
если переименовывать листы и использовать CodeName , то НЕ возникают ошибки и отображается необходимый набор листов
было [vba]
Код
If Target.Address = [V19].Address Then Select Case Target Case 0 Sheets("Лист1").Visible = xlSheetVeryHidden Case 1 Sheets("Лист1").Visible = True End Select End If
[/vba]
ставлю
[vba]
Код
[vba][code]If Target.Address = [V19].Address Then Select Case Target Case 0 Sheets("Лист1").codename.Visible = xlSheetVeryHidden Case 1 Sheets("Лист1").codename.Visible = True End Select End If