Elettracompany.com

Компьютерный справочник
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Построение дерева excel

Построение дерева excel

В рамках практического изучения ООП написал набор классов, реализующих построение древовидной структуры любого уровня сложности для VBA. Как вы знаете, сам VBA кроме массивов и коллекций (объект Collection ) в готовом виде ничего более не имеет. Пределом мечтаний на данный момент является внешний компонент Dictionary из библиотеки Microsoft Scripting Runtime. В виду этакой скудности приходится городить конструкты типа Dictionary с элементами в виде других Dictionary , либо изобретать свои классы. Чем я и занялся. Теперь, если вам потребуется выстроить дерево, то вы можете воспользоваться моим готовым решением.

Прошу прощения у новичков — статья не предназначена для начинающих, да вам это и не надо. Поэтому всякие мелочи разжёвывать не буду — нет времени, а те, кому это может пригодиться, способны разобраться по краткому описанию. Относительно сложные или тонкие моменты прокомментированы.

PerfectTree: свойства класса

Моя структура базируется на классе PerfectTree . Данный класс с точки зрения прикладного программиста содержит лишь корень нашего дерева (свойство Root ) и несколько методов, о которых позже. Root – это экземпляр класса Node (узел). Узел Root создаётся одновременно с созданием экземпляра класса PerfectTree . Дальнейший рост дерева идёт от этого корня.

Node: свойства класса

Наше дерево представляет собой некое множество узлов, объединенных друг с другом отношениями родитель – потомки. То есть каждый узел имеет ОДНОГО родителя и может иметь потомков (одного или больше), а может и не иметь. Любой узел имеет следующие свойства:

Чтобы лучше уяснить себе назначение основных свойств узла, поизучайте эту иллюстрацию:

Nodes: свойства класса

Последний имеющийся класс – класс Nodes – представляет из себя просто коллекцию узлов. Они могут быть объединены по какому-то признаку, как, например, коллекция в свойстве Children класса Node объединена по принципу одного родителя, либо вы можете создать коллекцию с произвольными узлами.

PerfectTree: методы класса

Node: методы класса

Nodes: методы класса

Некоторые замечания

Как грамотно прятать внутреннюю кухню ваших объектов?

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

Например, возьмём такое свойство класса Node , как Level . Если вы сделаете так:

То через некоторое время поймёте, что:

У вас нет защиты от дурака. Кто угодно сможет присвоить неправильное значение свойству Level и сломает всю гармонию вашей структуры, которую, вы вообще-то говоря, обязаны защищать, если пишите компоненты для других. Если же вы будете в обработчике Let городить проверку присваиваемого значения на корректность, то получится слишком сложно и, в конце концов, медленно.

Осознав вышесказанное, вы захотите закрыть свойство Level на запись из пользовательских модулей. Ведь действительно, при создании нового узла его Level вычисляется из родительского +1 и у пользователя нет никаких практических причин писать в это свойство. Но как это сделать? Вы в начале наивно используете директиву Friend, но она вам никак не поможет с этой проблемой.

Тогда вы уберёте обработчик Property Let вообще. И через 5 минут столкнётесь с проблемой, что непонятно, как инициировать поле pLevel при создании нового экземпляра объекта Node . «C хрена ли?» — скажете вы. Объясняю: у вас есть родительский Node . Находясь в нём, вы вызываете метод CreateChild , в котором создаёте новый экземпляр класса Node . Но вы не можете передать туда информацию. Вы можете менять только Public или Friend свойства, открытые на запись! А мы как раз хотим от них избавиться. WTF?

Я нигде не нашёл источников информации, где об этом чётко и ясно было бы рассказано. Я спросил на форумах. И нашёлся хороший человек (спасибо KSV), который набросал пример, но я этот пример осознавал крайне долго. И вот этот механизм я вам намерен разжевать подробно.

Интерфейс класса

первое, что необходимо сделать, это объявить класс-предок или класс-интерфейс. В нём мы объявляем пустое публичное свойство Let — то есть именно то свойство, которое мы хотели бы скрыть в реализации класса Node.

