Цитата | ||
---|---|---|
написал:
|
Ігор, ваш вариант сработал.
Я пробовал с одним Range (как комментарием выше) - не работало.
Всем здоровья, тема закрыта.
10.03.2023 16:47:08
Ігор, ваш вариант сработал. Я пробовал с одним Range (как комментарием выше) - не работало. Всем здоровья, тема закрыта. |
|||||
|
10.03.2023 15:52:02
Приветствую.
Картинке присвоено имя "Picture1", её нужно время от времени позиционировать на листе с помощью VBA. Вот таким кодом это получается сделать "в лоб": ActiveSheet.Shapes.Range(Array("Picture1")).Select Selection.ShapeRange.Left = [Q10].Left Selection.ShapeRange.Top = [Q10].Top Но вместо Q10 нужно в код VBA передать другое текстовое значение (название другой ячейки). И оно время от времени меняется - меняется ячейка, к которой нужно прикрепить картинку. Текущее актуальное название ячейки, к которой нужно прикрепить картинку, хранится в ячейке с именем "PicCell" в формате "А1". Подскажите, пожалуйста, как корректно использовать значение ячейки PicCell в коде VBA чтобы достигнуть того же результата, который получается кодом выше "в лоб"?
Изменено: |
|
|
12.03.2020 15:26:04
Спасибо, я, на самом деле, не ищу помощи в её оптимизации - расписал её здесь только чтобы любопытство можно было удовлетворить в одной ветке.
Вопрос только один - интсрумент "умного" представления чудовищно неправильных и избыточных формул. Я не буду делать ветку с вопросом по самой формуле -- не хочу праздным образом использовать Ваше время, я уважаю его. Самообразование - личная задача каждого и просить Вас повышать мой уровень считаю неправильным.
Изменено: |
|
|
12.03.2020 15:18:26
Время пересчёта не превышает неизвестных миллисекунд - никаких проблем или тормозов, вообще ничего. Это на количестве таких ячеек порядка 2000 (добавится еще тысяч 16 но попроще).
Задача: 1. в ячейке находится текстовая строка, содержащая неизвестной длины текст в формате: "дата"(ДД.ММ) + "дефис" + "числовое значение" + "пробел". Таких последовательностей может быть неизвестное количество (а может быть пусто). Это перечень результатов анализов с датами их получения. 2. в других ячейках той же строки находятся даты поступления, дата операции, дата выписки. 3. Необходимо из таких строк получать: 3.1. ближайший ко дню операции анализ из прошлого -- именно это уже успешно делает формула, 3.2. первый анализ в день операции, 3.3. второй анализ в день операции, 3.4. третий анализ в день операции, 3.5. четвёртый анализ в день операции, 3.6. последний анализ в день операции, 3.7. следующий ближайший анализ после дня операции, 3.8. последний из доступных анализов после дня операции на отрезке 5-ти дней после дня операции, 3.9. последний из доступных анализов после дня операции на отрезке от 6-го дня после дня операции до дня выписки. Вот чтобы закончить п.3.2 - 3.9. нужно вернуться к первой формуле. Писал её я - не горжусь, но рад, что работает)) Поскольку пациентов - 2000, нужна формула. Поскольку анализ - не один, а много, -- отсюда ДВССЫЛ чтобы работать с разными. Когда-то (с год назад) распарсил строки анализов, транспонировал с привязкой к пациенту, обработал. Поскольку разбираться с тем решением было лень, пошёл через формулу. Она работает и "ни одного разрыва"© в расчётах нет - работает на всех 2000 пациентах.
Изменено: |
|
|
12.03.2020 14:44:54
Я с ней уже работаю в Word, конечно, в ячейке неудобно будет. Поэтому - on-line, Far...
С именами особо не получится. И эта формула уже использует предварительную обработку из других ячеек; являясь, в свою очередь, частью результата - подробил уже всё. Не с просьбой оптимизации, а для удовлетворения любопытства, вот сама формула:
Изменено: |
|||
|
12.03.2020 14:30:13
Могут ли уважаемые форумчане посоветовать любое решение для форматирования длиннющих формул в читабельный вид?
Есть формула на страницу А4 (3500 знаков) - хотелось бы сейчас и на будущее иметь решение для её представления в структурированном виде. "Автоотступы" Plex, к сожалению, не справились и вылетели с ошибкой. Возможно есть on-line сервисы или надстройки Excel или плагин для Far Manager (к примеру)?
Изменено: |
|
|
26.07.2018 14:40:27
Пришу тайм-треккер -- учёт времени, уделённого пользователем конкретной задаче.
1. Пользователь при включении ПК (ноута) первым делом видит книгу Excel (книга в автозапуске), 2. Содержимое главного листа книги формируется динамически (список актуальных задач, лимиты времени, выделенные на них, дедлайны, комментарии, ...) во время открытия книги. Данные тянутся с файла, в который их вносит руководитель подразделения, 3. Пользователь кликом правой клавиши на определённой задаче стартует её выполнение, в этот момент Excel минимизируется в строку задач, 4. Пользователь работает в других программах над задачей, 5. При необходимости разворачивает Excel и либо кликом на той же задаче останавливает подсчёт времени либо кликом на другой задаче стартует подсчёт времени работы над новой задачей. 6. В момент завершения работы он закрывает книгу (обновлённая статистика уходит в файл руководителя подразделения). Проблема: при закрытии крышки ноута (в нашем случае это уход в спящий режим) счётчик времени не останавливается. Вопреки тому, что пользователь не работает над задачей (работа у него исключительно за ПК), время работы над ней растёт, -- статистика нерабочая. Соответственно, по событиям я хочу таймер останавливать и запускать. Точнее, -- при закрытии крышки просто останавливать, а при открытии -- разворачивать Excel чтобы пользователь определился над чем он планирует работать.
Изменено: |
|
|
26.07.2018 10:03:28
Коллеги, помогите, пожалуйста, советом или примером.
Нужно в VBA отслеживать события "уход в спящий режим", "уход в гибернацию", "возврат оттуда же". С включением вопрос решён -- файл Excel в автозагрузке, безопасность по макросам "Низкая". С выключением тоже вопросов нет -- событие закрытие книги. Каким образом можно перехватить действие пользователя по закрыванию крышки ноутбука (исхожу из того, что это действие может отправлять ноут как в гибернацию так и в спящий режим). Возможно ли перехватить событие пробуждения ноута из сна (возврат из этих двух режимов)? Само приложение Excel в эти моменты неактивно, свёрнуто, -- пользователь работает в других программах, Excel в фоне. Спасибо большое!
Изменено: |
|
|
07.05.2017 18:56:27
Юрий М, Спасибо большое, так и сделаю! Подскажите, следующий способ (пока без массивов) годится или для этой цели есть более верный способ обращения с контролами?
Изменено: |
|||
|
07.05.2017 16:28:48
Юрий М, понял Вашу идею по интерфейсу с одним полем) Недурная, в каких-то случаях, идея.
Я консервативен, разместил всё на вкладках MultiPage (пока что 8 вкладок) и поэтому читаю-пишу одним махом все поля конкретной записи. Так наглядней -- поля подписаны метками, у них различные размеры, в зависимости от объёмов вводимого текста и т.д. и т.п. с доп.возможностями к каждому роду элементов. Просто до этого это было копирование одной строки, а теперь напрашивается массовое присваивание (считывание) значений разнородным элементам формы (коих ок.200). |
|
|
07.05.2017 14:09:36
Юрий М, редактирую я всё-таки записи, а не поля.
Для их корректного отображения я заменил в Вашем примере переменную iRow на передаваемый параметр i (поскольку полей у Вас в примере 4, -- добавил два контрола).
После нажатия кнопки "ОК" процедура обработки должна записать в условные 200 колонок-полей текущие значения контролов. В ней (сравнивая с приведённым выше кодом) поменяются местами контролы и ячейки. Просто в наших примерах несколько контролов, а у меня их ок.200, включая случаи с OptionButton. |
|||
|
07.05.2017 13:50:21
Юрий М, о строках в Вашей процедуре FillData. Про обратный случай - где Вы увидели претензии? я только имел в виду, что кроме процедуры, в которой происходит присваивание контролам значений ячеек, будет ещё одна процедура сохранения, а это ещё + столько же строк. Обратный случай упоминался для корректного подсчёта количества необходимых строк кода. Полей у меня ок.200, поэтому дополнительного кода будет ок. 400 строк...
|
|
|
07.05.2017 13:30:02
Юрий М, на присваивание каждому из контролов значения конкретной ячейки (либо в обратном случае) нужна отдельная, руками написанная строка.
До этого для присваивания значений контролам я просто копировал нужную строку из БД в первую строку листа (одна строка кода для отображения очередной записи БД), к ячейкам которой через ControlSource были привязаны элементы управления. А в случае необходимости (нажатие кнопки "Сохранить") копировал первую строку в необходимую строку таблицы. Да, единожды я присвоил контролам свойство ControlSource, привязав их к ячейкам. Или я глобально не разобрался с примером?
Изменено: |
|
|
07.05.2017 12:57:36
У меня офис со всеми обновлениями.
Все ControlSource убрал, буду вручную присваивать. +200 строк на отображение, потом +200 на запись -- запутаться проще, но после отладки хоть работать будет) Теоретически, можно организовать цикл обхода контролов (если в названии использовать цифры в конце) и последовательно присваивать значения в колонках. Но в этом случае ещё сложнее добиться уверенного контроля над кодом -- структура БД ещё "плавает" и, вполне вероятно, будет и в будущем меняться.
Изменено: |
|
|
07.05.2017 11:43:23
Юрий М, я RowSource вовсе и не использовал. Упомянул проблемы с ним поскольку нашёл информацию, в т.ч. на этом форуме, что лучше от него держаться подальше -- и именно это поразило, как рекомендация для продукта уровня Excel. До этого нормально сделал программку с расчётным числом записей ок.120 000, знаю, что и миллионы в Excel можно.
Тем не менее, интересно как бы Вы подошли к вопросу. Я не о конкретных нюансах реализации БД в Excel, а об альтернативной архитектуре решения в условиях, когда Excel такое вытворяет) R Dmitry, спасибо, интересно. Я, правда, не вижу необходимости (в рамках своей задачи) в нормализации данных и полной имитации работы с первичными ключами и т.д. Грубо -- у меня одно поле с типом Record (если такое название где-то ещё используется).
Изменено: |
|
|
07.05.2017 11:19:01
Посчитал, что с БД на пару тысяч строк (это максимальный размер для отдалённой перспективы) можно попробовать ограничиться Excel. Простота реализации позволила бы человеку, для которого БД делается, освоить Excel и справляться с её сопровождением.
+ на самом деле, Excel -- это удобно) + пару месяцев назад на предыдущей винде-офисе сделал гораздо более сложную программу, которая работает на разных версиях винды-офиса. Правда, там не использовалось ControlSource. Проблема с RowSource поразила - не ожидал от Excel такого. По инерции грешу на ControlSource, хотя о нём ничего подобного не пишут. Но, безусловно, необходим результат, поэтому готов к смене концепции (я совершенно обескуражен этим). Юрий М, а как бы вы решали такую задачу? Суть того, что делаю: ввод данных о пациентах для последующей печати различных медицинских документов и отчётных форм. Полей - ок. 200. Записей - несколько в день. Пользователь - один. Задача -- уменьшение количества писанины (диагнозы по несколько раз переписавать приходится...).
Изменено: |
|
|
07.05.2017 11:08:15
Как ни странно, даже у меня иногда работает корректно.
Windows XP SP3 + Office 2010 SP2. Установлены пакеты MS Visual C++ 2005, 2008, 2010 (версия последнего пакета - 10.0.40219). До глобальной переустановки всего также были установлены все пакеты до 2016 включительно. Установлен MS Visual Studio 2010 Tools for Office Runtime. Все версии ПО - х86.
Изменено: |
|
|
22.04.2017 23:01:22
Vikttur, спасибо!
Поскольку в самой копилке файла не было (зато была ссылка на ветку его обсуждения) -- прикладываю сюда итоговый пример с календарём в ComboBox-е. Честно, удивлён, что в саму книгу можно вложить элемент MSComCtl2.DTPicker.2 (у меня Excel 2010), а для формы ничего подобного и близко нет. Для удобства интересующихся вопросами этой темы выкладываю сюда итог работы Слэна и коллег (а также всё найденное, что содержит элементы решения главной задачи). Все найденные примеры выкладываю "как есть" без своих комментариев и в порядке перечисления. Есть версия Юрий М, в которой календарь Слэна работает на форме. Нашёлся прототип от Igor67 (кстати, с календарём Слэна). Ещё один прототип, близко к тому, что искал, в т.ч. используется авторский календарь от EducatedFool (Игорь) -- Ещё один календарь от пользователя Logistic. И, наконец, найдено полноценное и даже документированное (в т.ч. в коде VBA) решение -- Это не отменяет просьбы давать дополнительные альтернативные решения) Незнание правил не отменяет ответственности. Файлы удалены [МОДЕРАТОР]
Изменено: |
|
|
22.04.2017 22:36:40
Здравствуйте, уважаемые форумчане.
Возможно в сети есть примеры для ознакомления и использования по указанной теме? Ввиду распространённости сформулированной задачи, есть надежда опереться на полновесный пример чтобы избежать лишних граблей и сэкономить время. Библиотеки, компоненты, -- за всё буду благодарен. Для лучшего понимания вопроса прикладываю текующую версию, это самое начало работы. Также есть один частный вопрос: где поискать ComboBox с выпадающим календарём для выбора даты? Или стандартный екселевский можно превратить в такой? Спасибо.
Изменено: |
|
|
03.03.2017 12:54:05
Я неработающий "автофит" обошёл следующим образом.
Напомню: у меня проблемные строки формируются путём переноса из из другой таблицы текстов неизвестной длины. Но физически эти тексты размещаются в одной (первой) ячейке каждой строки. Решение: В служебной колонке изучаю, что именно находится в первой ячейке: количество абзацев (СИМВОЛ(10)), количество символов последнего абзаца (у меня примерно 100 символов помещается в одной строке в ячейке, -- делю, округляю). И формирую с запасом на 1 количество строк в ячейке в виде значения ячейки. Тут алгоритм можно сколь-угодно изощрённый реализовать одной формулой. А при выполнении процедуры подготовки к печати перебираю все эти строки и устанавливаю им высоту 13*служебную колонку условной высоты в строках. Торможений особых нет, хотя на этом форуме упоминается и более продуктивный способ: загрузить вектор_высот_строк в массив и обработать весь Range. По Activate-Select пока не сделал но еще буду искать.
Изменено: |
|
|