|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
Уважаемые форумчане! Мне нужна именно Ваша помощь, т.к. многие из Вас сталкиваются с программированием Объясняю все по порядку: В моем проекте Excel есть лист, на котором хранятся справочники с той или иной информацией. Их несколько и структура у них разная. Например, в справочниках городов и улиц есть только код и наименование; в справочниках сотрудников и поставщиков - код, имя фамилия, адрес и куча другой информации, ну и т. д. Эти справочники находятся на одном листе(!), каждый в виде таблицы (ListObject), которая динамически создается и заполняется из БД Access при вызове того или иного справочника. Вызов справочника осуществляется по ссылке, а сами ссылки - в столбце А. Но это только прелюдия. Главная причина, по которой я к Вам обращаюсь - это контролы Каждый справочник требует своей обработки (добавления, редактирования, удаления, поиска записей). В моем проекте это реализовано прямо на листе - сверху таблицы-справочника находятся контролы (элементы управления ActiveX), которые соответствуют полям текущего справочника. Но так как справочники различны по структуре, то и количество полей в них различное, а значит контролы тоже динамически должны убираться и появляться на нужном месте при вызове нужного справочника. Моя просьба о помощи заключается в следующем: я не знаю как работать с группой однотипных контролов, создавать их посредством VBA на рабочем листе, а не на форме (пока только они созданы криво - при помощи команды Вставить на вкладке Разработчик) . Но это мне не совсем подходит, потому что не получается универсальности. Например, количество контролов типа "Label" должно создаваться именно по количеству столбцов таблицы-справочника, а Caption у них соответственно - это название столбца-поля Затем другая проблема: Каждому "Lable" соответствует свой контрол с информацией изтекущей строки таблицы - где-то нужно создать поле, а где-то - выпадающий список. Например, календарь или флажок создать можно основываясь на формате определенного столбца таблицы (если в столбце таблицы хранится дата, то напротив соответствующего "Label" создается календарь). А различить поле или выпадающий список можно только связями между таблицами в БД (например в справочнике Товары есть подстановка категории из справочника КатегорийТовара), однако в таблице Excel этих связей и подстановок не видно - в этом-то и проблема. У Вас наверное возникнет вопрос, а погуглить? Я ищу эту информацию довольно долго и ничего подходящего толком пока не нашла. "Рою носом, грызу гранит..." в книгах, но ничего подходящего пока нет ни на форумах, ни у Уокенбаха. Есть обработка группы, но на форме. А у меня НА ЛИСТЕ. Я % на 30 знаю Excel, а уж о VBA и говорить стыдно но я учусь и развиваюсь. (Оффтоп) . Так вот, на одном из сайтов, т.е. здесь http://www.sql.ru/forum/actualthread.aspx?tid=744303, я набрела на такой ответ Shocker.Pro.Михаил. Создать класс (или структуру), в котором будут ссылки на 11 кнопок, ссылки инициализировать при загрузке формы. Создать свойство (для класса) или процедуру (для структуру), в которой циклом все Visible=False для 11 кнопок. Создать класс с автоматически собираемыми ссылками на контролы всей формы. Объединить их в именованные произвольные пересекающиеся группы контролов с помощью коллекций, сделать пользовательский редактор вхождения контролов в эти группы и хранение результатов в БД или еще где-то. Манипулировать свойствами Visible, Enabled, Value и прочими ништяками сразу именованных групп, не обращаясь к каждому контролу по отдельности. Назначить пользователей, права, раздать права группам, автоматически разрешать доступность контролов определенным пользователям....................................... Все это замечательно, у меня есть такой движок.... Только это все - для больших проектов, ИМХО, автору все это нафих не нужно, вполне обойдется фреймом Этот ответ меня заинтересовал и поэтому я обращаюсь к ВАМ за помощью. Можно ли что-нибудь подобное сотворить и с ActiveX-ми на листе? Я пробовала уже созданные контролы определенного типа собрать в массив и работать с ним, но у меня пока не выходит Также пробовала создавать формы для различных справочников и на них размещать соответсвующие контролы, только мне нужно, чтобы форма высвечивалась без рамки (только рабочая область) и в нужном мне месте, которое я не могу указать: left - top не помогают, не там показывается. А по поводу рамки - нашла вот такой код, но ни тот ни другой код не работает - рамка все равно высвечивается Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
ПОМОГИТЕ МНЕ, ПОЖАЛУЙСТА, РАЗОБРАТЬСЯ С МОЕЙ ПРОБЛЕМОЙ P.S. на другие форумы обращалась, но пока тишина. Прилагаю файлы для ознакомления с все вышеописанным. Заранее СПАСИБО. с уважением, Nika ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2012, 03:51 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
Nika.dnleft - top не помогают, не там показываетсяесли размещаете в UserForm_Initialize - то таки да, не помогают, надо, например, в UserForm_Activate Два приведенных кода делают, в общем, одно и то же - убирают заголовок формы, но не рамку. Есть ли какой-то стиль без рамки не подскажу. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2012, 11:42 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
Nika.dn, Nika.dn, мы в принципе работаем с элементами прямо на листе например несколько тысяч кнопок и сотни списков на одном листе - не проблема каждый элемент - уникален элементы скрыты - но отрисовываются после первого касания мышкой соответствующей ячейки, или отрисовываются все сразу в строке , или предустановленными группами - это как удобнее но .. применяется вдобавок к обычному еще и наш VMX - Виртуальный Многопользовательский EXCEL встроенный в сервер данных ( не ACCESS ) подключается не очень просто работает быстро - даже на очень больших обьемах данных дополнительных макросов и программ не требуется - все уже написано как стандартное ядро на сервере и стандартный макрос на клиентах, но нужны дополнительные специальные VMX-формулы в ячейках EXCEL с единой общей базой данных одновременно могут работать до 500 EXCEL-пользователей по локальной сети или через интернет если заинтересует - sia.enters@inbox.lv ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2012, 13:51 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
Shocker.Pro, MX-9, большое спасибо, что откликнулись. MX-9, Я не совсем поняла, о чем была речь. Поняла, что помимо обычного Microsoft Excel, у Вас есть дополнительный свой VMX, который имеет большие возможности, нежели обычный. Только работаете Вы с определенной СУБД и это не Access (наверное, тоже собственной разработки). Я сначала, в принципе, хотела сделать наподобие Вашего примера: создать контролы, соответствующие столбцам таблицы и скрывать и показывать их по определенному событию. Например, есть поле Наименование (название). Оно основное практически во всех моих справочниках (а их пока 19) и можно было бы создать 19 полей с Name – TextBox1, TextBox2… TextBox19, находящихся на одном и том же месте на листе, скрыть все, кроме текущего, и в нем отображать соответствующую информацию. Названия справочников я сохранила в массив и по индексу элемента массива отображать можно TextBoxN с таким же порядковым номером. И тут пошли проблемы: 1. Не могу переубедить себя в необходимости использования такого количества контролов одного и того же типа, когда можно использовать только один, просто перезаполняя его (динамически) необходимой информацией. 2. Если все таки использовать много контролов, то, как обрабатывать их все, не вызывая процедуру обработки для каждого контрола по отдельности. У Уокенбаха есть пример календаря с кнопками, где он создал класс и в нем процедуру обработки сразу для всех однотипных контролов, но я смутно поняла, как все это работает. Один только .Enable сделать проблематично, не говоря уж об Click() -ах 3. Ещё одна причина, по которой я не знаю, какой способ реализации мне выбрать (использовать один или много контролов) – это то, что в некоторых справочниках то же Наименование может быть текстовым полем, а может и выпадающим списком, в зависимости от ситуации. И тут сложность состоит в том, что определить, какой контрол нужен в данной ситуации можно только за счет связей между таблицами, если есть подстановка внешнего ключа – тогда выпадающий список, если нет – текстовое поле. А в Excel-евской таблице в таких столбцах стоят уже названия, а не коды, как в БД. 4. И потом, если придется создать новый справочник, как под него создать необходимые контролы – только через конструктор? В общем, какой способ реализации я бы сейчас не выбрала, я не знаю как с ним дальше работать! Подскажите мне, пожалуйста, как быть? P.S. Можно, конечно и С# изучить, и Visual Studio Tools for Office (VSTO, Visual Studio Tools для офиса) использовать и его тоже изучить и прекрасно работать с ним в Excel-е, но времени нет и у меня уже база данных есть в Accesse (конечно проблемы нет перегнать ее в SQL-сервер, но я и его знаю плохо – тоже надо учить :) ). Пока меня устраивает тандем Excel-Access. Однако я очень хочу попробовать и Ваш VMX. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 00:39 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
На самом деле, если вы разнесёте ваши справочники в Excel (каждый на отдельный лист) - работа упростится. Если затем скроете листы со справочниками и будете работать с ними через UserForm - еще более упростится. Затем - полУчите аналог работы с Access... Вот и возникает вопрос - а чем вас Access в качестве основного приложения не устраивает, зачем нужна связка? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 01:22 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
AndreTM, все дело в интерфейсе. до этого, на стадии бумажных ручных отчетов, весь учет велся в таблицах, такой себе Excel на бумаге. К нему привыкли и теперь менять интерфейс на Access-овский никто не хочет. Проще говоря, так привыкли, поэтому "родные бумажки" просто должны считаться сами... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 01:59 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
AndreTM, А справочники - это только часть проекта. Весь проект - это товарно-складской учет. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 02:02 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
Nika.dn, похоже что VMX подойдет для Вашей задачи мы вышлем все что надо , но настройка потребует некоторых усилий (и нам надо знать какая у Вас платформа (32-64 бит) и версия MS Office ) кстати, на первых порах, тестирование можно провести на базе нашего VMX-сервера через интернет - Вам тогда потребуется установить только MX ( клиентскую часть VMX ) - меньше заморок с настройкой то есть Вы дистанционно создадите свою тестовую базу данных на нашем VMX-сервере в среде Виртуального EXCEL , а при работе Ваши серверные виртуальные многомерные VMX-листы будут интерактивно отображаться на Ваш реальный клиентский EXCEL и наоборот (со всеми 3000 кнопками и списками :) ============== ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 10:21 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
Shocker.Pro Создать класс с автоматически собираемыми ссылками на контролы всей формы. Объединить их в именованные произвольные пересекающиеся группы контролов с помощью коллекций, сделать пользовательский редактор вхождения контролов в эти группы и хранение результатов в БД или еще где-то. Манипулировать свойствами Visible, Enabled, Value и прочими ништяками сразу именованных групп, не обращаясь к каждому контролу по отдельности. Назначить пользователей, права, раздать права группам, автоматически разрешать доступность контролов определенным пользователям.......................................Все это замечательно, у меня есть такой движок.... Я никогда не работал с динамическими контролами на листе, то есть навскидку не знаю, как их создавать, как к ним обращаться и т.п., хотя, конечно, можно разобраться. С другой стороны, я не понимаю, в чем у вас сложность с созданием групп контролов, а конкретных вопросов вы не задаете. Доброго времени суток, Shocker.Pro. Задаю конкретный вопрос: Как создать группу контролов, хотя бы на форме? Если можно, выложите самый элементарный пример, я сама попробую с ним разобраться, оч. хочется пощупать, как это работает. До того, что выше описано и выделено зеленым цветом, я сама не додумаюсь, Помогите, пожалуйста. Я так думаю, что если есть возможность создавать контролы прямо на листе, то и должна быть возможность с ними работать Я пробовала обращаться к коллекции двумя способами: 1. ActiveSheet.OLEObjects(typeControl).Object, где typeControl - это тип контролов. Но так идет обращение к одному конкретному контролу 2. Еще такая попытка есть Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Вот как-то так. Криво, но попытка не пытка... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 11:16 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
MX-9, Office 2010, OS - windows7 Домашняя расширенная SP1 32-bit ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 11:22 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
Nika.dnКак создать группу контролов, хотя бы на форме?видимо, вы меня не очень поняли. Группа контролов - понятие виртуальное. Это не что-то, поддерживаемое бейсиком. Я сам писал класс, который формирует эти группы. Устроены они примерно так - есть коллекция элементов типа "группа" (пользовательского типа, который я сам и создавал). Каждый элемент содержит название группы и какие-то признаки (например Enabled), а также вложенную коллекцию ссылок на контролы. Таким образом, один контрол может входить в несколько групп. Для редактирования состава групп я сделал визуальный редактор. Дальше, к примеру, я хочу изменить Enabled для одной из групп. Метод класса, который это делает, сканирует коллекции и делает Enabled контролам, входящим в группу, только если контрол не входит в какую-то другую группу, в которой Enabled=False. Вот примерно так. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 11:53 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
Nika.dn, эта конфигурация поддерживается ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 12:24 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
ActiveSheet.OLEObjects - вот та коллекция, которую требуется перебирать и в ней уже проверять тип контрола, так как в коллекцию входит все подряд ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 12:32 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
Shocker.Pro видимо, вы меня не очень поняли. Группа контролов - понятие виртуальное. Это не что-то, поддерживаемое бейсиком. Я сам писал класс, который формирует эти группы. Устроены они примерно так - есть коллекция элементов типа "группа" (пользовательского типа, который я сам и создавал). Каждый элемент содержит название группы и какие-то признаки (например Enabled), а также вложенную коллекцию ссылок на контролы. Таким образом, один контрол может входить в несколько групп. Для редактирования состава групп я сделал визуальный редактор. Дальше, к примеру, я хочу изменить Enabled для одной из групп. Метод класса, который это делает, сканирует коллекции и делает Enabled контролам, входящим в группу, только если контрол не входит в какую-то другую группу, в которой Enabled=False. Вот примерно так. Видимо, да. Не совсем понятно. У меня, в принципе, есть класс, он маленький. Однако он у меня только для типа Button Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2012, 01:04 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
Shocker.Pro, Попробуйте подкорректировать мой класс, чтобы он заработал так как у Вас - для группы контролов. В моем примере, который я прикрепляла в первом посте модуль класса называется BtnClass, а модуль, в котором работаю с этим классом называется modGlobalCtr. Верите, хоть и написала сама (на примере Уокенбаха) - не пойму что мне с этим делать, чтобы оно работало правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2012, 01:38 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
Вы считаете, что то, что я описал выше, возможно уложить в пару строчек кода? Что касается вашего кода - я вам уже отвечал - коллекцией является ActiveSheet.OLEObjects - ее и надо перебирать в For Each ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2012, 09:38 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
Shocker.Pro, Извините меня за недопонимание, просто с VBA я плохо еще дружу, буду разбираться. Можно только попросить Вас, консультировать меня и помогать - я хочу разобраться и попробую сама написать подобный класс с такими же возможностями. Очень нужная вещь для работы Shocker.ProГруппа контролов - понятие виртуальное. Это не что-то, поддерживаемое бейсиком. Я сам писал класс, который формирует эти группы. Устроены они примерно так - есть коллекция элементов типа "группа" (пользовательского типа, который я сам и создавал). Каждый элемент содержит название группы и какие-то признаки (например Enabled), а также вложенную коллекцию ссылок на контролы. Таким образом, один контрол может входить в несколько групп. Для редактирования состава групп я сделал визуальный редактор. Дальше, к примеру, я хочу изменить Enabled для одной из групп. Метод класса, который это делает, сканирует коллекции и делает Enabled контролам, входящим в группу, только если контрол не входит в какую-то другую группу, в которой Enabled=False. Начну сначала: 1. По поводу коллекции, о которой идет речь - ActiveSheet.OLEObjects, Вы имеете в виду, что это та коллекция, которая и будет работать с ActiveX на листе, а не на форме? Я правильно поняла? (а то мне кажется, что мы с Вами говорим об одних и тех же вещах, но по-разному и я не понимаю Вас) Другими словами, если я обращусь к коллекции ActiveSheet.OLEObjects(typeControl), где typeControl - это строковая переменная, которая хранит тип контролов, то эта коллекция будет перебирать в цикле контролы нужной мне группы? Единственный момент, который я не совсем поняла это по какому признаку формируется группа, если как Вы сказали Shocker.Pro"один контрол может входить в несколько групп", то значит они формируются не только по своему типу, а еще по чему? 2. По поводу пользовательского типа для контролов я их тоже создала - выложу их здесь на ваш суд, только я не знаю объявить эти типы как Private в модуле класса или же отправить их в обычный модуль (не понимаю в чем разница, поэтому и не знаю, как нужно) . Вот они Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
3. Как это все собрать в единое целое, т.е можно создать группу? Извините за мою дремучесть и может многие вопросы Вам покажутся глупыми или очевидными, помните - я только учусь и VBA для меня - белое пятно (оффтоп) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2012, 12:54 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
Nika.dn1. По поводу коллекции, о которой идет речь - ActiveSheet.OLEObjects, Вы имеете в виду, что это та коллекция, которая и будет работать с ActiveX на листеДа, на форме для этого есть другая коллекция. Но если вы будете создавать собственную коллекцию, которая собирается при добавлении контролов на лист, то коллекция ActiveSheet.OLEObjects вам не понадобится. Nika.dnДругими словами, если я обращусь к коллекции ActiveSheet.OLEObjects(typeControl), где typeControl - это строковая переменная, которая хранит тип контролов, то эта коллекция будет перебирать в цикле контролы нужной мне группы?Нет, при обращении к элементу коллекции вы указываете его индекс или имя, а не тип. То есть вам нужно перебирать ВСЮ коллекцию объектов, проверяя тип каждого объекта, чтобы вычленить объекты нужного типа. Nika.dnЕдинственный момент, который я не совсем поняла это по какому признаку формируется группа, если как Вы сказалиКак я уже говорил - у меня есть визуальный редактор. Программист вручную собирает группы по ему ведомым принципам. Nika.dn Извините за мою дремучесть и может многие вопросы Вам покажутся глупыми или очевидными, помните - я только учусь и VBA для меня - белое пятно На мой взгляд, вам нужно начать с чего-то более простого, набить немножко руку на работу с коллекциями, объектами и пользовательскими типами. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2012, 13:11 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
Может быть небольшой пример поможет - http://www.dimit.pochta.ru/wopr.html#19 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2012, 15:28 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
Дмитрий, спасибо большое за Ваши примеры. Последую совету Профи и начну с малого (не без помощи Ваших примеров) Только в примере где CheckBox-ы связываются с ячейками для элементов управления ActiveX (верхний пример) нужно вставлять CheckBox в ячейку, а если в таблице уже загруженной из БД есть поля логического типа, то можно сделать так, чтобы они (CheckBox-ы) автоматически вставлялись, при этом значения в ячейках не изменялись, а просто визуально отображались галочками ,(как в Access - хранится ИСТИНА или ЛОЖЬ, а отображается флажок, только авоматически) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2012, 02:48 |
|
Элементы управления ActiveX на рабочем листе Excel
|
|||
---|---|---|---|
#18+
Shocker.ProНа мой взгляд, вам нужно начать с чего-то более простого, набить немножко руку на работу с коллекциями, объектами и пользовательскими типами. Вы правы, нужно немного потренироваться, а то я как в паззлах с потерянным фрагментом - вроде все есть, а общей картины сложить не могу. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2012, 02:53 |
|
|
start [/forum/topic.php?fid=61&msg=38062514&tid=2175169]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 142ms |
0 / 0 |