powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / CodeModule или Я торможу страшно!
12 сообщений из 12, страница 1 из 1
CodeModule или Я торможу страшно!
    #36108149
Robertino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не, правда, че-то я не пойму.
Помогите разобраться, пожалуйста.
Вот макрос на 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
CodeModule или Я торможу страшно!
    #36108265
Фотография qwrqwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
CodeModule или Я торможу страшно!
    #36108301
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
CodeModule или Я торможу страшно!
    #36108332
Чёрт, зря старался :)
...
Рейтинг: 0 / 0
CodeModule или Я торможу страшно!
    #36108351
Robertino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
13-й квартал,
спасибо, классно!

Вот что значит - пятница... "Закон потерянного дюйма" (Мэрфи) :))
Переписал. Напечатал. Повесил на стенку.
...
Рейтинг: 0 / 0
CodeModule или Я торможу страшно!
    #36108365
Robertino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
13-й кварталЧёрт, зря старался :)Е-е-й, в чем дело?! ты о чем? Если обо мне, - так я просто тащусь и таю... Напиши куда, - пришлю мороженого...
...
Рейтинг: 0 / 0
CodeModule или Я торможу страшно!
    #36108372
Фотография qwrqwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Robertino, он просто проиграл на кнопке
...
Рейтинг: 0 / 0
CodeModule или Я торможу страшно!
    #36108422
Robertino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Следовал советам 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
CodeModule или Я торможу страшно!
    #36108428
Robertino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В последнем моем посте, конечно, строка с последним With - лишняя, попала по недосмотру. Из текста я ее убрал... Но все остальное - правда :(
...
Рейтинг: 0 / 0
CodeModule или Я торможу страшно!
    #36108433
Фотография qwrqwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
CodeModule или Я торможу страшно!
    #36110039
Robertino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
CodeModule или Я торможу страшно!
    #36111679
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / CodeModule или Я торможу страшно!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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