Всем привет. Как посмотреть уровень расположения именованной ячейки разобрался, а как программно изменить , например , с Worksheet на уровень Workbook, не понимаю. Фрагмент кода:
Код
With iName
Cells(i, 1).Value = .Name
Cells(i, 3).Value = TypeName(.Parent)
' у одних имён Name выводится значение Worksheet, а у других Workbook
End With
Например, нужно изменить уровни Worksheet на уровень Workbook. Как это сделать в vba? Интересует как именно присвоить новое значение Workbook.
поделитесь секретом. Я ни в одной версии Excel не смог этого сделать без макросов...Да и макросами надо сначала запомнить все данных старого имени, удалить прежнее и создать новое с новой областью действия. Иначе почему-то никак не хочет. все остальное можно сменить, а область действия нет.
Здравствуйте, коллеги! Если очень сильно постараться, то можно и без удаления имени листа:
Код
Sub SheetNameToWorkbookName(ByVal sName As Name)
Dim arr
arr = Split(sName.Name, "!")
If UBound(arr) = 1 Then
sName.Name = "Temp_Name_"
ActiveWorkbook.Names.Add arr(1), RefersTo:=sName.RefersTo
sName.Name = arr(1)
End If
End Sub
Вить, есть у объекта Range так же и свойство Worksheet. Но это в случае, если достучаться до этого Range получается. Скорее всего все прозаичнее: область действия диапазона на одном листе, а запуск кода происходит с другого листа(или запуск происходит из кода внутри листа, притом явно не того листа, в котором есть это имя - судя по тексту ошибки так и есть). Других причин ошибки пока не видно.
Цитата
sokol92 написал: Если очень сильно постараться, то можно и без удаления имени листа
как бы...да. Но это все же создание нового имени, а не изменение параметров старого. И при таком подходе - получаем в итоге ДВА имени, вместо ожидаемого одного. Это в какой-то момент может сыграть злую шутку, т.к. будет два имени на одном листе по факту. И если обратиться к такому имени без указания родителя:
Код
range("_name").address
то получим ссылку на имя с областью действия КНИГА, а если с указанием:
Код
worksheets(1).range("_name").address
то получим ссылку на имя с областью действия на этом листе.
ArtemonX написал: Что является родителем для диапазона и как его запросить
нормально Вы запрашиваете его. Можно как Вы через Worksheet, а можно через объект Parent. Проблема в том, что обращаетесь к диапазону не оттуда(или не к тому) - см. мое сообщение #13 от 26 Янв 2020 16:45:39
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Да. В том то и дело. Все именованные ячейки разбросаны по всей книге и мне нужно иметь возможность к разным из них на разных листах обращаться с любого из листов этой книги.
И что хотите от нас-то? Как сделать такое же имя с областью действия книга показали(в этом случае обратиться к имени можно будет из любого листа). Как удалить старое - думаю проблем не возникнет. В чем теперь-то вопрос? Вы не знаете как активировать тот лист, на котором имя, чтобы к нему обратиться? Или в чем?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Sub мяу()
For Each sh In ThisWorkbook.Worksheets
For Each nm In sh.Names
nmName = Mid(nm.Name, InStr(nm.Name, "!") + 1)
nmRF = nm.RefersToR1C1
nm.Delete
ThisWorkbook.Names.Add Name:=nmName, RefersToR1C1:=nmRF
Next
Next
End Sub
приплыли...Так Вам надо цикл по листам для начала делать, чтобы на каждом листе имя проверять. Иначе какой смысл бы Вам вообще менять область действия листа? Логику-то включите
Код
Sub NamesWsToWb()
Dim ws As Worksheet, nn As Name
For Each ws In Worksheets
For Each nn In ws.Names
Call SheetNameToWorkbookName(nn)
Next
Next
End Sub
'чуть изменим код Владимира
Function SheetNameToWorkbookName(nn As Name)
Dim arr
arr = Split(nn.Name, "!")
If UBound(arr) > 0 Then
ActiveWorkbook.Names.Add arr(UBound(arr)), RefersTo:=nn.RefersTo
nn.Delete
End If
End Function
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Михаил, так ведь именно это и не получается, т.к. имя с областью действия на конкретном листе выдаст ошибку при таком обращении. Надо либо указывать без ActiveWorkbook и запускать с того листа, на котором область действия этого имени, либо указывать непосредственно внутри самого имени так же имя листа:
Sub test()
Sheet1.Activate
Debug.Print ActiveWorkbook.Names("tttt").Parent.Name
Sheet2.Activate
Debug.Print ActiveWorkbook.Names("tttt").Parent.Name
End Sub