Просто любопытство касаемо [A1]="Hello" в Excel...

Программирование на Visual Basic for Applications
zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Просто любопытство касаемо [A1]="Hello" в Excel...

Сообщение zHackLeX » 11.08.2007 (Сб) 14:26

Доброго времени суток всем экспертам, собсно сабж...
Просто интересно, как это вообще возможно?
Ведь не патчили же язык особым образом специально для excel?
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 11.08.2007 (Сб) 15:12

Не совсем понятно, о чем речь...
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.08.2007 (Сб) 15:31

Почему же, совершенно понятно, о чём речь...
Как точно это сделано, не скажу, но маппится, скорее всего, параметром для Application.Cells(), потому что и само application "необязательное", и cells у него дефолтовый метод.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 11.08.2007 (Сб) 15:57

После ответа GSerg стало понятно, о чем речь.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 13.08.2007 (Пн) 17:19

В отличие от GSerg, мне не совсем ясно о чем речь, но если о том, почему синтаксис [A1] возвращает объект Range, то насколько мне известно, синтаксис [...]

- по своей сути функция
- по свойствам практически полностью идентичен функции Evaluate(), только принимает формулу не в виде текстовой строки.
- скорее всего использует тот же мотор, что и формулы на листе прописанный в Си.
- также как и формулы на листе способен возвращать значения, массивы или ссылки, ср.:
MsgBox [A1].Address
x=[{1,2,3,4}]: msgbox x(4)
MsgBox [A1*2]
- мимоходом: свойство Range, также способно интерпретировать формулы, но только если они возвращают ссылку, напр.:
MsgBox Range("INDEX(A1:A10,5)").Address

Но если вопрос в том, почему значение "Hello" присваивается без указания соответствующей проперти, то GSerg уже практически ответил: у объекта Range проперть по-умолчанию Value
Привет,
KL

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 14.08.2007 (Вт) 16:07

Спасибо за разъяснение)
Специально для екселя [ ] переопределены?
Ведь квадратным скобкам и без того было применение...
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 14.08.2007 (Вт) 17:37

zHackLeX писал(а):Ведь квадратным скобкам и без того было применение...

Три (с половиной) встречных вопроса:

1) Где им было другое применение? В VBA?
2) Какое применение?
3) Можно пример?
Привет,
KL

dormouse
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 140
Зарегистрирован: 10.01.2007 (Ср) 21:58
Откуда: Волжский

Сообщение dormouse » 14.08.2007 (Вт) 17:45

только в акцессе для упоминания длинных имён объектов на русском языке и с пробелами (жуткое сочетание) :shock: :)
VBA, MSA97

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.08.2007 (Вт) 18:23

KL, в VBA они применяются для указания имён, содержащих недопустимые символы (например те же пробелы), либо совпадающих с зарезервированными. Обычно при использовании TLB, в которых заданы такие нехорошие имена.

Пример без TLB:
Код: Выделить всё
Private Enum Sample
    [First Value]
    [1337 v41u3]
    [='"*()]
End Enum
Изображение

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 14.08.2007 (Вт) 18:39

dormouse писал(а):только в акцессе для упоминания длинных имён объектов на русском языке и с пробелами (жуткое сочетание) :shock: :)

А можно взглянуть как это в коде выглядит? А то я в Access лет 10 как не программировал. Помню только, что использовал "brackets" ([]) для имен таблиц при написании "expressions" для Query, SQL и для макросов. Но это, по-моему, для VBA текстовая строка.
Привет,
KL

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.08.2007 (Вт) 18:49

Такой пример прокатит?
Код: Выделить всё
Dim rs As Object
Set rs = CreateObject("ADODB.Recordset")
rs.Fields.Append "1337 f!31d", vbString
rs.Open
rs.AddNew
rs![1337 f!31d] = "привет"
Изображение

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 14.08.2007 (Вт) 18:50

tyomitch писал(а):KL, в VBA они применяются для указания имён, содержащих недопустимые символы (например те же пробелы), либо совпадающих с зарезервированными. Обычно при использовании TLB, в которых заданы такие нехорошие имена.

Пример без TLB:
Код: Выделить всё
Private Enum Sample
    [First Value]
    [1337 v41u3]
    [='"*()]
End Enum

А-ааа! Тады ой! Никогда не приходилось сталкиваться - издержки постоянного программирования в англ. версиях Office :-D Возможно принцип действия здесь тот же, что и [A1], [MyNamedRange], [2+2], [[name.xls]Sheet1!A1] и т.д., но не возьмусь утверждать (???)
Привет,
KL

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 14.08.2007 (Вт) 18:57

tyomitch писал(а):Такой пример прокатит?
Код: Выделить всё
Dim rs As Object
Set rs = CreateObject("ADODB.Recordset")
rs.Fields.Append "1337 f!31d", vbString
rs.Open
rs.AddNew
rs![1337 f!31d] = "привет"


tyomitch, совершенно ясно, что ты пишешь быстрее меня ;-) Мне уже твой первый пример прокатил. Пасип. Но этот хорош тем, что напомнил мне о том, что я сам делал не раз, но как-то даже не сопоставил. Хотя синтаксис здесь заметно отличается.
Привет,
KL

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 16.08.2007 (Чт) 1:24

[[name.xls]Sheet1!A1]