Далее при объявлении наших основных классов, в частности Node, мы должны сослаться на наш интерфейс:

Ну и сам механизм, ради которого всё это затевалось:

Почему мы имеем право присвоить переменной TempINode значение CreateChild ? Не смотря на то, что это переменные разных классов, класс Node — потомок класса INode , поэтому мы можем переменной родительского класса присвоить ссылку на экземпляр класса-потомка. Наоборот нельзя.

Далее мы помним, что свойство Level в классе Inode объявлено публичным, поэтому мы легко меняем его, но поскульку в TempINode у нас экземпляр класса Node , то фактически мы меняем свойство pLevel переменной CreateChild . Вот и всё.

Если вы полезете в код моих классов, то именно этого примера вы не найдёте, но обнаружите массу свойств и методов, которые объявлены в INode , и, используя описанный выше механизм,

Резюмирую: мы смогли избавиться от метода Let Level на уровне класса Node . Теперь никто не сможет нарушить целостность вашей структуры за счёт присвоения Level -у неправильного значения, а вы избавлены от утомительных проверок. Таким образом всё, что мы хотим спрятать пробрасывается через класс-предок INode . Пользователи не будут создавать экземпляры INode , поэтому нам наплевать, что там «намусорено», нам важно, что всё, что мы хотели скрыть или закрыть на запись, скрыто и закрыто.

Конвееры

Обратите внимание, как удобно использовать коллекции Nodes . Дело в том, что многие методы класса Nodes возвращают тоже экземпляры класса Nodes, поэтому вы можете формировать конвеер из методов и получить в конце то, что вам нужно:

Скачать PerfectTree

Файл XLSM (версия 0.20 от 22.05.2017)

ZIP архив с CLS файлами (для импорта классов в ваш файл)

Принимаются заявки на исправление ошибок и реализацию новой функциональности.

История изменений

Версия 0.19 от 19.05.2017. Первая опубликованная версия.

Версия 0.20 от 22.05.2017. Исправлены ошибки в Node.CreateChild, в Nodes.FilterByName. На отладочную печать теперь выводится Payload. Добавлены методы Nodes.GetArrayOfPayload, Nodes.GetArrayDistinctName.

Версия 0.21 от 23.05.2017. Пересобрал проект из-за непонятных багов в 0.20.

Приехали.

К моему глубокому огорчению, данное решение работает нестабильно. При запуске файла, если нажать кнопку «Создать дерево» на листе Data, то вы скорее всего получите ошибку Type mismatch или произойдёт крах Excel. При этом я почти на 99% уверен, что ошибок в коде нет. Если войти в IDE и начать делать ничего не значащие изменения, перекомпиляции, то код начинает работать. Всё это происходит скорее всего из-за ошибок в реализации ООП в MS Office. Если кто-то сможет мне указать на работающие способы заставить классы работать без существенной переделки архитектуры классов (например, я категорически не хочу отказываться от интерфейсных классов), то буду очень признателен, но что-то мне подсказывает, что этого не случится.

Читать еще:  Загрузка excel в mysql

Построение дерева excel

Надстройка «Дерево решений»

Надстройка MS Excel «Дерево решений» предназначена для построения и анализа древа решений и событий для ситуаций неопределенности и риска.

Древо решений и событий строится в обычном листе Excel. При построении автоматически добавляются стандартные формулы для выбора, оценки среднеожидаемого результата и расчета вероятности.

Основная версия надстройки работает в 32-bit и 64-bit версиях MS Excel начиная с MS Office 2007. Более старые версии MS Excel не поддерживаются.

Рабочий лист с построенным деревом решений форматируется специальным образом, но остается обычным листом Excel и после построения дерева может свободно редактироваться.

Файл надстройки имеет название: «Decision Tree уу. mm. xlam» (в зависимости от версии) и может либо запускаться как обычный файл MS Excel (при этом нужно согласиться с запуском макросов надстройки), либо подключаться автоматически как любая надстройка (для этого нужно записать файл в папку надстроек MS Excel C:UsersПользовательAppDataRoamingMicrosoftAddIns). После запуска появляется новый пункт в меню Excel «Дерево решений».

