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

Дано:
Приходит мне 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
Excel: Range и Sheet
    #39362670
ИмяЛиста
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
range(RangeName).Worksheet.Name?
...
Рейтинг: 0 / 0
Excel: Range и Sheet
    #39362707
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ИмяЛистаrange(RangeName).Worksheet.Name?
Ай! Спасибо, Айболит!
...
Рейтинг: 0 / 0
Excel: Range и Sheet
    #39362710
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИмяЛиста,

при этом нужен еще и цикл по листам, т.к. невозможно получить ссылку на именованный диапазон в том случае, когда вызов диапазона происходит не из того листа, в котором он создан(задана область действия не книга, а конкретный лист). Нужно что-то вроде:
Код: 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
Excel: Range и Sheet
    #39362712
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
правильнее даже так:
Код: 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
Excel: Range и Sheet
    #39362725
ИмяЛиста
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
The_Pristправильнее даже так:Уж лучше так
Код: sql
1.
ThisWorkbook.Names(RangeName).RefersToRange.Worksheet.name
...
Рейтинг: 0 / 0
Excel: Range и Sheet
    #39362754
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИмяЛистаУж лучше такПопробуйте создать имя с областью действия Лист1 и запустить свой код при активном Лист2.
...
Рейтинг: 0 / 0
Excel: Range и Sheet
    #39362764
ИмяЛиста
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
The_Prist,

Ну, попробовал. Что я должен был увидеть?
...
Рейтинг: 0 / 0
Excel: Range и Sheet
    #39362772
ИмяЛиста
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Excel: Range и Sheet
    #39362781
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИмяЛиста,

то, что если активен не тот лист, которому принадлежит имя, получите ошибку. Уверены, что точно понимаете фразу "область действия имени"?
Вот скрин, не уверен, что точно опишет необходимые для получения ошибки действия. Поэтому в следующем сообщении будет еще и файл.
...
Рейтинг: 0 / 0
Excel: Range и Sheet
    #39362783
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
файл с кодом
...
Рейтинг: 0 / 0
Excel: Range и Sheet
    #39362795
ИмяЛиста
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Excel: Range и Sheet
    #39362799
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИмяЛистау меня работает ;)потому что имя создано с областью действия - Книга . Я об этом и писал. Но как показывает практика, имена имеют место быть не только с этой областью действия. Иногда они создаются с конкретно заданным листом для применения.
...
Рейтинг: 0 / 0
Excel: Range и Sheet
    #39362811
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИмяЛистаи запускай хоть с листа диаграммыБез вопросов, такой код работает без проблем. Только для начала проверь свои предыдущие советы и коды, который у тебя работают с твоими условиями. Я на них отвечал. Хоть один работает на моем файле для имени "_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
Excel: Range и Sheet
    #39362817
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИмяЛистаДобавь такую subТы, видимо, перепутал того, кому это нужно со мной :) Я и без твоих подсказок себе корректный код могу сочинить, который будет работать при любой ситуации. А вот тебя на правильный код пришлось направлять... Так что смайл твой не очень уместен.
...
Рейтинг: 0 / 0
Excel: Range и Sheet
    #39362829
ИмяЛиста
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Excel: Range и Sheet
    #39362844
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИмяЛистаи ты поймешь, как его использовать из любого места
Да, ты мне прям глаза открыл.
ИмяЛистаподучи пока правила именования прежде чем направлятьну да, куда мне до таких глубоких познаний правил именования, как у тебя...
Вспомним автора темы:
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
Excel: Range и Sheet
    #39362846
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так вроде бы все работает

Код: 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
Excel: Range и Sheet
    #39362856
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Excel: Range и Sheet
    #39362864
ИмяЛиста
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RegisteredUser,

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

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

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

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


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