Условия: лист не защищенный от изменений. VBA script, который что-то делает с листом, допустим с ячекой B2. Неважно, пользовательский это уже файл или в разработке, когда шаблон часто меняется и каждый раз вносит изменения нет желания.
Какие методы можно использовать, чтоб типа не потерять "из вида" ячейку в случае вставки столбца. строки? Желательно сохранить совместимость с разными версиями приходит на ум : 1. Именовать область и Range(<Name>) / [Name] 2. Делать лист натроек (settings) и там , сославшись на B2, получать текстом адрес в ячеке скажем D3 ,после чего Range(setings.Range("D3"),value) . Правда не дай боже потом что-то сдвинуть на листе settings!!!! 3 Искать её по какому либо признаку, но хорошо если это признак есть. 4. ????
Есть варианты?
Условия: лист не защищенный от изменений. VBA script, который что-то делает с листом, допустим с ячекой B2. Неважно, пользовательский это уже файл или в разработке, когда шаблон часто меняется и каждый раз вносит изменения нет желания.
Какие методы можно использовать, чтоб типа не потерять "из вида" ячейку в случае вставки столбца. строки? Желательно сохранить совместимость с разными версиями приходит на ум : 1. Именовать область и Range(<Name>) / [Name] 2. Делать лист натроек (settings) и там , сославшись на B2, получать текстом адрес в ячеке скажем D3 ,после чего Range(setings.Range("D3"),value) . Правда не дай боже потом что-то сдвинуть на листе settings!!!! 3 Искать её по какому либо признаку, но хорошо если это признак есть. 4. ????
Искать её по какому либо признаку, но хорошо если это признак есть
Я обычно так и делаю. А признак есть всегда, иначе как Вы эту ячейку глазами на листе находите? Признак может быть не в самой ячейке, а вычисляться относительно других ячеек. Например, ячейка ниже на 3 строки от ячейки, которая является шапкой первой таблицы и в которой написано "Сумма ИТОГО" (это мы находим столбец), а строку шапки мы определяем как ту строку, где в столбце В написано "номенклатура". Был бы файл с пояснениями - можно было бы подробнее расписать
Искать её по какому либо признаку, но хорошо если это признак есть
Я обычно так и делаю. А признак есть всегда, иначе как Вы эту ячейку глазами на листе находите? Признак может быть не в самой ячейке, а вычисляться относительно других ячеек. Например, ячейка ниже на 3 строки от ячейки, которая является шапкой первой таблицы и в которой написано "Сумма ИТОГО" (это мы находим столбец), а строку шапки мы определяем как ту строку, где в столбце В написано "номенклатура". Был бы файл с пояснениями - можно было бы подробнее расписать_Boroda_
buchlotnik, Тут только вопрос совместимости, честнго говоря не помню когда стало можно [vba]
Код
[Name]
[/vba] я могу ошибаться но c 2010 кажется , да и с именованными областями кажется на книгу можно было назначить, а сейчас на отдельный лист. Хотя возможно я это с Libre, чтоб он был быстрее доработан :-), путаю.
_Boroda_, Я общий случай обсуждаю. Пример дал но , для иллюстрации. Ну а глаз и мозг - как вы мельком за пару секунд узнаете кадр из фильма? Доли секунд хрен знает сктлько операци. сравнений .... ....
Это не идельный пример, но .... Форму (CTRL+f или A4 select ) попросили привязать H столбцу + В самом коде используется смещение на 2 относительно столбца Артикул. Все ок, но тут просят удалить скрытые столбцы 3 и 5. Также заказчикволен менять колонтитул. Изменить то код не проблема, но вопрос, как сделать чтоб его не менять. Тут и так есть метка Header. Повесить якоря жесткие есть желание вот и задал вопрос. P.S. Код прошу не критиковать и так помощь от перевода строки в номер переросла через 3 промежуточных варианта к собсвенной форме поиска. отказать было неудобно :-),
buchlotnik, Тут только вопрос совместимости, честнго говоря не помню когда стало можно [vba]
Код
[Name]
[/vba] я могу ошибаться но c 2010 кажется , да и с именованными областями кажется на книгу можно было назначить, а сейчас на отдельный лист. Хотя возможно я это с Libre, чтоб он был быстрее доработан :-), путаю.
_Boroda_, Я общий случай обсуждаю. Пример дал но , для иллюстрации. Ну а глаз и мозг - как вы мельком за пару секунд узнаете кадр из фильма? Доли секунд хрен знает сктлько операци. сравнений .... ....
Это не идельный пример, но .... Форму (CTRL+f или A4 select ) попросили привязать H столбцу + В самом коде используется смещение на 2 относительно столбца Артикул. Все ок, но тут просят удалить скрытые столбцы 3 и 5. Также заказчикволен менять колонтитул. Изменить то код не проблема, но вопрос, как сделать чтоб его не менять. Тут и так есть метка Header. Повесить якоря жесткие есть желание вот и задал вопрос. P.S. Код прошу не критиковать и так помощь от перевода строки в номер переросла через 3 промежуточных варианта к собсвенной форме поиска. отказать было неудобно :-), bmv98rus
Какую ячейку, когда не потерять, в какой части кода, ...
Ну почему Вы считаете, что для того, чтобы ответить на Ваш вопрос, мы так жаждем внимательно просмотреть все Ваши макросы и догадаться о том, что Вам нужно? У меня, например, есть гораздо более привлекательные занятия в полвторого ночи.
Какую ячейку, когда не потерять, в какой части кода, ...
Ну почему Вы считаете, что для того, чтобы ответить на Ваш вопрос, мы так жаждем внимательно просмотреть все Ваши макросы и догадаться о том, что Вам нужно? У меня, например, есть гораздо более привлекательные занятия в полвторого ночи._Boroda_
_Boroda_, Вопрос был не про конкретный случай или пример. Вопрос был про существующие методы, и если иных кроме 1,2,3 нет то тему можно закрыть.
_Boroda_, Вопрос был не про конкретный случай или пример. Вопрос был про существующие методы, и если иных кроме 1,2,3 нет то тему можно закрыть.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Не, мужики... В обращении к именованным диапазонам есть тонкости. Всё проходит гладко и просто только если имя диапазона ВО ВСЕЙ КНИГЕ уникально. А вот если оно повторяется на нескольких листах (так обычно получается при дублировании листа целиком по ПКМ на ярлыке), то начинаются проблемы... Я даже себе шпаргалку составил, чтобы на эти грабли неожиданно не наступить: [vba]
Код
Private Sub test_NamedRange() ' на каком-то листе в ЭТОЙ книге создан именованный диапазон "NmRng" ' так ОБЫЧНО (но иногда вдруг начинает глючить) можно обратиться к нему из ЛЮБОГО модуля ЭТОЙ книги: Debug.Print [NmRng].Value Debug.Print [NmRng].Parent.Name ' так можно обратиться к нему ТОЛЬКО из модуля того листа, на котором расположен диапазон _ и обычно получается - из стандартного модуля: Debug.Print Range("NmRng").Value Debug.Print Range("NmRng").Parent.Name ' так ВСЕГДА можно обратиться к нему из ЛЮБОГО модуля ЭТОЙ книги: Debug.Print ThisWorkbook.Names("NmRng").RefersToRange.Value Debug.Print ThisWorkbook.Names("NmRng").RefersToRange.Parent.Name End Sub
[/vba]
Не, мужики... В обращении к именованным диапазонам есть тонкости. Всё проходит гладко и просто только если имя диапазона ВО ВСЕЙ КНИГЕ уникально. А вот если оно повторяется на нескольких листах (так обычно получается при дублировании листа целиком по ПКМ на ярлыке), то начинаются проблемы... Я даже себе шпаргалку составил, чтобы на эти грабли неожиданно не наступить: [vba]
Код
Private Sub test_NamedRange() ' на каком-то листе в ЭТОЙ книге создан именованный диапазон "NmRng" ' так ОБЫЧНО (но иногда вдруг начинает глючить) можно обратиться к нему из ЛЮБОГО модуля ЭТОЙ книги: Debug.Print [NmRng].Value Debug.Print [NmRng].Parent.Name ' так можно обратиться к нему ТОЛЬКО из модуля того листа, на котором расположен диапазон _ и обычно получается - из стандартного модуля: Debug.Print Range("NmRng").Value Debug.Print Range("NmRng").Parent.Name ' так ВСЕГДА можно обратиться к нему из ЛЮБОГО модуля ЭТОЙ книги: Debug.Print ThisWorkbook.Names("NmRng").RefersToRange.Value Debug.Print ThisWorkbook.Names("NmRng").RefersToRange.Parent.Name End Sub
Alex_ST, Спасибо, я именно на дублировании и напоролся, что и послужило толчком к вопросу. Получается, что не якорь меняем, а правильно его используем.
Alex_ST, Спасибо, я именно на дублировании и напоролся, что и послужило толчком к вопросу. Получается, что не якорь меняем, а правильно его используем.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Это точно. С предсказуемым результатом обращаться к именованному диапазону на листе можно ТОЛЬКО из модуля этого листа. Иначе в один из последующих моментов (и вовсе не обязательно, что при отладке) могут возникнуть проблемы.
Это точно. С предсказуемым результатом обращаться к именованному диапазону на листе можно ТОЛЬКО из модуля этого листа. Иначе в один из последующих моментов (и вовсе не обязательно, что при отладке) могут возникнуть проблемы.Alex_ST
К стати, сейчас пришёл в голову ещё один вариант, более-менее защищённый от неожиданностей (кроме удаления диапазона или листа с ним вообще, конечно). Если Вам нужно обращаться к именованному диапазону на одном из листов книги из процедуры, размещённой в стандартном модуле, то можно попробовать сделать такой "финт ушами": 1. Дать листу нормальное CodeName вместо стандартного Лист1 (хотя это только для удобства написания кода) 2. Обращаться к диапазону по имени, указывая не имя листа, а CodeName, которое не смогут изменить пользователи, не знающие, что такое VBA, но желающие по какой-то причине изменить надпись на ярлыке листа. Обращение получится типа [vba]
[/vba]Чуть длиннее, но, похоже, должно работать (Не проверял!!!)
К стати, сейчас пришёл в голову ещё один вариант, более-менее защищённый от неожиданностей (кроме удаления диапазона или листа с ним вообще, конечно). Если Вам нужно обращаться к именованному диапазону на одном из листов книги из процедуры, размещённой в стандартном модуле, то можно попробовать сделать такой "финт ушами": 1. Дать листу нормальное CodeName вместо стандартного Лист1 (хотя это только для удобства написания кода) 2. Обращаться к диапазону по имени, указывая не имя листа, а CodeName, которое не смогут изменить пользователи, не знающие, что такое VBA, но желающие по какой-то причине изменить надпись на ярлыке листа. Обращение получится типа [vba]
В случае с одиночным листом - да, при дулировании -не пройдет, точнее пройдет, но я слабо представляю код, который использует динамическое CodeName. В любом случае спасибо.
Вывод - нет лени! Пусть строка будет подлиннее, но понадежнее.
Alex_ST,
В случае с одиночным листом - да, при дулировании -не пройдет, точнее пройдет, но я слабо представляю код, который использует динамическое CodeName. В любом случае спасибо.
Вывод - нет лени! Пусть строка будет подлиннее, но понадежнее.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
[offtop] ушли от темы. получить, получили, А что с ним потом делать, если это строка, как я понимаю. Еще раз спасибо. Давайте на этом закончим.
Alex_ST,
[offtop] ушли от темы. получить, получили, А что с ним потом делать, если это строка, как я понимаю. Еще раз спасибо. Давайте на этом закончим.bmv98rus
Замечательный Временно просто медведь , процентов на 20.