Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / CodeModule или Я торможу страшно! / 12 сообщений из 12, страница 1 из 1
24.07.2009, 15:37:24
    #36108149
Robertino
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CodeModule или Я торможу страшно!
Не, правда, че-то я не пойму.
Помогите разобраться, пожалуйста.
Вот макрос на Excel2000 - VBA.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    Yu = ThisWorkbook.VBProject.VBComponents.Count
    Em = Application.VBE.VBProjects.Count
    For Yy =  1  To Em
       Npp = Application.VBE.VBProjects(Yy).Name
       If Npp = "Personal" Then
          Exit For
       End If
    Next
    For Yy =  1  To Yu
      Ym = ThisWorkbook.VBProject.VBComponents.Item(Yy).Name
      If Ym = "Модуль25" Then
         Exit For
      End If
    Next
    Ee = ThisWorkbook.VBProject.VBComponents.Item(Ym).CodeModule
Последняя строка очень интересная.
"Ee" (по отладчику) возвращает "Модуль25". Именно так - не "object", а чистый "string"(?!)...

В хелпе сказано:авторCodeModule Property

Returns an object representing the code behind the component. Read-only.
Хочу написать
Код: plaintext
Nnn = Ee.CountOfLines
Вылетает ошибка : "Object required"... А в инете есть примеры вроде
Код: plaintext
1.
2.
3.
Y=E.VBE.VBProjects.Item( 1 ).VBComponents.Count
                              '  Получить ссылку на последний элемент коллекции
CM=E.VBE.VBProjects.Item( 1 ).VBComponents.Item(Y).CodeModule;
S=CM.Lines( 1 ,CM.CountOfLines)]
Т.е. CM - вполне даже объект...

Теперь пишу:
Код: plaintext
Ee = ThisWorkbook.VBProject.VBComponents.Item(Ym).CodeModule.Name
И "Ee" все так же возвращает "Модуль25"! И это правильно...
Так где же тот "object", о котором хелп?
...
Рейтинг: 0 / 0
24.07.2009, 16:06:13
    #36108265
qwrqwr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CodeModule или Я торможу страшно!
Robertino, Name - cвойство по-умолчанию для CodeModule
"злой Бил Гейц" сделал его скрытым в обжект браузере - надо сказать ему show hidden - и Вы его увидите
поэтому, когда Вы пишете
Код: plaintext
Ee = ThisWorkbook.VBProject.VBComponents.Item(Ym).CodeModule
- в переменной 'Ee' будет стринг.
А когда:
Код: plaintext
Set Ee = ThisWorkbook.VBProject.VBComponents.Item(Ym).CodeModule
- будет объект CodeModule (как в хелпе)
Но чтобы не ломать голову (хорошо, если над своим кодом, а не над чужим) - обычно переменные декларируют соотв. типом - и ошибок не возникает (или возникают при компиляции).
...
Рейтинг: 0 / 0
24.07.2009, 16:18:10
    #36108301
CodeModule или Я торможу страшно!
Robertino,
object на месте. Значение объектной переменной надо присваивать оператором Set, а не Let (в 99.9999% случаев слово Let опускают, см. хелп). Что происходит сейчас:
переменная Ee не описана - скорее всего не используется Option Explicit, значит Ee в месте первого использования неявно объявляется как Variant;

поскольку используется оператор Let, обращение идёт не к объекту, а к его свойству по умолчанию;

свойством по умолчанию для класса CodeModule является скрытое строковое свойство Name;

в итоге получается вариант строкового подтипа, который не имеет, конечно же, методов или свойств.

Рекомендации:
1) в каждом модуле использовать Option Explicit, использовать опцию Require Variable Declaration;
2) явно описывать переменные;
3) явно типизировать переменные, для чего
4) подключать в диалоге References соответствующие библиотеки типов (в данном случае "Microsoft Visual Basic for Applications Extensibility #.#");
5) активно использовать Object Browser (F2);
6) включить в контекстном меню последнего опцию Show Hidden Members.

Удачи.
...
Рейтинг: 0 / 0
24.07.2009, 16:26:52
    #36108332
CodeModule или Я торможу страшно!
Чёрт, зря старался :)
...
Рейтинг: 0 / 0
24.07.2009, 16:30:43
    #36108351
