Excel 2010 проверяет, содержат ли ячейки в строке данные до срабатывания изменения выделения

#excel #vba #validation

#excel #vba #проверка

Вопрос:

У меня есть таблица данных Excel 2010, которая управляется запросом из MSSQL. Базовый запрос изменяется в зависимости от того, какие параметры пользователь выбирает в книге Excel. Я согласен с изменением запроса и извлечением данных.

После выбора данных несколько пользователей смогут редактировать и добавлять данные в таблицу Excel, и эти изменения будут отправлены обратно в таблицу базы данных SQL. Из-за структуры таблицы базы данных некоторые из этих ячеек в данной строке являются обязательными для вставки любых данных в MSSQL и / или возможного обновления.

Итак, чего я пытаюсь добиться, так это проверки того, являются ли определенные столбцы в строке пустыми после редактирования ячейки (я могу сделать это с помощью изменения листа), а также до того, как они покинут эту строку, чтобы я мог вывести сообщение, если не были введены все обязательные столбцы. Я не вижу никаких событий, которые срабатывают до изменения выбора. Мои единственные мысли об обходном пути — иметь маркер строки глобальной переменной, который обновляется при изменении выбора, т. Е. он будет сохранять предыдущий номер строки. Я не могу использовать стандартную функцию проверки данных Excel, просматривая пустые ячейки, потому что, хотя это нормально для редактируемой в данный момент правильно заполненной строки, вставка новых строк или добавление непосредственно в нижнюю часть таблицы будут постоянно приводить к ошибкам, поскольку все эти обязательные столбцы, конечно, будут пустыми. В настоящее время я использую условное форматирование, чтобы, по крайней мере, выделить столбцы / ячейки, которые требуют ввода, хотя это не заставляет пользователей фактически это делать. Данные не могут быть сохранены в MSSQL, пока эти столбцы не будут содержать данные, поэтому, если они по какой-либо причине не заполнят их и не обновят таблицу, все, что они ввели, будет потеряно. Очевидно, что это плохо, м’кей. Я обеспокоен постоянным запуском событий изменения листа и изменения выбора и тем, как это повлияет на производительность книги.

Любые предложения будут оценены. Возможно, я все делаю неправильно, поэтому любые идеи по повышению эффективности также будут хорошо восприняты. Пользовательская база не хочет видеть пользовательские формы или MS Access, хотя это сделало бы это действие очень простым. Они слишком привыкли к внешнему виду таблиц Excel.

Комментарии:

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

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

3. возможно, это может немного помочь sites.google.com/site/beyondexcel/project-updates /… и youtube.com/watch?v=P9cUYpXIKsU

4. Я бы не пытался проверять данные при вводе их пользователем, а вместо этого, когда они запускают обновление базы данных. Может немного раздражать появление ящиков сообщений, если вы не закончили работу над вводом данных… Если вы хотите иметь «живые» признаки проблем, я бы использовал проверку данных (хотя с новыми строками сложно справиться). Если каждая запись имеет уникальный «Идентификатор», то включение его в набор данных помогает определить, какие строки редактируются, а какие добавляются пользователем.

5. @TimWilliams Я не показываю сообщения после ввода каждой ячейки в заданной строке, потому что, как вы говорите, это будет раздражать. Для выделения ячеек, которые являются обязательными, используется условное форматирование. Важным моментом является то, что пользователь покидает эту строку, предполагая, что он закончил ввод. Вот когда я хотел бы иметь что-то, что гарантирует, что они вернутся к выполнению хотя бы минимального ввода данных. Могу ли я отменить изменение выделения, если оно не находится в той же строке? Я полагаю, что глобальная переменная, всегда хранящая последнюю посещенную строку, решила бы эту проблему. Я уже использую идентификатор, как вы предлагаете.

Ответ №1:

ваш лучший способ — скопировать таблицу в 2d-массив или какую-либо другую структуру данных в памяти, такую как словарь или коллекция. и затем управляет каждым изменением в памяти. это очень эффективно, но требует много кода. с Excel единственная проблема, с которой вы сталкиваетесь, — это ключ, остальное — вопросы vlookup и true false. vlookup найдет исходное значение, и тогда у вас будут текущие данные предыдущие данные логика … новые данные в порядке?

Комментарии:

1. Я уже использую таблицу данных, и у меня нет проблем со сравнением значений ячеек до и после редактирования. Меня больше беспокоит, как проверить, что 7 столбцов в данной строке содержат данные, особенно перед тем, как пользователь покинет эту строку. Также я не знаю, приведет ли проверка этих столбцов на каждом листе или изменение выбора к снижению производительности.

2. если(и(b1<>»», …, b10<>»»), true, false) … я бы изменил значение true на символ красного флага (свадьбы), а значение false на «». добавить кнопку отправки. и выполняет всю работу на одном дыхании