Для принятия решений в ситуации неопределенности широко используется метод «таблиц выигрышей и потерь». Однако в сложных случаях приходится выбирать между альтернативами, каждая из которых представляет собой «многошаговый» процесс принятия решений. Такие шаги могут быть разнесены во времени, на каждом шаге может возникать новый набор альтернатив и сценариев будущего, усложняется расчет вероятностей различных событий.

В этом случае визуализировать процесс выбора из рассматриваемых альтернатив удобно с помощью схемы или графа, называемых деревом (древом) решений. Дерево решений — это необходимый инструмент при стратегическом планировании и инвестиционном анализе.

Краткая справка к надстройке

(смотрите актуальную версию справки в меню надстройки)

Начало работы.

Дерево решений строится с помощью команд интерфейсного окна надстройки. Это окно может быть закрыто и открыто снова для продолжения работы на любом этапе построения дерева решений.

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

Поэтому все изменения дерева, за исключением добавления численных данных и расчетных формул, нужно делать только через интерфейс надстройки (. ).

1. Начинать построение дерева нужно кнопкой «Создать дерево», по нажатии которой будет создана новая страница со стандартным началом дерева («стволом»). Ствол (начало дерева) показан коричневой линией. Красная звездочка здесь и далее — возможная точка «роста» дерева, т. к. в ячейку, содержащую звездочку, можно вставить продолжение дерева. Часть ячеек скрыта, чтобы не отягощать схему служебной информации.

2. Чтобы продолжить конструирование дерева решений нужно определиться, из скольких вариантов действий придется выбирать главное решение. Число вариантов указывается в окне «Количество ветвей» с помощью стрелок большеменьше справа от окна. Невозможные варианты числа ветвей блокированы. По умолчанию в панели «Добавить развилку» событий отмечен пункт «Выбор решения», означающий, что решение можно выбрать из определенного числа вариантов. Если оставить число ветвей равным 2 и нажать кнопку «Добавить дерево» прирастет развилкой зеленого цвета с комментарием Решение 1, 2. В каждой из двух появившихся звездочек дерево может быть продолжено.

В корневой ячейке развилки автоматически записывается формула =МАКС(L2:L6), с помощью которой позднее будет сделан выбор, какое из решений наиболее привлекательно.

Иногда дерево может начинаться развилкой «Варианты будущего». В этом случае решение выбрать нельзя — тут с определенной вероятностью и независимо от вашей воли реализуется одно из возможных будущих. Но в подавляющем большинстве случаев развилкой «Варианты будущего» дерево в какой-то момент продолжается, что и реализует наше неполное знание о будущем.

Для того, чтобы вставить такую развилку нужно щелкнуть мышкой радиокнопку «Варианты будущего», выбрать число ветвей (допустим, 3), выделить (щелкнуть мышкой) одну из ячеек со звездочкой и нажать кнопку «Добавить». В результате к дереву решений добавится развилка оранжевого цвета с тремя ветками и дополнительной информацией о вероятности каждой ветви.

Автоматически сгенерированная формула =СУММПРОИЗВ(N2:N4;Q2:Q4) позволяет оценить средневзвешенный результат для этой вероятностной развилки событий.

Манипуляции с деревом решений.

1. Команды Undo и Redo. Две кнопки со стрелками в панели «Операции» в левом нижнем углу окна интерфейса служат для отката последних изменений или возврата к более новой версии дерева. Следует иметь ввиду, что встроенный в MS Excel механизм UndoRedo не поддерживает изменения, которые делают надстройки. Поэтому при работе надстройки возникают два независимых набора последних изменений: версия Excel и версия надстройки «Дерево решений». Если требуется откатить назад изменения, сделанные вне интерфейса надстройки, следует пользоваться меню Правка — ОтменитьПовторить. Состояние дерева решений после каждой операции через интерфейс надстройки так же запоминается и может быть возвращено. Однако при этом будут потеряны изменения, сделанные вне интерфейса после последней операции. К сожалению, это может запутать пользователя при возврате больше чем на один-два шага.

