|
24.01.2026 15:47:55
Aлeкceй решил мою задачу. Все отлично!
Рекомендую к сотрудничеству |
|
|
|
|
|
23.01.2026 17:36:24
Просто люди стали писать в теме, я посчитал что отмалчиваться будет невежливо. |
|||
|
|
|
|
21.01.2026 14:43:29
Сами функции я писать умею, но под разные платформы код пишется со своими индивидуальными заковыками.
Во вложении архивчик с исходниками. В DLL описана функция kvadtar, возвращающая квадрат числа. А в файле prob1.xlsm ну никак она не работает. Тычу Tools->References->Browse... не коннектится DLL'ка. И в VBA Declare-строка не помогает. xlam не подходит. Только DLL.
Изменено: - 21.01.2026 14:44:22
|
|||||
|
|
|
|
21.01.2026 13:11:24
Как сделать на C++ DLL'ку (ActiveX для Excel) ?
Обычные DLL не принимает Excel. Уже всяко попробовал - не кушает их Excel. Задача: Писать и компилировать DLL на языке C/C++, чтобы потом эту DLL использовать в Excel_2016. (языкам C/C++, VBA учить не надо, визуальные компоненты тоже не нужны).
Изменено: - 24.01.2026 15:55:28
|
|
|
|
|
|
08.03.2024 15:30:16
dhead, спасибо.
Опыт есть, но подключаться к Excel'ю я ещё не умею. Пока изучал обфускацию, видел что есть возможность работы с dll, но реальных примеров не встретил. В будущем конечно надо будет изучить это направление, а то как-то медленно VBA работает, по сравнению с C/C++ проектами, которые могут использовать многопоточность, указатели и другие плюшки. |
|
|
|
|
|
05.03.2024 19:59:25
Защита кода.
Пароль-то снимать только ленивый не умеет. Обычно пишем код, и имена переменных/процедур/функций пишем по назначению - чтобы самому легко разобраться. А вот когда я все свои имена переименую в абракадабру, то в этом вряд ли кто захочет разбираться. Последний мини-проектик был на 985 строк и 165 имён. На листе делаю список имен, рядом набор случайных английских слов, затем макросом заменяю у себя все имена на другие слова. Ну и комментарии конечно удаляю. Код получается очень-трудно-читаемый для программиста. У меня в комапании редко кто занимается VBA, а вот выдать мои труды за свои - таких персонажей везде хватает. И мне это не нравится. Вот защищаюсь. Пример:
Изменено: - 05.03.2024 20:18:06
|
|||
|
|
|
|
05.03.2024 19:33:19
Да, похоже изящных решений нет.
Порылся в .CodeModule - не разбежишься. остаётся построчный перебор ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.Lines(i, 1) выделять Dim/Sub/Function и разбирать их на токены... И не вижу как в VBA можно подобраться к компилятору чтобы он выдавал списки имён. |
|
|
|
|
|
05.03.2024 18:41:11
Всем привет!
Надо получить списки имён всех переменных в модуле "Module1" (глобальных, локальных, массивов), имен всех процедур, функций, а так же имена параметров процедур/функций. Списки вывести на лист. Я могу конечно перелопачивать вручную все строки модуля, разбирать текст, и городить вручную кусок компилятора. Но наверняка есть какие-то методы, основанные на объектной модели VBProject.VBComponents и это можно сделать менее трудоёмко и более изящно? На худой конец может ткнёте где по-русски почитать про VBComponents ? |
|
|
|
|
|
04.12.2023 18:07:36
Sanja, вы помогли мне решить проблему.
благодарностью ответил. Спорить с вами, и чего-то пыжиться доказывать я не хочу и не буду. Безусловно до вашего уровня в Excel VBA мне очень далеко. Если чем обидел - извините. Злого умысла не имел.
Изменено: - 04.12.2023 18:07:54
|
|
|
|
|
|
04.12.2023 14:03:14
Sanja, , благодарю за оперативный ответ. Помогло.
С массивами индексов красиво. Я все искал константные массивы, не нашел, и наваял кучу констант и много букв кода. Копирование через массив решило проблему открывания файла макросом. Хоть помедленнее, зато гарантировано работает!
Option Base 1 не принял. Наверное потому что Excel 2016 у меня древний. Лично мне привычнее что первый индекс 0. Немножко причесал newArr = Application.Index(arr, 0, J) переписал newArr = Application.Index(arr, , J) ' чтобы забирал все строки и цикл "For J" убрал. Он там лишний. Осталось непонятным почему после Workbooks.Open s, 0, True как-то неполноценно работает файл. В crows значение правильное читает, а Copy-Paste кастрирует... |
|||||
|
|
|
|
04.12.2023 03:00:21
Мой макрос долго работает (самое быстрое 15 секунд) Макрос использует другой xlsb-файл с огромной базой данных. если файл базы данных открыт, то подключается к нему, из умной таблицы копирует себе на лист нужные столбцы, затем идет длительная построчная обработка этих данных. Здесь проблем нет. если файл базы данных не открыт, то открываем его, также копируем нужные столбцы, закрываем, потом обрабатываем свою выборку на своем листе. Вот здесь если в пошаговой отладке VBA-кода, тогда все делается нормально. Но если просто запускаю макрос, то выкопировку столбцов он делает всего по 66 строк (в базе данных 25500 строк). И "думает" при этом целых 6 минут. Такое впечатление что пока копируются ячейки столбца, программа уже запрашивает новые, и поэтому не полностью копируется столбец. Хотя все столбцы одинаково по 66 строк от первого до последнего. Ну вот как так-то? Такое впечатление что запускается несколько параллельных процессов, и у них рассинхрон.
Файлы приложить не могу - нельзя распространять базу данных. Excel2016 на Windows 7x64 (Тапками не кидайтесь - тоже вынужденная мера) Есть ещё один вопрос, похоже по той же причине у меня прогресс не весь отображается. То есть первые этапы отображаются, а когда работает цикл For то отображается старый прогресс. Я подумал что слишком часто требую отображения прогресса и форма просто не успевает его отрисовывать, сделал через 1000 строк, но не помогло.
Я думаю что у меня что-то не так с настройками самого самого Excel'я. Либо я недостаточно правильно открываю файл базы данных, и не понимаю работу Application.StatusBar Прошу помочь советом - что надо изучить/понять/добавить чтобы справиться с такой бедой? PS Отключал в настройках "многопоточные вычисления" - не помогло. Вообще это для формул в ячейках, но вдруг и на макросы влияет? Попробовал.
Изменено: - 04.12.2023 03:47:52
|
|||||
|
|
|
|
21.06.2014 11:30:17
Во как!!! Есть что комментировать!
Мне-то надо это сделать только на активном листе, а не на всех. Листы у меня есть несколько для печати, а есть служебные - с формулами. Просто уже давно все так скомпоновано. Ваши комментарии, кстати ОЧЕНЬ важны! Как новичок - не везде понимаю что где и как, а так есть отправная точка для понимания этой области. Лучше любого учебника. |
|
|
|
|
|
21.06.2014 11:12:26
Странно. nc не объявлял, просто в лоб указал количество столбцов (оно у меня везде одинаковое),
макрос вылетел на строке ws.Range(ws.PageSetup.PrintArea).Borders(xlEdgeBottom).LineStyle = xlContinuous При этом границы нарисовал там где надо!!! Вы не могли бы прокомментровать строки макроса, а то я не очень понимаю что там происходит. Код профессиональный, а еще новичок. Может сам что наэкспериментирую? |
|
|
|
|
|
21.06.2014 11:01:50
Ваш файл работает, но если делаю альбомную ориентацию страницы - макрос вылетает в том же месте и в Вашем файле.
*Я одним маркосом задаю многие параметры страницы, потом немного корректирую границы между страницами (по смыслу), а потом приходится тупо рисовать нижнюю границу у ячеек. Настройки страницы сбивать никак нельзя. |
|
|
|
|
|
21.06.2014 09:10:18
Интересная задачка - на каждой странице листа выделить нижнюю строку и установить нижнюю границу.
Маркорекордер не поможет - в разных файлах по-разному располагаются границы страниц. К тому же в процессе редактирования границы переношу (в страничном режиме) Надо ловить именно установленную мной или автоматическую нижнюю границу печатной страницы. Нужен макрос. Пример:
Изменено: - 21.06.2014 09:42:26
|
|
|
|
|
|
19.06.2014 17:16:52
Да, правила не читал.
Думаю раньше по-любому обсуждалось и где-то решено. На поиск уйдет много времени. Если б на Delphi/Pascal'e так моментом бы слепил. А вот с VBA в Excel проблемы у меня пока. Банальный синтаксис и незнание структур Excel. Мало еще прочитал теории, просто горит сейчас. Код-то вроде несложный. |
|
|
|
|
|
19.06.2014 16:54:00
Ребят, накидайте макрос или ткните в тему:
Надо объединить ячейки выделенного диапазона по столбцам (аналог объединения по строкам), Но с таким условием - в объединяемом столбце если несколько непустых ячеек, то данные этих ячеек в новой объединенной расположить типа через <Enter> например: вот из этого
Проблема очень горит, VBA мало понимаю. Записью такой макрос не могу сделать. А надо срочно.
Изменено: - 19.06.2014 17:10:23
|
|||||||||||||||||||
|
|
|