Я написал на VBA несколько классов, реализующих универсальные древовидные структуры. Если вам не хватало возможностей Collection / Dictionary, то, я думаю, вам стоит посмотреть. Писал для себя в качестве развлечения и обучения ООП, причём довольно долго, поэтому вышло крайне добротно (имхо, конечно). Хотелось бы, чтобы кому-то пригодилось. Лежит тут. Спасибо.
Код хороший, всё качественно сделано, но почему бы не использовать объектную модель XML? (в XML похожая объектная модель, плюс, что немаловажно, есть сохранение в файл и чтение из файла) PS: под JSON не говорю, так как по-умолчанию в VBA нет его поддержки, в отличие от XML, коим я и пользуюсь для таких задач.
есть моменты, в которые Ваше творение превзошло TreeView? раз уж было потрачено много времени на написание кода, не затруднит-ли Вас потратить еще полчаса-час на составление сравнения функционала. можно сосредоточится исключительно на преимуществах вашего "дерева" спасибо
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Как-то так. Выявить причину не удалось, особо не разбирался. Excel 2016 x64.
Скрытый текст
Скрытый текст
Имя события проблемы: BEX64 Имя приложения: EXCEL.EXE Версия приложения: 16.0.4288.1000 Отметка времени приложения: 55f82f8e Имя модуля с ошибкой: unknown Версия модуля с ошибкой: 0.0.0.0 Отметка времени модуля с ошибкой: 00000000 Смещение исключения: 0000000000000000 Код исключения: c0000005 Данные исключения: 0000000000000008 Версия ОС: 6.1.7601.2.1.0.256.1 Код языка: 1049
Ігор Гончаренко написал: есть моменты, в которые Ваше творение превзошло TreeView?
Игорь, боюсь сравнивать будем красное и круглое. TreeView насколько я понимаю визуальный компонент, а у меня просто структура данные оптимизированная для программной манипуляции ею. Ближайший аналог - Dictionary.
dsb75, Ваш труд впечатляет, конечно возможностей Collection / Dictionary / NET 2.0 (System.Collections.ArrayList) вполне хватает. Но с целью изучения Вашего кода и самообразования в мире VBA в ближайший проект с удовольствием добавлю класс PerfectTree.
dsb75, добрый день! Если пошагово, ну как пошагово - зубочистка + F8, то выполняет процедуру до конца и без ошибок. Записи в дебаге есть. После нескольких падений экселя пошаговый режим отваливается, выдает ошибку 13 в class_terminate. Может что поломалось во время многочисленних AppCrash. Это так, пища для размышлений.
Вроде бы нашёл источник бед. Кастомная коллеция. Там метод
Код
Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_MemberFlags = "40"
Set NewEnum = colNodes.[_NewEnum]
End Property
должен быть с указанными атрибутами, а они куда-то делись в процессе экспорта/импорта. Вставил 2-х томный архив (из-за лимита 100К).
TSN написал: Ваш труд впечатляет, конечно возможностей Collection / Dictionary / NET 2.0 (System.Collections.ArrayList) вполне хватает. Но с целью изучения Вашего кода и самообразования в мире VBA в ближайший проект с удовольствием добавлю класс PerfectTree.
Я как-то пробовал .NET ArrayList из VBS, но поразила низкая производительность, поэтому более не трогал.
Какая-то печальная ситуация. Работает только при таком раскладе: 1. Скачиваем с сайта XLSM (ссылка в исходном сообщении) 2. Сохраняем в папку, которую ОС не считает потенциально опасной 3. Лезем в свойства файла, на первой вкладке может стоять галочка разблокировки подозрительного содержимого, пришедшего из инета, - разблокируем 4. Открываем файл 5. Открываем и сразу закрываем среду разработки VBA 6. После этого у меня работает так, как должен.
Если пошагово немного пробежаться в коде(F8) потом нажать выполнение макроса до конца(F5) то отрабатывает, если нажимать на кнопку на листе - Error 13, и при попытке посмотреть где ошибка(Debug) - AppCrash.
Обратите внимание, как удобно использовать коллекции Nodes
Код
' а теперь дайте нам потомков корня, содержащих в имене слово File, с детьми и уровнем равным 5
Set MyResultSet = MyRoot.Descendants.FilterByName("File").WithChildren.WithLevel(5)
' по-моему круто и удобно
круто удобно но мы имеем дело с VBA - далеко не самым лучшим языком программирования
тоже как-то пытался такое сделать сделал надоело смотреть на вылеты Excel до ума доводить - кода много надо забил на удобство упростил код, - теперь не одна строка кода, а три. но зато всё четко работает
Excel не очень хорошо обрабатывает подобные конструкции, и вместо вывода ошибки сам вылетает из-за утечки памяти Конечно, велика вероятность, что я что-то не учел в коде, но и Excel, безусловно, кривоват (вылеты Excel говорят именно об ошибках со стороны Microsoft) Так что мой совет, - не мудрить излишне с этими объектами, либо переходить на более адекватную среду разработки
dsb75, Ну, что это такое?! Вы не знаете, что можно свои сообщения ДОПОЛНЯТЬ, а не строчить одно за другим с периодичностью в пару минут? Лень вернуться и дописать?