После закрытия окна интерфейса история операций уничтожается, даже если сам файл остается открытым.

2. Команда «Удалить» панели «Продолжение дерева от узла». С помощью этой кнопки можно удалить все продолжение дерева со всеми разветвлениями начиная от выделенного узла. Если выделена ячейка, не являющаяся узлом дерева, никакой реакции не последует.

3. Команды «Копировать» и «Вставить» панели «Продолжение дерева от узла». Если выделить ячейку с узлом дерева и нажать кнопку «Копировать», все продолжение дерева от заданного узла и до конца ветвей скопируется в специальный буфер. Скопированное продолжение дерева решений можно вставить в любую ячейку со звездочкой. Это удобно, когда часть дерева нужно повторить в другом месте. Копия сохраняется до тех пор, пока не последует другая команда «Копировать».

4. Команда «Выровнять» панели «Дерево».

Если дерево решений построено, но концы ветвей оказываются в разных столбцах бывает удобно выровнять их для лучшего представления дерева.

Для этого можно использовать команду «Выровнять». При нажатии этой кнопки все открытые ветви дерева доращиваются до самой длинной ветки путем добавлений одиночных веток, повторяющих предшествующую информацию.

Такую одиночную ветку можно вставить и добавляя «развилку».

5. С помощью операции «Добавить» панели «Добавить развилку событий» можно вставить дополнительную развилку в существующий узел дерева решений, если в результате анализа дерева нужно, скажем, предоставить дополнительную возможность выбора. Для этого следует выделить узел дерева (например, L2), задать тип узла и количество ветвей и нажать кнопку «Добавить». Старое продолжение дерева решений от текущего узла будет перенесено в конец первой ветки вновь вставленного узла Q2.

Читать еще:  Как делать консолидацию в excel

Переменные и вычисления.

Для расчетов по дереву решений используются данные, отражаемые в дереве под именем «Переменные». По умолчанию (по соображениям техники программирования) в дереве используется одна переменная (столбец озаглавлен «_1»).

1. Число переменных можно изменить с помощью панели «Переменные».

Если установить с помощью стрелки вверх у окна числа переменных величину 3 и нажать расположенную тут же кнопку «Добавить», число переменных увеличится на 3 (не забудьте отметить кнопку «Показать», иначе никаких изменений не увидите).

Если нужно уменьшить количество переменных, следует стрелкой вниз выбрать отрицательное число, показывающее, сколько переменных нужно ликвидировать. При этом надпись на кнопке измениться на «Удалить». Так как меньше одной переменной оставить нельзя, при выборе невозможного уменьшения окно подсвечивается розовым, а кнопка «ДобавитьУдалить» деактивируется.

Изменить количество переменных можно на любой стадии работы с деревом решений.

2. После завершения ввода данных или на этапе построения дерева бывает удобно видеть дерево в возможно более компактном виде. Для этого используют команду «Скрыть» переменные. При этом к столбцам, содержащим переменные, применяется команда Excel «Скрыть столбцы». Кнопка «Показать» возвращает столбцам с переменными видимость.

3. При вводе значений переменных достаточно записать их в той развилке, после которой значения переменных становятся определенными. В более поздних развилках введенные значения переменных будут воспроизведены автоматически, так как ячейки переменных содержат формулы-ссылки на предшествующую ветвь.

4. В завершенном дереве решений все оконечные звездочки всех веток должны быть заменены на численные значения или формулы, рассчитывающие эти значения по переменным. Это — плоды (иногда нелогично говорят — листья) дерева, т.е. численные (финансовые) характеристики ситуаций, к которым привели описанные в дереве цепочки событий.

Замечание. В узлах «Выбор решения» записана формула =МАКС(. ), выбирающая наибольшее значение в следующих узлах данной развилки. Очевидно, это правильно только если чем больше, тем лучше. Если лучшим является минимальное значение, следует заменить формулы =МАКС(. ) на =МИН(. ) (это можно сделать и через меню «ПравкаЗаменить»).