Robertino
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CodeModule или Я торможу страшно!
13-й квартал,
спасибо, классно!

Вот что значит - пятница... "Закон потерянного дюйма" (Мэрфи) :))
Переписал. Напечатал. Повесил на стенку.
...
Рейтинг: 0 / 0
24.07.2009, 16:33:39
    #36108365
Robertino
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CodeModule или Я торможу страшно!
13-й кварталЧёрт, зря старался :)Е-е-й, в чем дело?! ты о чем? Если обо мне, - так я просто тащусь и таю... Напиши куда, - пришлю мороженого...
...
Рейтинг: 0 / 0
24.07.2009, 16:36:54
    #36108372
qwrqwr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CodeModule или Я торможу страшно!
Robertino, он просто проиграл на кнопке
...
Рейтинг: 0 / 0
24.07.2009, 16:53:18
    #36108422
Robertino
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CodeModule или Я торможу страшно!
Следовал советам 13-го ...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Option Explicit
Private Sub DeleteProcedure()
    Dim Yu, Em, Yy, Npp, Ym, Ec As Integer
    Dim Ee, iVBComponent As Object
    Yu = ThisWorkbook.VBProject.VBComponents.Count
    Em = Application.VBE.VBProjects.Count
    For Yy =  1  To Em
       Npp = Application.VBE.VBProjects(Yy).Name
       If Npp = "Personal" Then
          Exit For
       End If
    Next
    For Yy =  1  To Yu
      Ym = ThisWorkbook.VBProject.VBComponents.Item(Yy).Name
      If Ym = "Модуль25" Then
         Exit For
      End If
    Next
    Set Ee = ThisWorkbook.VBProject.VBComponents.Item(Ym).CodeModule
    With ThisWorkbook.VBProject.VBComponents(Ym) 
    Ec = Ee.CountOfLines
End Sub
[b]
Чего я еще не учел?
Но "Ee" - все также "Module25" !!!
А последняя строка также вылетает с ошибкой...
...
Рейтинг: 0 / 0
24.07.2009, 16:55:37
    #36108428
Robertino
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CodeModule или Я торможу страшно!
В последнем моем посте, конечно, строка с последним With - лишняя, попала по недосмотру. Из текста я ее убрал... Но все остальное - правда :(
...
Рейтинг: 0 / 0
24.07.2009, 16:58:58
    #36108433
qwrqwr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CodeModule или Я торможу страшно!
13-й квартал
Рекомендации:
1) в каждом модуле использовать Option Explicit, использовать опцию Require Variable Declaration;
2) явно описывать переменные;
3) явно типизировать переменные, для чего
4) подключать в диалоге References соответствующие библиотеки типов (в данном случае "Microsoft Visual Basic for Applications Extensibility #.#");
5) активно использовать Object Browser (F2);
6) включить в контекстном меню последнего опцию Show Hidden Members.
RobertinoСледовал советам 13-го...врете!
напишите Dim Ee As CodeModule
ЗЫ "Dim Yu, Em, Yy, Npp, Ym, Ec As Integer" - тут все кроме Ec описано как variant - со всеми вытекающими.
...
Рейтинг: 0 / 0
27.07.2009, 09:35:30
    #36110039
Robertino
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CodeModule или Я торможу страшно!
qwrqwrврете!
напишите Dim Ee As CodeModule
ЗЫ "Dim Yu, Em, Yy, Npp, Ym, Ec As Integer" - тут все кроме Ec описано как variant - со всеми вытекающими.Да уж, соврамши :(
Весьма благодарен за напоминание!

Боюсь показаться занудой, но
Код: plaintext
    Dim Ee As CodeModule
не проходит из-за ошибки компиляции: "User-defined type not definded"...
...
Рейтинг: 0 / 0
27.07.2009, 17:28:02
    #36111679
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CodeModule или Я торможу страшно!
RobertinoБоюсь показаться занудой, но
Код: plaintext
    Dim Ee As CodeModule
не проходит из-за ошибки компиляции: "User-defined type not definded"...Открывай в главном меню VBA: Tools->Refreneces ищи там Microsoft Visual Basic for Application 5.3 Extesibility или Microsoft Visual Basic 6.0 Extesibility, ставь возле нужной библиотеки галочку и все оживет.
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / CodeModule или Я торможу страшно! / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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