|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
Коллеги! Подскажите как сделать красиво, потому как некрасиво я знаю как. Дано: Приходит мне xml вида Код: xml 1. 2. 3. 4. 5. 6.
Мне надо расствить Value в RangeName. Сами RangeName раскиданы на разных листах. Сталкивался с проблемой, когда надо ЯВНО указать Sheet, чтобы корректно вставить значение. Вопрос: Как мне зная RangeName получить имя Sheet, где этот RangeName лежит? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 14:53 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
range(RangeName).Worksheet.Name? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 15:40 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
ИмяЛистаrange(RangeName).Worksheet.Name? Ай! Спасибо, Айболит! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 16:16 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
ИмяЛиста, при этом нужен еще и цикл по листам, т.к. невозможно получить ссылку на именованный диапазон в том случае, когда вызов диапазона происходит не из того листа, в котором он создан(задана область действия не книга, а конкретный лист). Нужно что-то вроде: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 16:18 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
правильнее даже так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 16:20 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
The_Pristправильнее даже так:Уж лучше так Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 16:28 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
ИмяЛистаУж лучше такПопробуйте создать имя с областью действия Лист1 и запустить свой код при активном Лист2. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 16:45 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
The_Prist, Ну, попробовал. Что я должен был увидеть? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 16:51 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
The_Prist, на листе3 вот такой такой макрос Код: vbnet 1. 2. 3.
у меня работает ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 16:58 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
ИмяЛиста, то, что если активен не тот лист, которому принадлежит имя, получите ошибку. Уверены, что точно понимаете фразу "область действия имени"? Вот скрин, не уверен, что точно опишет необходимые для получения ошибки действия. Поэтому в следующем сообщении будет еще и файл. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 17:03 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
The_Prist, Добавь такую sub Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
и запускай хоть с листа диаграммы ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 17:11 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
ИмяЛистау меня работает ;)потому что имя создано с областью действия - Книга . Я об этом и писал. Но как показывает практика, имена имеют место быть не только с этой областью действия. Иногда они создаются с конкретно заданным листом для применения. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 17:12 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
ИмяЛистаи запускай хоть с листа диаграммыБез вопросов, такой код работает без проблем. Только для начала проверь свои предыдущие советы и коды, который у тебя работают с твоими условиями. Я на них отвечал. Хоть один работает на моем файле для имени "_test" из листа Лист1? Например, вот этот: Код: vbnet 1. 2. 3.
вставь в модуль листа Лист1 и перейди на Лист1. Получится получить имя листа? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 17:19 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
ИмяЛистаДобавь такую subТы, видимо, перепутал того, кому это нужно со мной :) Я и без твоих подсказок себе корректный код могу сочинить, который будет работать при любой ситуации. А вот тебя на правильный код пришлось направлять... Так что смайл твой не очень уместен. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 17:21 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
The_Prist, Чтобы было понагляднее. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Вглядись внимательнее в реальное название твоего имени "_test" и ты поймешь, как его использовать из любого места. Код: vbnet 1.
Так что подучи пока правила именования прежде чем направлять. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 17:31 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
ИмяЛистаи ты поймешь, как его использовать из любого места Да, ты мне прям глаза открыл. ИмяЛистаподучи пока правила именования прежде чем направлятьну да, куда мне до таких глубоких познаний правил именования, как у тебя... Вспомним автора темы: RegisteredUserПриходит мне xml вида Код: xml 1. 2. 3. 4. 5. 6.
Мне надо расствить Value в RangeName. ну-ка, блесни знанием, скажи мне неучу - как же человеку с твоими правилами именования решить изначальную проблему: RegisteredUserСталкивался с проблемой, когда надо ЯВНО указать Sheet , чтобы корректно вставить значение таким кодом: ИмяЛиста Код: vbnet 1.
Т.е. ты предлагаешь указать явно имя листа, чтобы получить имя листа? Гениально, Холмс! Хлопаю стоя! Не вижу смысла дальнейшего обсуждения с человеком, который сам уже не понимает что предлагает, но хочет выглядеть офигенным знатоком. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 17:49 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
так вроде бы все работает Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 17:50 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
RegisteredUser, опять же - если имя создано с областью действия на конкретном листе, то строка Код: vbnet 1.
выдаст ошибку, если вызвана не с того листа, областью действия которого ограничено имя... Т.к. нет других случаев, когда для имени надо указывать конкретный лист. Во всех остальных случаях(если область действия имени Книга) - имя корректно может быть вызвано из любого листа книги, в котором создано и ему может быть присвоено значение. Если применить код неизвестного(ИмяЛиста): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
то мы получим имена листов, да. Но сравнивать с именем из схемы будет чуть проблематично, т.к. надо учесть озвученный им же факт - если имя создано с областью действия на конкретном листе, то имя имени содержит имя самого листа("Лист2!_test"), что не дает делать однозначную простую проверку вроде If n.Name = "rgKr" Then. Поэтому я и привел код с циклом по листам, как наиболее простой в понимании и реализации, хоть может быть и не оптимален по скорости(не проверял). ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 18:01 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
RegisteredUser, На самом деле The_Prist тоже дело говорит, хоть и волнуется немножко. область действия имени может быть локализована одним листом. Именно поэтому некоторые имена иногда вызывают ошибку, о которой ты написал. Однако тут нужно чуть глубже чувствовать проблему, чем The_Prist. Когда имена ограничивают областью листа, то "одинаковых" имен в книге может быть несколько. И подход The_Prist может привести к нежелательному результату, а именно к выбору имени не с того листа. Поэтому нужно либо задавать RangeName в глобальном формате, т.е. с именем листа, если это имя локализовано. Или принять решение, что для локальных имен нужно присваивать value на всех листах, где это имя встречается. Во втором случае подойдет цикл от Приста, а в первом range(RangeName) с обработкой ошибки на отсутствие имени. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 18:07 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
ИмяЛистаИ подход The_Prist может привести к нежелательному результату, а именно к выбору имени не с того листаЗдесь полностью согласен. Имен может быть столько же, сколько листов + 1. И в данной конкретной ситуации единственное, что можно посоветовать - попробовать иначе подойти к формированию схемы. Это самый верный вариант, на мой взгляд. При условии, что он вообще допустим :) Все остальное - это некий компромисс, как ни крути. ИмяЛистахоть и волнуется немножко никаких волнений. Просто ты как-то уж очень резко мысли выражаешь и делаешь необоснованные выводы относительно знаний оппонента на фоне того, что сам на протяжении нескольких сообщений никак не мог вспомнить тот факт, что для обращения к имени, определенному для конкретного листа, обязательно указание этого самого листа(которого мы не знаем к тому же), если лист этот не является активным. Но именно на это я и заострял внимание, а не на то, что к имени можно обратиться так и сяк...Вот и все. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2016, 18:20 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
The_PristRegisteredUser, опять же - если имя создано с областью действия на конкретном листе, то строка Код: vbnet 1.
выдаст ошибку, если вызвана не с того листа, областью действия которого ограничено имя... Т.к. нет других случаев, когда для имени надо указывать конкретный лист. Во всех остальных случаях(если область действия имени Книга) - имя корректно может быть вызвано из любого листа книги, в котором создано и ему может быть присвоено значение. Если применить код неизвестного(ИмяЛиста): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
то мы получим имена листов, да. Но сравнивать с именем из схемы будет чуть проблематично, т.к. надо учесть озвученный им же факт - если имя создано с областью действия на конкретном листе, то имя имени содержит имя самого листа("Лист2!_test"), что не дает делать однозначную простую проверку вроде If n.Name = "rgKr" Then. Поэтому я и привел код с циклом по листам, как наиболее простой в понимании и реализации, хоть может быть и не оптимален по скорости(не проверял). да! такая хрень с областью действия действительно имеет место быть. и я вот так приблизительно и бегал по листам и искал это RangeName. НО такой подход ИМХО какой-то корявый. Я именно поэтому и спросил у вселенского разума - мож я че-то не рублю и есть элегантный способ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2016, 11:43 |
|
Excel: Range и Sheet
|
|||
---|---|---|---|
#18+
RegisteredUser, Договорись сначала с пользователями. Либо вы используете глобальные имена, и тогда вообще пофиг, где определено имя. и бегать не нужно. Либо вы используете локальные имена и договариваетесь, что делать с повторениями имен на разных листах. По любому, бегать правильно по именам (ThisWorkbook.Names), а не по листам. Когда бегаешь по листам, то не понятно, локально ли для листа задано имя или глобально для книги. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2016, 16:00 |
|
|
start [/forum/topic.php?fid=61&msg=39362878&tid=2172840]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 173ms |
0 / 0 |