Страницы: 1
RSS
Что такое "Me"?
 
Доброго времени суток!!!
Периодически у макросяных гуру встречается неизвестное Me, например, Unload Me или Me.Tab.Color = 255. Об этой штуке гугл ничего внятного не знает. Что это такое, чтобы хоть найти и почитать или дайте сразу ссылку? Буду очень благодарен.
 
Это ссылка на объект, в модуле которого находится макрос.
Unload Me - ссылка на форму
Me.Tab.Color = 255 - ссылка на лист
Хотя "юридически" верное определение, наверное, звучит по другому  :)
Согласие есть продукт при полном непротивлении сторон
 
Форма говорит: не трогайте, это мое :)
 
Ме - принадлежность к родителю. Например, если мы в модуле формы напишем Me.TextBox1, это будет означать, что данный ТекстБокс относится именно к этой форме.
 
Me - обращение к модулю класса как к родителю любого объекта, стоящего на ступень ниже самого модуля. Применяется для модулей классов, коими и являются модули форм, листов и книг.  
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
The_Prist написал: Me -....
Вот именно это я и хотел сказать!  :)
Согласие есть продукт при полном непротивлении сторон
 
Доброе время суток
Цитата
The_Prist написал: Me - обращение к модулю класса как к родителю любого объекта
А вот на это MSDN отвечает несколько по другому.
 
Я бы ещё сказал так: Ме - говорит, что это моё: форма про свои контролы, лист про свои... ))
 
Me.Tab.Color = 255 равносильно Worksheets().Tab.Color = 255 ?
 
Нет. У Вас не указано имя листа.
Если Me.Tab.Color = 255 будет в модуле листа Лист1, то это будет равносильно Worksheets("Лист1").Tab.Color = 255
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Андрей VG написал:
на это MSDN отвечает несколько по другому
не увидел принципиальных различий.
Цитата
Ключевое слово Me предоставляет способ ссылки на отдельный экземпляр класса или структуры, где в текущий момент выполняется код. Ключевое слово Me ведет себя подобно объектной или структурной переменной, ссылающейся на текущий экземпляр
Тут вопрос в чем: после Me нельзя указать объект, стоящий ниже самого класса на две или три ступени. Поэтому применяется такое обращение либо для обращения напрямую к модулю и передачи его куда-то, либо для явного указания объекта-родителя(для удобочитаемости), к свойству или методу которого обращаемся.

По сути запись Me или UserForm1 внутри модуля формы UserForm1 будет равнозначной. Равно как и вообще отсутствие такового...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Для явного указания на этот экземпляр класса. Мы же можем написать собственный класс, который имеет метод принимающий ссылку на объект этого класса и что-то с ним делающий. Этим методом мы можем воздействовать этим методом и на данный экземпляр, вызвав внутри кода другого метода класса его и передав ссылку на сам объект.
Пример с формами прилагаю (хотя он конечно и надуманный - ничего более подходящего в голову не пришло.
Цитата
после Me нельзя указать объект, стоящий ниже самого класса на две или три ступени
Извините, не понял, можно более подробно - что значит ниже?
Изменено: Андрей VG - 03.09.2015 21:51:07
 
Цитата
Андрей VG написал:
звините, не понял, можно более подробно - что значит ниже?
Я лично понял так, что Me.Cell не бывает
 
Цитата
Сергей Беляев написал:
Об этой штуке гугл ничего внятного не знает.
у нас такие разные гуглы?
https://www.google.ru/webhp?client=opera&sourceid=opera#newwindow=1&q=excel+vba+me+keyword
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Ну почему-же: напишите свой класс, свойством объекта своего класса сделайте Cell, и в модуле вашего класса можно использовать Me.Cell. Как-то так
Согласие есть продукт при полном непротивлении сторон
 
Сергей Беляев, что зачит Cell? Или вы имели в виду Cells?
Если вы в коде метода какого-нибудь листа экземпляра Worksheet напишите
Код
1
Me.Cells(1, 1).Value = "чего то там"

то всё прекрасно сработает. В VBA есть некоторая запутанность, связанная с отсутствием наследования. С большинстве языков для уже существующего класса Form, например, вы создаёте дочерний класс от этого Form и уже в нём размещаете все элементы управления, как поля этого класса и инициализируете их.
В VBA - это не возможно, поэтому для некоторых классов для созданного экземпляра такого класса Microsoft предоставила возможность добавлять свои методы и свойства. Хотя и тут тоже запутано. Так, например, UserForm1 с одной стороны экземпляр класса - вы можете его запустить, но можете и создать объект класса UserForm1 и не один, как показано в примере и менять состояние каждого объекта независимо. Например, в выложенном примере можно задать различные заголовки, дописать в конце метода test
Код
1
2
f1.Caption = "Это первая"
f2.Caption = "А это вторая"

Похожий принцип, как с UserForm доступен и для Worksheet и Workbook (добавить методы и свойства, какие-нибудь объекты). Но создать объект этого расширенного класса вы не сможете, как-будто бы запрещено наследование. Просто привыкните и воспринимайте как данность.
 
Андрей, так ведь это никак не расходится с написанным мной :-)