Ужас однако...
(не работал толком в МИФе, поэтому удивляюсь...)
С точки зрения языка - и компилятора - что означает эта инструкция?
Особенность ли это языка, или есть способ ввернуть что-то
такое в VB, в контексте какого-нть класса?
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 16.08.2007 (Чт) 2:55

zHackLeX писал(а):
[[name.xls]Sheet1!A1]

Ужас однако...
(не работал толком в МИФе, поэтому удивляюсь...)
С точки зрения языка - и компилятора - что означает эта инструкция?
Особенность ли это языка, или есть способ ввернуть что-то
такое в VB, в контексте какого-нть класса?

Данная "функция", как ты уже подметил, принадлежит библиотеке Excel. C точки зрения Excel, как я уже сказал, это означает:
Код: Выделить всё
    Evaluate("[name.xls]Sheet1!A1")
    'при этом файл name.xls должен быть открыт

или полнее
Код: Выделить всё
    Application.Evaluate("[name.xls]Sheet1!A1")

т.е. расчет заданной формулы.

Скорее всего в VB надо будет сначала задать объект Excel.Application, а уж потом использовать что-то типа
Код: Выделить всё
    Dim appXL As Excel.Application
    MsgBox appXL.[[name.xls]Sheet1!A1]

хотя я этого и не пробовал :-)
Привет,
KL

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.08.2007 (Чт) 9:24

Я пробовал. Не робит.
Изображение

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 16.08.2007 (Чт) 13:41

tyomitch писал(а):Я пробовал. Не робит.


Я вот попробовал след. код в VBA из-под PowerPoint (VB у меня не установлен), предварительно создав ссылку на библиотеку Excel, и все работает:

Код: Выделить всё
Sub test()
    Dim oXLapp As Excel.Application
    Dim oXLwb As Excel.Workbook
   
    Set oXLapp = CreateObject("Excel.Application")
    Set oXLwb = oXLapp.Workbooks.Open("h:\name.xls")
   
    MsgBox oXLapp.[[name.xls]Sheet1!A1]
   
    oXLwb.Close False
    Set oXLwb = Nothing
    oXLapp.Quit
    Set oXLapp = Nothing
End Sub

(!!!) файл должен быть открыт и в нем должен существовать лист "Sheet1".
Привет,
KL

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.08.2007 (Чт) 13:53

KL писал(а):(!!!) файл должен быть открыт

Ага, я этим от невнимательности пренебрёг :-(

Работает, собственно, даже с таким синтаксисом:
Код: Выделить всё
With Excel.Application
    .Workbooks.Add
    .Visible = True
End With
[A1] = "Hello!"

Проверял из VB6.
Изображение

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 16.08.2007 (Чт) 14:12

tyomitch писал(а):Работает, собственно, даже с таким синтаксисом:
Код: Выделить всё
With Excel.Application
    .Workbooks.Add
    .Visible = True
End With
[A1] = "Hello!"

Проверял из VB6.


Наверное в этом случае по умолчанию берется активное приложение :?
Привет,
KL

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 16.08.2007 (Чт) 18:37

А самому в VB создать класс, к которому можно будет вот так наворачивать в квадратных скобках, можно?
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.08.2007 (Чт) 18:48

Нет. Как минимум, потребуется доработка TLB напильником, чтобы убрать с интерфейса атрибут nonextensible.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 16.08.2007 (Чт) 19:00

Вроде это ему не мешает, в excel'е у интерфейса _Global он то же стоит
Даже dispid -5(кстати, что это значит?) задать можно.
Проблема вроде в том, что у метода lcid-параметр, а вот этого уже бейсик переварить в собственном классе не сможет
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.08.2007 (Чт) 19:40

Ну и при чём тут _Global?
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 16.08.2007 (Чт) 19:42

Ну когда ты пишешь скажем Worksheet.XXX вызываются свойство Worksheet класса _Global а не Application.
Чтото мне подсказывает, что в случае с [a1] то же вызывается метод класса _Global
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 16.08.2007 (Чт) 19:49

GSerg писал(а):само application "необязательное",

То есть "необзяательный" это класс _Global а не Application. Это такой скрытый класс
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.08.2007 (Чт) 20:05

Ага, сдаюсь. Ты прав.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.08.2007 (Чт) 21:27

ANDLL писал(а):Проблема вроде в том, что у метода lcid-параметр, а вот этого уже бейсик переварить в собственном классе не сможет

Кстати, оказалось, что этого и не надо.
Работает и так.
Ура.

-5 -- это DISPID_EVALUATE
Изображение

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 17.08.2007 (Пт) 9:51

Прикольно однако...
Прёт...
Код: Выделить всё
Class Class1
  Attribute Evaluate.VB_UserMemId = -5
  Public Function Evaluate(x As String)
    Evaluate = x
  End Function
End Class

...
Private Sub Form_Load()
    Dim a As Object
    Set a = New Class1
    x = a.[Ag]
    MsgBox x
End Sub
Последний раз редактировалось zHackLeX 17.08.2007 (Пт) 10:04, всего редактировалось 2 раз(а).
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.08.2007 (Пт) 9:59

1) да, что и демонстрируют примеры выше
2) да
Изображение

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 17.08.2007 (Пт) 10:06

Кстати... здесь обязательно писать a.[Ag]
Оператор присоединения With не пашет...
Можно как-то привести к виду "Msgbox [Ag]"?

Потому что мне удалось использовать только As Object...
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

След.

Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 66

    TopList