Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Загадочный объект. :) / 9 сообщений из 9, страница 1 из 1
16.08.2009, 14:52
    #36146361
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадочный объект. :)
В Ексел на листе Data1 определена процедура
Код: plaintext
1.
2.
3.
Public Sub GetStData()
debug.print "GetStData"
End Sub
Вызываем ее с другого листа или модуля. Чтобы избежать конфликта имен, делаем это так.
Код: plaintext
1.
2.
Sub aa()
Call Data1.GetStData
End Sub
или так
Код: plaintext
1.
2.
Sub bb()
Call Sheets("Data1").GetStData
End Sub
Но это нас не очень устраивает, и мы делаем так
Код: plaintext
1.
2.
3.
4.
5.
Dim StData1 As Worksheet

Sub cc()
Set StData1 = Sheets("Data1")
Call StData1.GetStData
End Sub
Все. Теперь функционировать перестало.
Но мы делаем так, через Object
Код: plaintext
1.
2.
3.
4.
5.
Dim Stdata2 As Object

Sub dd()
Set StData2 = Sheets("Data1")
Call StData2.GetStData
End Sub
И все опять работает.
Вопрос такой.
Какой-таки объект вызывается выражением
Код: plaintext
1.
Dim Stdata2 As Object
Set StData2 = Sheets("Data1")
???? :)



"Есть многое на свете, друг Горацио, что и не сразу в голову придет."
М. Твен "Приключения Геккельбери Финна"
...
Рейтинг: 0 / 0
16.08.2009, 17:39
    #36146460
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадочный объект. :)
PS
Из справки MS
"Sheets Object
A collection of all the sheets in the specified or active workbook.
Remarks
The Sheets collection can contain Chart or Worksheet objects."

"Есть многое на свете, друг Горацио, что и не сразу в голову придет."
М. Твен "Приключения Геккельбери Финна"
...
Рейтинг: 0 / 0
16.08.2009, 18:57
    #36146497
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадочный объект. :)
При записи Dim StData1 As Worksheet объявляется переменная, имеющая тип конкретного COM-класса Worksheet, который не имеет метода GetStData. Поэтому не работает. Заметь, Sheets.Item тоже имеет тип Object, поэтому работает Sheets("Data1").GetStData.

Jah loves you.
...
Рейтинг: 0 / 0
16.08.2009, 19:51
    #36146536
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадочный объект. :)
Antonariy Заметь, Sheets.Item тоже имеет тип Object, поэтому работает Sheets("Data1").GetStData.

Jah loves you.
Ну не совсем. Sheets.Item("Data1") - ссылка на объект Data1. Worksheet не проходит, хотя "The Sheets collection can contain Chart or Worksheet objects." Ну да бог с ним,-"Dim StData1 As Worksheet - переменная, имеющая тип конкретного COM-класса Worksheet, который не имеет метода GetStData"
Код: plaintext
Call Sheets.Item("GrData1").GetStData
проходит.
Но вот на какой объект в иерархии ссылается
Код: plaintext
1.
Dim Stdata2 As Object
Set StData2 = Sheets("Data1")
Код: plaintext
Dim Stdata2 As ?????
Вопрос, разумеется, чисто методический.
...
Рейтинг: 0 / 0
17.08.2009, 10:09
    #36146991
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадочный объект. :)
YUBAНу не совсем. Sheets.Item("Data1") - ссылка на объект Data1.Нет объекта Data1. Есть объект Worksheet, у которого свойство Name имеет значение "Data1". А так же это значение используется в качестве ключа коллекции Sheets.
YUBAНо вот на какой объект в иерархии ссылается Worksheet

Jah loves you.
...
Рейтинг: 0 / 0
17.08.2009, 21:12
    #36148741
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадочный объект. :)
AntonariyWorksheet

Jah loves you.

Я что-то видимо не понимаю.
1.
Код: plaintext
1.
2.
Sub cc()
Call Sheets("GrData1").GetStData
End Sub
2.
Код: plaintext
1.
2.
3.
Sub ee()
Call Sheets.Item("GrData1").GetStData
Debug.Print Sheets.Item("GrData1").Range("b2")
End Sub
3.
Код: plaintext
1.
2.
3.
4.
5.
Sub ff()
Dim grdat As Worksheet
Set grdat = Sheets.Item("GrData1")
Debug.Print grdat.Range("b2")
Call grdat.GetStData
End Sub
4.
Код: plaintext
1.
2.
3.
4.
Dim Stdata2 As Object
Sub aa()
Set StData1 = Sheets("GrData1")
Call StData1.GetStData
End Sub
Итак, все конструкции ссылаются на один и тот-же объект - worksheet (А на что-же им еще ссылаться, в коллекции ничего кроме него ничего нет по определению). И вести должны себя одинаково. Однако код № 3 не работает. Следовательно ссылка в работающих кодах идет не на Worksheet. Одинаковые объекты должны и вести себя одинаково.
...
Рейтинг: 0 / 0
17.08.2009, 22:40
    #36148843
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадочный объект. :)
Разница в том, что в 1, 2 и 4 используется позднее связывание, а в 3 — раннее. В 3 заранее определено, какими методами будет обладать объект. А при позднем связывании VBA может расширять классы интегрирующего приложения виртуальными методами на стадии интерпретации. Как-то так.

Jah loves you.
...
Рейтинг: 0 / 0
18.08.2009, 12:28
    #36149705
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадочный объект. :)
YUBA,
экземпляр COM-объекта может поддерживать множество интерфейсов, т. е. его можно спросить: "Ты мальчик?", и он "подумает", и скажет "Да", а потом спросить: "Ты девочка?", и он(/-а/-о) тоже скажет "Да". :)

Применительно к конкретному Worksheet-у. В-нулевых, он поддерживает базовые интерфейсы IUnknown и IDispatch (в VBA известный как Object). Во-первых, он поддерживает интерфейс Excel.Worksheet. Во-вторых, он поддерживает интерфейс класса конкретного листа. Те методы/свойства, что пишутся в модуль класса, расширяют именно интерфейс класса конкретного листа, а Worksheet о них не знает. Это один ключевой момент.

Второй ключевой момент, который тоже может вводить в заблуждение, это наличие трёх имен: 1) имя листа (свойство Name у Worksheet и класса листа, ключ элемента коллекции Sheets), 2) имя класса листа, 3) имя скрытой переменной VBA-проекта, ссылающейся на экземпляр листа. Имя 2 и 3 совпадают всегда (насколько я знаю), а имя 1 может как совпадать с именем 2 (и 3), так и нет. Поэтому высказывание Antonariy "Нет объекта Data1. Есть объект Worksheet, у которого свойство Name имеет значение "Data1" может быть как верным, так и нет. Если второе предложение безусловно верно, то вот первое - это бабушка надвое сказала. Точнее, если Call Data1.GetStData компилируется, то бабушка говорит, что всё-таки объект этот есть, но чтобы не полагаться на мнение бабушки, надо смотреть в свойствах класса в редакторе VBA.

Возвращаясь к барану №3, grdat должна быть описана As Имя_класса_листа, чтобы grdat.GetStData компилировалось.
...
Рейтинг: 0 / 0
18.08.2009, 12:46
    #36149759
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадочный объект. :)
Бенедиктто вот первое - это бабушка надвое сказалаА я уже и забыл, что листы являются и классами и объектами. Насчет бабушки — истинная правда


Jah loves you.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Загадочный объект. :) / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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