Гость
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel: Range и Sheet / 23 сообщений из 23, страница 1 из 1
08.12.2016, 14:53
    #39362612
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
Коллеги!
Подскажите как сделать красиво, потому как некрасиво я знаю как.

Дано:
Приходит мне xml вида

Код: xml
1.
2.
3.
4.
5.
6.
... 
			<DataS>
				<RangeName>rgKr</RangeName>
				<Value>0</Value>
			</DataS>
...


Мне надо расствить Value в RangeName.
Сами RangeName раскиданы на разных листах.
Сталкивался с проблемой, когда надо ЯВНО указать Sheet, чтобы корректно вставить значение.


Вопрос: Как мне зная RangeName получить имя Sheet, где этот RangeName лежит?
...
Рейтинг: 0 / 0
08.12.2016, 15:40
    #39362670
ИмяЛиста
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
range(RangeName).Worksheet.Name?
...
Рейтинг: 0 / 0
08.12.2016, 16:16
    #39362707
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
ИмяЛистаrange(RangeName).Worksheet.Name?
Ай! Спасибо, Айболит!
...
Рейтинг: 0 / 0
08.12.2016, 16:18
    #39362710
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
ИмяЛиста,

при этом нужен еще и цикл по листам, т.к. невозможно получить ссылку на именованный диапазон в том случае, когда вызов диапазона происходит не из того листа, в котором он создан(задана область действия не книга, а конкретный лист). Нужно что-то вроде:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    Const s = "_test" 'имя, которое ищем
    Dim rr As Range, ws As Worksheet
    
    On Error Resume Next
    For Each ws In Worksheets
        Set rr = ws.Range(s)
        If Not rr Is Nothing Then
            MsgBox rr.Parent.Name
        End If
        Set rr = Nothing
    Next
...
Рейтинг: 0 / 0
08.12.2016, 16:20
    #39362712
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
правильнее даже так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    Const s = "_test" 'имя, которое ищем
    Dim rr As Range, ws As Worksheet
    
    On Error Resume Next
    Set rr = Range(s)
    If Not rr Is Nothing Then
        MsgBox rr.Parent.Name
    Else
        For Each ws In Worksheets
            Set rr = ws.Range(s)
            If Not rr Is Nothing Then
                MsgBox rr.Parent.Name
            End If
            Set rr = Nothing
        Next
    End If
...
Рейтинг: 0 / 0
08.12.2016, 16:28
    #39362725
ИмяЛиста
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
The_Pristправильнее даже так:Уж лучше так
Код: sql
1.
ThisWorkbook.Names(RangeName).RefersToRange.Worksheet.name
...
Рейтинг: 0 / 0
08.12.2016, 16:45
    #39362754
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
ИмяЛистаУж лучше такПопробуйте создать имя с областью действия Лист1 и запустить свой код при активном Лист2.
...
Рейтинг: 0 / 0
08.12.2016, 16:51
    #39362764
ИмяЛиста
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
The_Prist,

Ну, попробовал. Что я должен был увидеть?
...
Рейтинг: 0 / 0
08.12.2016, 16:58
    #39362772
ИмяЛиста
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
The_Prist,
на листе3 вот такой такой макрос
Код: vbnet
1.
2.
3.
Private Sub Worksheet_Activate()
    Me.Cells(1, 1).Value = ThisWorkbook.Names("asd").RefersToRange.Worksheet.Name
End Sub

у меня работает ;)
...
Рейтинг: 0 / 0
08.12.2016, 17:03
    #39362781
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
ИмяЛиста,

то, что если активен не тот лист, которому принадлежит имя, получите ошибку. Уверены, что точно понимаете фразу "область действия имени"?
Вот скрин, не уверен, что точно опишет необходимые для получения ошибки действия. Поэтому в следующем сообщении будет еще и файл.
...
Рейтинг: 0 / 0
08.12.2016, 17:03
    #39362783
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
файл с кодом
...
Рейтинг: 0 / 0
08.12.2016, 17:11
    #39362795
ИмяЛиста
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
The_Prist,
Добавь такую sub
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Sub asdasdasd()
Dim n As Name

    For Each n In ThisWorkbook.Names
        Debug.Print n.RefersToRange.Worksheet.Name
    Next n

End Sub

