Помогите с программой для Excel
Передо мной стоит такая вот задача.
Есть таблица, которая обновляется в реальном времени каждые n секунд. Нужно сделать макрос, который бы также в реальном времени отслеживал изменения в этой таблице и выводил лог обо всех изменениях на другой лист. Лог должен вестись, пока не будет нажата нужная кнопка.
Можно ли в экселе сделать бесконечный цикл, который бы работал до нажатии кнопки. Я попытался его сделать, но когда мой макрос работает, то в это время нельзя производить никаких манипуляций с экселем. Например, нельзя нажимать кнопки, редактировать информацию и т.д.
Пожалуйста, помогите советом. Может есть какой-то стандартный способ работы с такими задачами.
Первый - использовать события. Создаёшь в модуле нужного листа процедуру:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
....
End Sub
и в ней обрабатываешь любые измененения листа. Чтобы была возможность включать/выключать это дело - первое действие в этой процедуре будет проверка состояния галочки вести-не вести лог.
Второй путь. Запускать каждые К секунд самому макрос с обработкой.
Это делается с помощью такой команды:
Application.OnTime EarliestTime:=Now+K/86400, Procedure:="MySub"
Когда ты начинаешь вести лог - ты выполняешь эту команду.
А дальше процедура MySub будет после внесения в лог всех изменений в конце устанавливать запуск себя самой (если лог ещё нужно продолжать вести).
У каждого из вышеперечисленных способов есть свои плюсы и минусы.
Скажи-ка, а каким образом в Экселе будут появляться данные?
Второй вариант наверное должен пройти. Попробую сегодня его реализовать.
Но все равно, хотелось бы узнать ответы про первый :)
Данные в эксель будут попадать через связь с внешними данными.
ИМХО, лучше использовать все-таки первый вариант..
[quote=grishkov]Я не совсем понял, что делает процедура в первом варианте, это какая-то стандартная функция для обработки событий на листе, которая вызывается как-то по особому? Какой в нее передется параметр и кто его передает?[/quote]
Заходишь в Excel - жмешь Alt+F11(попадаешь в VBA) - в Project Explorer'e щелкаешь на листе, где будут производится изменения(Project Explorer, по умолчанию, в левом верхнем углу). Откроется модуль листа.. Сверху от модуля появится два выпадающих списка - в одном выбираешь Worksheet, в другом-Change.
Параметр Range обозначает диапозон ячеек, который был изменен.. с ним и работаешь:)
Данное событие, из названия, будет вызываться, когда в ячейках листа произошли какие-то изменения..
А вообще тебе надо почитать литературу или даже тот же родной help и узнать чо такое события!!!
Цитата: koltaviy
ИМХО, лучше использовать все-таки первый вариант..
Это зависит от контекста задачи. Не бывает никаких абсолютных истин. :)
Цитата: grishkov
Данные в эксель будут попадать через связь с внешними данными.
А не через ДДЕ ли? Для ДДЕ есть третий, самый удобный путь.
Цитата: koltaviy
А вообще тебе надо почитать литературу или даже тот же родной help и узнать чо такое события!!!
Подпишусь под каждым словом! Уважаемый grishkov, выполняйте!