Создание дерева в Excel

У меня есть некоторые данные на листе Excel, который представляет собой иерархию. Поскольку дерево большое и просмотр данных становится довольно сложной задачей, я пытаюсь создать графическое представление дерева. Excel, похоже,не имеет встроенной поддержки для генерации дерева. Каков был бы лучший способ создать дерево из Excel? Есть ли доступные дополнения?

Будут также приветствоваться предложения, связанные с формированием дерева с использованием других инструментов. (Я уже пробовал вариант организационной диаграммы в Visio. По какой-то причине он не смог открыть файл Excel.)

3 Ответа

Возможно, вы могли бы использовать управление Excel Treeview в useform, вы можете найти отличный учебник здесь . я никогда не использовал его лично, хотя.

Похоже, что VisualStudio 2010 позволяет вам делать вещи немного умнее : вы можете посмотреть здесь . Но я не знаю достаточно этой части MS,чтобы помочь вам на этом пути.

И все же эта тема обсуждалась на другом форуме , указывающем на другие сторонние инструменты.

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

Я предлагаю использовать надстройку Funfun Excel, которая позволяет использовать JavaScript непосредственно в Excel. Имея возможность использовать JavaScript, вы можете использовать мощные библиотеки, такие как D3.js или HighChart.js, чтобы нарисовать древовидную диаграмму было намного проще.

Вот два примера генерации деревьев в Excel.

Я использовал D3.js в первом примере и Hightchats.js во втором примере. Я сделал эти два примера в онлайн-редакторе Funfun, а затем связал их с моим Excel. Вы можете проверить код по ссылкам ниже.

Вот что вам нужно сделать, чтобы связать эти образцы с вашим Excel.

1). Вставить норм надстройки надстройки Office магазин

2). Создание новых норм или загрузить образец с норм онлайн редактор.

3) получайте удовольствие 🙂

Раскрытие: я являюсь разработчиком норм

Я использовал контроль ActiveX Treeview на Excel листах, и это нормально. HOWEVER, в зависимости от вашей версии Windows и имеющихся обновлений безопасности, он может работать или не работать. Я разработал приложение, используя один из них, для крупного городского банка, но нам пришлось полностью переделать его, когда некоторые обновления были применены в масштабах всей компании. После очень долгого и бесполезного обсуждения с Microsoft в US году мы вообще ничего не добились. Если вы загуглите «excel treeview security upgrades», вы найдете различные обсуждения. Я предлагаю использовать 3-ю сторону,хотя и не могу предложить ее.

Похожие вопросы:

Я только что потратил значительное количество времени на создание идентичных графиков в нескольких десятках файлов excel (все они содержат идентично отформатированные данные) и считаю, что должен.

