powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel Range Name vs Names
7 сообщений из 7, страница 1 из 1
Excel Range Name vs Names
    #32681551
Ёксельман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, хочу заполнять _именнованные_ (имеющие юзерские имена) ячейки в шаблоне Excel (из некоего набора rst)
пишу цикл вида
Код: plaintext
1.
2.
3.
4.
5.
6.
on error resume next
       For i =  0  To rst.Fields.count
            sName = rst.Fields(i).Name
            Set xlR = xlS.Range(sName & sSuf)
            If Not xlR Is Nothing Then
 'тут надо бы еще проверить имя ячейки 
            xlR = rst.Fields(i)  
заполняет, ля, но судя по всему заполняет и при некоторых других совпадениях строки sName (т.е. не только с "юзерским именем" sName, но и в иных случаях - видимо при совпадении sName с допустимой видом ссылки на ячейки).

как быть?
понял только, что при наличии у Range пользовательских имен, срабатывает
xlR.Name
причем возвращает оно ссылку (т.е)
xlR.Name.Value
имя же (какое, если несколько - ведь коллекция Names у Range не определена) возвращает
xlR.Name.Name

Код: plaintext
1.
2.
3.
?xlS.Range("$AH$33").Name.Value
=стр1!$AH$ 33 
?xlS.Range("$AH$33").Name.Name
InvNUM
при отсутствии пользовательских имен xlR.Name вызывает ошибку.

Можно ли упростить гарантированный вызов диапазона (т.е. Range) именно по имени (а не по ссылкам и прочим прибабахам). (а то, если имен больше одного, как проверить) И как это должно выглядеть?
...
Рейтинг: 0 / 0
Excel Range Name vs Names
    #32682010
Ёксельман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну чё, нет идей?

Пока делаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Function XlPutFrRstByName(xlS As Object, rst As Recordset, Optional sSuf As String) As Boolean
 'xlS - Sheet , Rst - текущая запись 
Dim xlR As Object  '.Range 
Dim sName As String, i   As Long
    If Not (rst.EOF And rst.BOF) Then
        On Error Resume Next
        For i =  0  To rst.Fields.Count -  1 
            sName = rst.Fields(i).Name
            Set xlR = xlS.Range(sName & sSuf)
            If Not xlR Is Nothing Then
                If xlR.Name.Name <> sName & sSuf Then
                     'ошибка при обращении - не именованный диапазон 
                     'или имя<>(ссылка == sName) 
                Else
                    xlR = rst.Fields(i)
                     ' пытаемся отделить имена от ссылок 
                     '.Name=="стр1!$A$33" 
                End If
            End If
        Next i
        Set xlR = Nothing
    End If
    XlPutFrRstByName = True
End Function
где за подавление по безымянному признаку отвечает конструкция
If xlR.Name.Name <> sName ...
но не лежит Хочу прямое обращение именно по имени.

Есть ли туточки эксперты в области объектной модели Ёкселя?
...
Рейтинг: 0 / 0
Excel Range Name vs Names
    #32683423
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЁксельманХочу прямое обращение именно по имени 1. Источник данных, передаваемых в именованные ячейки - рекордсет.
Требуемое имя ячейки - sName.
2. Необходимо сперва определиться, есть ли объект с требуемым именем:
Код: plaintext
1.
Dim objName As Name
Set objName=ActiveWorkbook.Names(sName)
3. Если objName - не Nothing, определить тип объекта-родителя.
4. Если объект-родитель - именованная ЯЧЕЙКА, цель найдена.
...
Рейтинг: 0 / 0
Excel Range Name vs Names
    #32684098
Ёксельман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сиба.

т.е. вместо (у меня):
Код: plaintext
Set xlR = xlS.Range(sName & sSuf)
надо написать
Код: plaintext
Set xlR = xlS.Parent.Names(sName & sSuf)
и это и есть именованный объект (если есть).
(я то искал в Names() листа, а там токмо область печати оказалась)

4. Если объект-родитель - именованный диапазон, цель найдена.[/quot]
...
Рейтинг: 0 / 0
Excel Range Name vs Names
    #32684124
Ёксельман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
поправочка
Код: plaintext
Set xlR = xlS.PARENT.Names(sName & sSuf).RefersToRange
...
Рейтинг: 0 / 0
Excel Range Name vs Names
    #32684188
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запусти следующий код для твоей книги:
Код: plaintext
1.
2.
3.
4.
5.
Sub NN()
Dim N As Name
For Each N In ThisWorkbook.Names
    Debug.Print N.Name
Next N
End Sub
Затем измени ThisWorkbook на ActiveSheet.
Проанализируй результаты.
...
Рейтинг: 0 / 0
Excel Range Name vs Names
    #32684921
~rctkmvfy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор "А ты азартен, Парамоша"
Сиба, нешно.
но из моего вчерашнего видно, что я так приблизительно и сделал

Вернее я дал
?ActiveSheet.Names.Count
и
?ActiveSheet.Parent.Names.Count
а потом полюбопытствовал св-вами некоторых итемов из Names()

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


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