Две ступени, это я так написал. Думал понятнее будет. У каждого объекта есть свойства, методы и объекты. Объекты могут в свою очередь иметь тоже свои свойства и методы. И так далее. И нельзя обратиться к методу объекта, не указав сам объект. Если родительский объект метода не указан, то обращение идет к экземпляру класса, из которого метод вызван(например Sheet это реализовывает). Если такой метод не реализован этим классом - будет ошибка.
Т.е. нельзя обратиться к свойству Cells - Value, не указав сам объект Cells: Sheets(1).Value.
Здесь так же: Me может применяться только к свойствами, методам и объектам, которые реализованы для Me. Для формы, например, Controls. И не получится применить к Me свойство объекта, которое не реализовано этим Me: Me.Value

Цитата
Андрей VG написал:
Для явного указания на этот экземпляр класса
Смотрите. В VBA нет многопоточности. Поэтому совершенно нет необходимости упоминать тот факт, что Me - обращение к экземпляру класса, в котором на данный момент выполняется код. Т.к. код всегда выполняется только в одном классе, без вариантов. Поэтому смело можно говорить, что обращение к тому модулю класса, в котором прописан сам код. Нет смысла морочить голову начинающим глубинами и заумностями. Пусть хотя бы суть будет ясна. А глубины постигнутся позже.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, да пожалуй соглашусь, хотя такая терминология несколько отлична от мне привычной.
 
Цитата
ikki написал: у нас такие разные гуглы?
естественно, обычному человеку в голову такой запрос не пришел бы, тем более не на русском
 
А он и на русском не сильно отличается, хотя конечно смотря какой русский...
 
Когда знаешь что это такое, то можно и искать. Я искал объект и класс объектов.Но ни в жисть не искал бы ключевое слово.
 
Цитата
Когда знаешь что это такое, то можно и искать.
Уже конечно пошёл флуд, и я вас не обвиняю ни в чём - все мы были начинающими, да и не назову себя продвинутым, но. Есть же справка VBA, вызываемая в редакторе VBA. В поиске набираем Me
Получаем результаты поиска, первые две строки keyword - с минимальным английским это переводится как ключевое слово.
Invalid use of Me keyword
Me <keyword>
 
Цитата
Андрей VG написал: Уже конечно пошёл флуд
Если бы я знал англ. язык, меня не было на этом форуме. Первый раз в жизни открыл справку и наверно больше не полезу туда. Вот опять keyword, если бы я открыл ее до ответов, я бы никогда не подумал, что это относится к делу.
 
Цитата
Сергей Беляев написал: ни в жисть не искал бы ключевое слово
такой вариант предложил сам гугл.
я набрал только первые три слова.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Страницы: 1
Читают тему
Loading...