и запускай хоть с листа диаграммы
...
Рейтинг: 0 / 0
08.12.2016, 17:12
    #39362799
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
ИмяЛистау меня работает ;)потому что имя создано с областью действия - Книга . Я об этом и писал. Но как показывает практика, имена имеют место быть не только с этой областью действия. Иногда они создаются с конкретно заданным листом для применения.
...
Рейтинг: 0 / 0
08.12.2016, 17:19
    #39362811
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
ИмяЛистаи запускай хоть с листа диаграммыБез вопросов, такой код работает без проблем. Только для начала проверь свои предыдущие советы и коды, который у тебя работают с твоими условиями. Я на них отвечал. Хоть один работает на моем файле для имени "_test" из листа Лист1?
Например, вот этот:
Код: vbnet
1.
2.
3.
Private Sub Worksheet_Activate()
    Me.Cells(1, 1).Value = ThisWorkbook.Names("_test").RefersToRange.Worksheet.Name
End Sub


вставь в модуль листа Лист1 и перейди на Лист1. Получится получить имя листа?
...
Рейтинг: 0 / 0
08.12.2016, 17:21
    #39362817
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
ИмяЛистаДобавь такую subТы, видимо, перепутал того, кому это нужно со мной :) Я и без твоих подсказок себе корректный код могу сочинить, который будет работать при любой ситуации. А вот тебя на правильный код пришлось направлять... Так что смайл твой не очень уместен.
...
Рейтинг: 0 / 0
08.12.2016, 17:31
    #39362829
ИмяЛиста
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
The_Prist,
Чтобы было понагляднее.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub asdasdasd()
Dim n As Name

    For Each n In ThisWorkbook.Names
        Debug.Print n.Name, n.RefersToRange.Worksheet.Name
    Next n

End Sub
' Результат
'Лист2!_test   Лист2
'_test2        Лист2


Вглядись внимательнее в реальное название твоего имени "_test" и ты поймешь, как его использовать из любого места.
Код: vbnet
1.
ThisWorkbook.Names("Лист2!_test").RefersToRange.Worksheet.Name

Так что подучи пока правила именования прежде чем направлять.
...
Рейтинг: 0 / 0
08.12.2016, 17:49
    #39362844
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
ИмяЛистаи ты поймешь, как его использовать из любого места
Да, ты мне прям глаза открыл.
ИмяЛистаподучи пока правила именования прежде чем направлятьну да, куда мне до таких глубоких познаний правил именования, как у тебя...
Вспомним автора темы:
RegisteredUserПриходит мне xml вида

Код: xml
1.
2.
3.
4.
5.
6.
... 
			<DataS>
				<RangeName>rgKr</RangeName>
				<Value>0</Value>
			</DataS>
...


Мне надо расствить Value в RangeName.
ну-ка, блесни знанием, скажи мне неучу - как же человеку с твоими правилами именования решить изначальную проблему:
RegisteredUserСталкивался с проблемой, когда надо ЯВНО указать Sheet , чтобы корректно вставить значение
таким кодом:
ИмяЛиста
Код: vbnet
1.
ThisWorkbook.Names("Лист2!_test").RefersToRange.Worksheet.Name


Т.е. ты предлагаешь указать явно имя листа, чтобы получить имя листа? Гениально, Холмс! Хлопаю стоя!

Не вижу смысла дальнейшего обсуждения с человеком, который сам уже не понимает что предлагает, но хочет выглядеть офигенным знатоком.
...
Рейтинг: 0 / 0
08.12.2016, 17:50
    #39362846
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
так вроде бы все работает

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
                Dim sheetName As String: sheetName = Range(RangeName).Worksheet.Name
                
                Dim wbSheet As Worksheet
                
                If (Len(sheetName) > 0) Then
                    Set wbSheet = Worksheets(sheetName)
                    With wbSheet
                        .Range(RangeName).Value = strValue  ' вставляем значение
                        .Range(RangeName).Formula = .Range(RangeName).Formula  ' хак, чтобы цифры стали цифрами
                    End With
                    
                End If
...
Рейтинг: 0 / 0
08.12.2016, 18:01
    #39362856
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
RegisteredUser,

опять же - если имя создано с областью действия на конкретном листе, то строка
Код: vbnet
1.
Range(RangeName).Worksheet.Name


выдаст ошибку, если вызвана не с того листа, областью действия которого ограничено имя...
Т.к. нет других случаев, когда для имени надо указывать конкретный лист. Во всех остальных случаях(если область действия имени Книга) - имя корректно может быть вызвано из любого листа книги, в котором создано и ему может быть присвоено значение. Если применить код неизвестного(ИмяЛиста):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Sub asdasdasd()
Dim n As Name

    For Each n In ThisWorkbook.Names
        Debug.Print n.RefersToRange.Worksheet.Name
    Next n

End Sub


