Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2009, 21:03   #1
ЕленаС
Пользователь
 
Регистрация: 09.02.2009
Сообщений: 10
По умолчанию Как зафиксировать событие (изменение) в книге?

Например: Ехсел постоянно обновляет данные, часть из них изменяется, часть остается прежними.
Как зафиксировать событие(изменение) с помощью формулы в определенной ячейке, по времени и количеству? Зафиксированое событие должно оставаться неизменным, новое добавляться.
Спасибо за ответы!!!
ЕленаС вне форума Ответить с цитированием
Старый 15.02.2009, 21:21   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вряд ли это можно реализовать при помощи формул...
Зато с использованием макросов - запросто.

Прикрепите к сообщению пример файла, укажите, изменения каких ячеек необходимо ослеживать, куда (в какие ячейки) заносить результаты изменений. (приведите пример - скажем, при изменении ячейки F4 в следующую свободную ячейку столбца H записываем текущее время, и новое значение ячейки F4 )

Чем больше будет подробностей - тем быстрее получите ответ.
EducatedFool вне форума Ответить с цитированием
Старый 21.02.2009, 13:06   #3
ЕленаС
Пользователь
 
Регистрация: 09.02.2009
Сообщений: 10
По умолчанию Добавила пример

Смотреть примечания в изменяемых ячейках
Вложения
Тип файла: rar primer.rar (2.0 Кб, 35 просмотров)
ЕленаС вне форума Ответить с цитированием
Старый 21.02.2009, 13:30   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вот весь макрос:
Код:
Const КонтролируемыйДиапазон = "b2:b6"

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range(КонтролируемыйДиапазон)) Is Nothing Then
        Dim cell As Range, newcell As Range, x As Range: Set cell = Target.Previous
        ' ищем соответствующий столбец
        Set x = Rows(1).Find(cell.Value)
        If x Is Nothing Then MsgBox "Столбец с фамилией " & cell & " не найден", vbCritical, "Ошибка": Exit Sub
        ' нашли нужный столбец
        Set newcell = x.EntireColumn.Cells(Rows.Count).End(xlUp).Offset(1)
        newcell = Now: newcell.Next = Target
    End If
End Sub
Изменения можно вносить только в первую строку макроса (изменять границы отслеживаемого диапазона)

(добавлено)
Забыл, что ячейки изменяются не вручную, а с помощью формул. (пока что макрос отрабатывает только при ручном изменении значений в ячейках)
Попробую сейчас переделать макрос.
Будет намного проще, если Вы прикрепите к сообщению оригинальный файл (с формулами)


Пример во вложении:
Вложения
Тип файла: rar Фиксация изменений на листе.rar (8.8 Кб, 42 просмотров)

Последний раз редактировалось EducatedFool; 21.02.2009 в 13:39.
EducatedFool вне форума Ответить с цитированием
Старый 21.02.2009, 14:03   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вот вариант макроса, отслеживающий изменения, вносимые при помощи формул:
Код:
Const КонтролируемыйДиапазон = "b2:b6"

Private Sub Worksheet_Calculate()
    Application.ScreenUpdating = False
    Dim cell As Range, newcell As Range, x As Range, CellCopy As Range

    For Each cell In Range(КонтролируемыйДиапазон).Cells
        Set CellCopy = cell.EntireRow.Cells(Columns.Count)
        If cell <> CellCopy Then
            ' запоминаем новое значение
            CellCopy = cell
            ' ищем соответствующий столбец
            Set x = Rows(1).Find(cell.Previous.Value)
            If x Is Nothing Then MsgBox "Столбец с фамилией " & cell.Previous & " не найден", vbCritical, "Ошибка": Exit Sub
            ' нашли нужный столбец
            Set newcell = x.EntireColumn.Cells(Rows.Count).End(xlUp).Offset(1)
            newcell = Now: newcell.Next = cell
        End If
    Next cell
End Sub
На листе с именем "изменения при помощи формул" поизменяйте значения в желтых ячейках.