Существуют ли какие-либо хорошие библиотеки PHP для экспорта данных в файлы Excel (а не в файлы CSV)? (Альтернативой было бы создание веб-службы ASP.NET, которая обрабатывает генерацию файлов Excel.

Я использую win32com для изменения таблицы Excel (как читать, так и редактировать одновременно) я знаю, что есть другие модули, которые могут делать одно или другое, но для приложения, которое я.

У меня есть веб-приложение, в котором я использую элемент управления asp.net tree view для отображения данных. Нет, я хочу, чтобы эта структура представления дерева была экспортирована в excel. Ниже.

Я рассматриваю создание панели мониторинга в Excel с использованием нескольких ключевых показателей эффективности для построения графика. Данные будут просто собраны с другого листа в Excel. Я.

Я знаю, что этот вопрос может быть тривиальным по-своему, но я пытаюсь создать двоичное дерево из ввода порядка уровней, а затем пройти через него, чтобы представить, что дерево было сохранено в.

Изучение для финала здесь скоро, и мне было интересно, если создание оптимального binary search tree, как задано в вопросе ниже, это то же самое, что создание дерева Хаффмана с учетом символов и.

Я должен создать арифметический вычислитель в Java. Для этого мне нужно разобрать алгебрическое выражение в двоичном дереве, а затем вычислить и вернуть результат. Итак, для первого шага как я могу.

Читать еще:  Как сортировать столбцы в excel

Можно ли создать таблицу excel на основе дерева папок, включая его подкаталоги и имена файлов? Есть ли у них способ сделать это с самим excel или есть программа, которая делает это возможным?

Я использую apache poi создание excel. Я хочу создать структуру, показанную на рисунке выше. Я не знаю, как настроить в соответствии с изображением.

Как в Excel сделать блок-схему

Когда нужно проконтролировать некоторые задачи, как нельзя кстати будут знания о том, как в Excel сделать блок-схему. Применяется этот навык зачастую в офисных условиях. В этой статье мы на личном примере рассмотрим, как выполнить «дерево решений» возможными методами.

Особенности создания блок-схем в электронных документах

Прежде чем возьметесь за составление блок-схем, вам необходимо организовать специальный план, в котором важно прописать все названия блоков и форм с записями категорий. Сегодня будем составлять схему в Excel на примере структуры сайта.

  1. В первую очередь воспользуемся инструментами вставки и создадим схему самостоятельно, в которой пропишем все необходимые данные. Для этого переходим во вкладку «Вставка», находим пункт «Фигуры» и выбираем в выпадающем меню «Блок-Схема».

  1. Здесь смотрите любую понравившуюся или соответствующую схему по требованиям. Выбираем форму и переносим ее на лист Excel. Далее производим построение или такими же фигурами или задействуйте другие.

  1. Для того, чтобы привести одно действие к другому, нам необходимо установить стрелки в правильном направлении. Переходим во вкладку «Формат», выбираем блок «Вставка фигур», в котором отмечаем любую из стрелок.

Все стрелки и фигуры в блоке имеют одностороннее направление. Чтобы изменить расположение фигуры, необходимо его развернуть при помощи круглой стрелочки, которая присутствует над каждой взятой формой.

  1. Создаем схему полностью при помощи предложенных инструментов. Когда все готово, отформатируем ее по размерам.

  1. Теперь добавим текст к каждой фигуре. Чтобы это сделать, выполните следующее: кликните правой кнопкой мыши по необходимой фигуре, затем в выпадающем списке выберите «Изменить текст».

Аналогичным образом вставляем подписи для каждой отдельной фигуры. После проделанных действий вы можете форматировать существующий текст: поменять его размер или шрифт. Таким образом, получите самостоятельно построенную блок-схему с индивидуальными размерами и параметрами.

Как построить блок схему при помощи SmartArt

Если необходимо выполнить оперативное построение схемы в Excel, можно пользоваться встроенным инструментом. Чтобы его активировать, выполните следующий пошаговый алгоритм.

  1. Перейдите в документе Excel во вкладку «Вставка», где найдите зеленую иконку с подписью «SmartArt» в блоке Иллюстрации.

  1. Перед вами открывается окно, в котором необходимо выбрать приглянувшийся вариант оформления схемы. Самый идеальный из типов «Иерархия». Кликаем на объект и нажимаем кнопку «Ок».

  1. Схема появится на середине листа, вам остается добавить необходимую текстовую информацию в рядом всплывшее окошко.

Таким образом вы подпишите каждый блок. После этого можете менять стили и цвет оформления, а также дополнять используя собственный дизайн. Вторым способом пользоваться гораздо проще, ведь объект создается автоматически, пользователю нужно лишь задать определенные параметры.
Инструкцию о других многочисленных функциях Excel вы найдете здесь.

PROИТ

Office 365, AD, Active Directory, Sharepoint, C#, Powershell. Технические статьи и заметки.

Access: построение дерева разделов — TreeView и VBA

Дано: База данных Access 2016 с таблицей, где перечислены разделы (подразделения или другие данные, которые можно представить в виде иерархии).
Задача: на Access-форме построить иерархическое дерево на базе указанной выше таблице.

Допустим имеется таблица подразделений вуза (tblDepartment) в формате:
intID — strDepartmentName — intParentID
Где,
intID — идентификатор подразделения,
strDepartmentName — наименование подразделения,
intParentID — идентификатор родительского подразделения.

Корневой элемент будет ссылаться в качестве «родителя» на самого себя.
Также для удобства в конструкторе таблицы в поле родителя можно задать подстановку, ссылаясь на эту же таблицу:

Текст запроса для подстановки:

После этого в колонке родителя мы сможем выбирать не идентификатору, а по имени подразделения (но в колонке будет по-прежнему храниться идентификатор).

В итоге мы сможем заполнять таблицу следующим образом:

Теперь построим дерево. Для этого создаем пустую форму в режиме конструктора и выберем пункт «Элементы ActiveX»:

В списке выбираем элемент «Microsoft TreeView Control (6.0)»

Выбранный элемент добавляем на форму в нужном месте нужного размера:

Далее переходим в режим кода Visual Basic и добавляем следующий код:

Сохраняем код и форму. Теперь можно запускать форму в режиме просмотра. Должно отобразиться дерево:

Если возникает ошибка: User-defined type not defined (на строке кода ADODB.Recordset), то в VBA в меню Tools — References нужно добавить компонент Microsoft ActiveX Data Objects:

И после этого сделать компиляцию — Debug — Compile.

Как вариант можно использовать таблицу, расположенную в базе на MS SQL Server. Для этого достаточно создать связь с таблицами. Все остальные действия по построению дерева будет аналогичны. В этом случае также возможен обход дерева на стороне MS SQL Server.

9 комментариев :

Этот комментарий был удален автором.

Чтобы работало с node, где родители null

Option Compare Database

Private Sub Form_Load()
Dim strRoot
strRoot = «»

Private Sub AddNode(ByVal ParentID As String)
Set rsCommon = New ADODB.Recordset

If ParentID = «» Then
rsCommon.Open «SELECT Êîä, Ðîäèòåëü, Èìÿ FROM Req DP WHERE IsNull(Ðîäèòåëü)» & » ORDER BY Èìÿ», CurrentProject.Connection, adOpenKeyset, adLockOptimistic

Do While Not rsCommon.EOF
TreeViewDep.Nodes.Add , , Str(rsCommon(«Êîä»)) & «$KEY», rsCommon(«Èìÿ»)
TreeViewDep.Nodes.Item(Str(rsCommon(«Êîä»)) & «$KEY»).Expanded = True
AddNode (Str(rsCommon(«Êîä»)))
rsCommon.MoveNext
Loop
rsCommon.Close
Set rsCommon = Nothing

Else
rsCommon.Open «SELECT Êîä, Ðîäèòåëü, Èìÿ FROM Req DP WHERE Êîä <> Ðîäèòåëü AND Ðîäèòåëü = » & ParentID & » ORDER BY Èìÿ», CurrentProject.Connection, adOpenKeyset, adLockOptimistic

Do While Not rsCommon.EOF
TreeViewDep.Nodes.Add ParentID & «$KEY», tvwChild, Str(rsCommon(«Êîä»)) & «$KEY», rsCommon(«Èìÿ»)
TreeViewDep.Nodes.Item(Str(rsCommon(«Êîä»)) & «$KEY»).Expanded = True
AddNode (Str(rsCommon(«Êîä»)))
rsCommon.MoveNext
Loop
rsCommon.Close
Set rsCommon = Nothing
End If

Здравствуйте. Дорос уже до наполнения дерева по частям. Т.к. элементов несколько тысяч, то построение дерева занимает ощутимое время. Теперь я подгружаю ветку по клику на элемент. Вопрос: как вывести возле элемента значок «+» ? А то неудобно — пока не кликнул, не знаешь есть у этого элемента дочерние позиции или нет

Давно не работала с этим контролом. Может как вариант выводить у каждого элемента в скобках количество дочерних элементов? Или подгружать до клика на элементе хотя бы один его дочерний элемент?

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

Ссылка на основную публикацию
Adblock
detector