то мы получим имена листов, да. Но сравнивать с именем из схемы будет чуть проблематично, т.к. надо учесть озвученный им же факт - если имя создано с областью действия на конкретном листе, то имя имени содержит имя самого листа("Лист2!_test"), что не дает делать однозначную простую проверку вроде If n.Name = "rgKr" Then. Поэтому я и привел код с циклом по листам, как наиболее простой в понимании и реализации, хоть может быть и не оптимален по скорости(не проверял).
...
Рейтинг: 0 / 0
08.12.2016, 18:07
    #39362864
ИмяЛиста
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
RegisteredUser,

На самом деле The_Prist тоже дело говорит, хоть и волнуется немножко.
область действия имени может быть локализована одним листом.
Именно поэтому некоторые имена иногда вызывают ошибку, о которой ты написал.
Однако тут нужно чуть глубже чувствовать проблему, чем The_Prist.
Когда имена ограничивают областью листа, то "одинаковых" имен в книге может быть несколько.
И подход The_Prist может привести к нежелательному результату, а именно к выбору имени не с того листа.
Поэтому нужно либо задавать RangeName в глобальном формате, т.е. с именем листа, если это имя локализовано.
Или принять решение, что для локальных имен нужно присваивать value на всех листах, где это имя встречается.
Во втором случае подойдет цикл от Приста, а в первом range(RangeName) с обработкой ошибки на отсутствие имени.
...
Рейтинг: 0 / 0
08.12.2016, 18:20
    #39362878
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
ИмяЛистаИ подход The_Prist может привести к нежелательному результату, а именно к выбору имени не с того листаЗдесь полностью согласен. Имен может быть столько же, сколько листов + 1. И в данной конкретной ситуации единственное, что можно посоветовать - попробовать иначе подойти к формированию схемы. Это самый верный вариант, на мой взгляд. При условии, что он вообще допустим :)
Все остальное - это некий компромисс, как ни крути.

ИмяЛистахоть и волнуется немножко
никаких волнений. Просто ты как-то уж очень резко мысли выражаешь и делаешь необоснованные выводы относительно знаний оппонента на фоне того, что сам на протяжении нескольких сообщений никак не мог вспомнить тот факт, что для обращения к имени, определенному для конкретного листа, обязательно указание этого самого листа(которого мы не знаем к тому же), если лист этот не является активным. Но именно на это я и заострял внимание, а не на то, что к имени можно обратиться так и сяк...Вот и все.
...
Рейтинг: 0 / 0
09.12.2016, 11:43
    #39363264
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
The_PristRegisteredUser,

опять же - если имя создано с областью действия на конкретном листе, то строка
Код: vbnet
1.
Range(RangeName).Worksheet.Name


выдаст ошибку, если вызвана не с того листа, областью действия которого ограничено имя...
Т.к. нет других случаев, когда для имени надо указывать конкретный лист. Во всех остальных случаях(если область действия имени Книга) - имя корректно может быть вызвано из любого листа книги, в котором создано и ему может быть присвоено значение. Если применить код неизвестного(ИмяЛиста):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Sub asdasdasd()
Dim n As Name

    For Each n In ThisWorkbook.Names
        Debug.Print n.RefersToRange.Worksheet.Name
    Next n

End Sub


то мы получим имена листов, да. Но сравнивать с именем из схемы будет чуть проблематично, т.к. надо учесть озвученный им же факт - если имя создано с областью действия на конкретном листе, то имя имени содержит имя самого листа("Лист2!_test"), что не дает делать однозначную простую проверку вроде If n.Name = "rgKr" Then. Поэтому я и привел код с циклом по листам, как наиболее простой в понимании и реализации, хоть может быть и не оптимален по скорости(не проверял).

да! такая хрень с областью действия действительно имеет место быть.
и я вот так приблизительно и бегал по листам и искал это RangeName.
НО такой подход ИМХО какой-то корявый.
Я именно поэтому и спросил у вселенского разума - мож я че-то не рублю и есть элегантный способ?
...
Рейтинг: 0 / 0
09.12.2016, 16:00
    #39363581
ИмяЛиста
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel: Range и Sheet
RegisteredUser,

Договорись сначала с пользователями.
Либо вы используете глобальные имена, и тогда вообще пофиг, где определено имя. и бегать не нужно.
Либо вы используете локальные имена и договариваетесь, что делать с повторениями имен на разных листах.

По любому, бегать правильно по именам (ThisWorkbook.Names), а не по листам.
Когда бегаешь по листам, то не понятно, локально ли для листа задано имя или глобально для книги.
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel: Range и Sheet / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]