Копии значений хранятся в последних ячейках тех же строк (ячейки IV2:IV6)
По значениям в этих ячейках определяется, произошли ли изменения в наблюдаемом диапазоне.
Если эти ячейки будут мешаться при печати, можно сделать у них цвет шрифта белым.

Пример во вложении:
Вложения
Тип файла: rar Фиксация изменений на листе 2.rar (11.2 Кб, 75 просмотров)
EducatedFool вне форума Ответить с цитированием
Старый 21.02.2009, 19:04   #6
ЕленаС
Пользователь
 
Регистрация: 09.02.2009
Сообщений: 10
По умолчанию Спасибо за ответ!

Большое спасибо! Сейчас попробую
ЕленаС вне форума Ответить с цитированием
Старый 21.02.2009, 20:00   #7
ЕленаС
Пользователь
 
Регистрация: 09.02.2009
Сообщений: 10
По умолчанию Я поняла, что добавлен макрос

Если я захочу изменить диапазон данных, что мне надо делать?

Я еще один пример... Как его реализовать с помощью ваших формул?

И если можно, напишите пожалуйста коментарии, что, где и как надо изменять
Вложения
Тип файла: rar Книга3.rar (4.9 Кб, 26 просмотров)
ЕленаС вне форума Ответить с цитированием
Старый 21.02.2009, 20:28   #8
ЕленаС
Пользователь
 
Регистрация: 09.02.2009
Сообщений: 10
По умолчанию

====Будет намного проще, если Вы прикрепите к сообщению оригинальный файл (с формулами)====
Оригинальный файл находится на другом компьютере в сети... Мой файл постоянно извлекает оттуда внешние данные. Переодичность я сама назначаю, либо вручную, либо автоматом...
Если компьютер с данными отключен, выскакивает ошибка
ЕленаС вне форума Ответить с цитированием
Старый 27.12.2010, 11:06   #9
3BEPOBOY
Пользователь
 
Регистрация: 27.12.2010
Сообщений: 82
По умолчанию

EducatedFool
разъясните пожалуйста немного подробнее пример вашего последнего кода.

Я сам програмировал раньше только на делфи, сейчас поставили задачу написать макрос на VBA, который будет фиксировать факт изменения файла. То есть если кто-то зашел в файл и актуализировал его, информация со временем последнего изменения должна заноситься в журнал(другой файл). Я немного поразбирался на выходных с VBA, научился создавать, редактировать файлы, запускать макросы, создавать кнопки, разобрался с процедурами, функциями... почитал про Range. Уже вроде все слова в вашем коде знакомые, но в "жонглирование" переменными Range пока не въеду.

И еще вопрос, подскажите пожалуйста какой-нибудь сайт типа DelphiBasic или книгу, где можно смотреть описание стандартных конструкций? а то с английским не очень, справку не всегда понять выходит.
3BEPOBOY вне форума Ответить с цитированием
Старый 27.12.2010, 11:16   #10
vikttur
Участник клуба
 
Регистрация: 16.05.2010
Сообщений: 1,249
По умолчанию

Сохранение данных при открытии книги (часть процедуры в ЭтаКнига):

Цитата:
With Worksheets("лог") 'запись в журнал
iRwsLog = .Cells(Rows.Count, "B").End(xlUp).Row
i = iRwsLog + 1 'первая пустая строка после заполненных
.Cells(i, 2).Value = Now 'дата, время
.Cells(i, 3).Value = CreateObject("WScript.Network").Com puterName 'имя компьютера
Application.UserName' имя пользователя
End With
Application.DisplayAlerts = False
ActiveWorkbook.Save
Application.DisplayAlerts = True
vikttur вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как зафиксировать куки? mogul82 PHP 2 22.12.2008 22:28
Как использовать некоторый Active X в своей HTML странице Stilet JavaScript, Ajax 2 08.05.2008 18:13
как зафиксировать ячейку в таблице? Deceased PHP 1 08.05.2008 18:08
Как зафиксировать ячейку? gait HTML и CSS 4 22.11.2007 18:14