Страницы: 1 2 След.
RSS
Изменить уровень расположения именованного диапазона с Worksheet на Workbook, макрос
 
Всем привет.
Как посмотреть уровень расположения именованной ячейки разобрался, а как программно изменить , например , с Worksheet на уровень Workbook, не понимаю.
Фрагмент кода:
Код
 With iName
         Cells(i, 1).Value = .Name
         Cells(i, 3).Value = TypeName(.Parent) 
' у одних имён Name выводится значение Worksheet, а у других Workbook
 End With

Например,  нужно изменить уровни Worksheet на уровень Workbook.
Как это сделать в vba? Интересует как именно присвоить новое значение Workbook.
Изменено: ArtemonX - 26.01.2020 14:21:50
 
Определить область, при  надобности , запомнить, удалить , создать в другой области.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
, запомнить, удалить , создать в другой области.
а без удаления нельзя?
Интересует как именно присвоить новое значение Workbook.
 
Цитата
ArtemonX написал:
Интересует как именно присвоить новое значение Workbook.
Определить область, при  надобности , запомнить, удалить , создать в области Workbook.
По вопросам из тем форума, личку не читаю.
 
Цитата
ArtemonX написал:
как именно присвоить новое значение Workbook.
А вы без макроса сие проделать сможете?
 
RAN,  Андрей,  можно.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
можно
поделитесь секретом. Я ни в одной версии Excel не смог этого сделать без макросов...Да и макросами надо сначала запомнить все данных старого имени, удалить прежнее и создать новое с новой областью действия. Иначе почему-то никак не хочет. все остальное можно сменить, а область действия нет.
Изменено: Дмитрий(The_Prist) Щербаков - 26.01.2020 15:07:20
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий, думаю недопонимание
Цитата
ArtemonX написал:
как именно присвоить новое значение Workbook.
я сперва прочел, ак просто добавить.
По вопросам из тем форума, личку не читаю.
 
Здравствуйте, коллеги! Если очень сильно постараться, то можно и без удаления имени листа:

Код
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
Владимир
 
Цитата
RAN написал:
А вы без макроса сие проделать сможете?
ну да
вставка-имя-присвоить...
во первых - их множество таких, что нужно переместить
а во вторых - хочу узнать как через макрос
 
Пытаюсь через удаление. При определении адреса и имени листа  именованной ячейки "д301_к311_сч311_2" выдает ошибку 1004.
Фрагмент кода:
Код
Dim s As String, a As String
s = Range("д301_к311_сч311_2").Address
a = Range("д301_к311_сч311_2").Worksheet.Name

Что здесь неверно?
 
.Worksheet.Name
Для диапазона надо просить не имя листа, а имя родителя.
 
Вить, есть у объекта Range так же и свойство Worksheet. Но это в случае, если достучаться до этого Range получается. Скорее всего все прозаичнее: область действия диапазона на одном листе, а запуск кода происходит с другого листа(или запуск происходит из кода внутри листа, притом явно не того листа, в котором есть это имя - судя по тексту ошибки так и есть). Других причин ошибки пока не видно.
Цитата
sokol92 написал:
Если очень сильно постараться, то можно и без удаления имени листа
как бы...да. Но это все же создание нового имени, а не изменение параметров старого. И при таком подходе - получаем в итоге ДВА имени, вместо ожидаемого одного. Это в какой-то момент может сыграть злую шутку, т.к. будет два имени на одном листе по факту. И если обратиться к такому имени без указания родителя:
Код
range("_name").address
то получим ссылку на имя с областью действия КНИГА, а если с указанием:
Код
worksheets(1).range("_name").address
то получим ссылку на имя с областью действия на этом листе.
Изменено: Дмитрий(The_Prist) Щербаков - 26.01.2020 16:50:18 (дополнил информацию по ошибке)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
vikttur написал:
Для диапазона надо просить не имя листа, а имя родителя.
Что является родителем для диапазона и как его запросить
 
Цитата
ArtemonX написал:
Что является родителем для диапазона и как его запросить
нормально Вы запрашиваете его. Можно как Вы через Worksheet, а можно через объект Parent. Проблема в том, что обращаетесь к диапазону не оттуда(или не к тому) - см. мое сообщение #13 от 26 Янв 2020 16:45:39
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
ArtemonX, извините, в заблуждение ввел.
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
Но это все же создание нового имени, а не изменение параметров старого.
Отвечал на вопрос из #3. Кроме того обидно, если интерактивно можешь сделать, а макросом нет. :)  
Владимир
 
Цитата
sokol92 написал:
интерактивно можешь сделать
Цитата
ArtemonX написал:
вставка-имя-присвоить...
может на картинке сего зверя покажете?
 
Цитата
RAN написал:
может на картинке сего зверя покажете?
я имел в виду не изменить, а через удаление:
вставка-имя-присвоить...- удалить старое имя - назначить новое имя
 
Цитата
Дмитрий(The_Prist) Щербаков написал:  Проблема в том, что обращаетесь к диапазону не оттуда(или не к тому)
Да. В том то и дело. Все именованные ячейки разбросаны по всей книге и мне нужно иметь возможность к разным из них на разных листах обращаться с любого из листов этой книги.
 
Цитата
ArtemonX написал:
В том то и дело
И что хотите от нас-то? Как сделать такое же имя с областью действия книга показали(в этом случае обратиться к имени можно будет из любого листа). Как удалить старое - думаю проблем не возникнет. В чем теперь-то вопрос? Вы не знаете как активировать тот лист, на котором имя, чтобы к нему обратиться? Или в чем?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
цитата - не бездумная копия! [МОДЕРАТОР]

Дело в ошибке -  пост #11
не получается извлечь имя листа и адрес , на котором находится именованная ячейка, по её имени.  
 
Код
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
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
RAN написал:
InStr(nm.Name, "!")
назовем лист2 так: Лист!2
В итоге ошибка в том же месте, что и у Владимира :) т.к. неверно определим само имя. Надо хотя бы InStrRev использовать.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Код
ActiveWorkbook.Names("tttt").Parent.name


ArtemonX,  Может все ж сделаете пример - что есть и что надо
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
ActiveWorkbook.Names("tttt")
Михаил, так ведь именно это и не получается, т.к. имя с областью действия на конкретном листе выдаст ошибку при таком обращении. Надо либо указывать без ActiveWorkbook и запускать с того листа, на котором область действия этого имени, либо указывать непосредственно внутри самого имени так же имя листа:
Код
ActiveWorkbook.Names("Лист1!tttt")
Изменено: Дмитрий(The_Prist) Щербаков - 26.01.2020 18:49:53
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий,
Код
Sub test()
Sheet1.Activate
Debug.Print ActiveWorkbook.Names("tttt").Parent.Name
Sheet2.Activate
Debug.Print ActiveWorkbook.Names("tttt").Parent.Name
End Sub

Sheet1
Sheet1
По вопросам из тем форума, личку не читаю.
 
Дима, ну мы как-бы не макрос на заказ пишем, а информацию для размышления.  :)
 
Цитата
RAN написал:
мы как-бы не макрос на заказ пишем
ну это да. Но вдруг ты это потом на практике применишь. Я ж переживаю  :D  
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1 2 След.
Наверх