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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2013, 15:38   #1
winfile
 
Регистрация: 10.04.2013
Сообщений: 3
По умолчанию Сохранение изменений в ячейках

Приветствую всех!
Уже голову сломал, но ничего не получается. К тому же опыта работы с макросами 3 дня отроду...
Есть макрос

Цитата:
Private Sub Worksheet_Change(ByVal Target As Range) 'при изменении

If Target.Column = 2 And Target.Row = 3 Then
Application.EnableEvents = False
If Cells(1, Target.Column + 22) <> "" Then
LastRow = Cells(Rows.Count, Target.Column + 22).End(xlUp).Row + 1
Else
LastRow = 1
End If
Cells(LastRow, Target.Column + 22) = Cells(Target.Row, Target.Column).Value

Application.EnableEvents = True
End If
End Sub

Sub ff()
Application.EnableEvents = True
End Sub
Он сохраняет каждое новое изменение заданной ячейки. Проблема в том что сохранение происходит только если ячейку изменяет пользователь.
Данные в таблицу у меня заносятся из программы посредством RTD. Необходимо чтобы каждое новое изменение этих данных сохранялось автоматически в новые ячейки. Т.е. к примеру изменения ячейки А-1 сохранялись в столбец В.. Изменения в С-1 сохранялись в столбец D и т.д. Помогите пожалуйста реализовать, буду очень благодарен.
За ранее спасибо.
winfile вне форума Ответить с цитированием
Старый 10.04.2013, 16:20   #2
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

В программе "Excel" есть ещё одно событие, которое возникает при изменении данных на листе. Это событие "Calculate".
Скрипт вне форума Ответить с цитированием
Старый 10.04.2013, 20:34   #3
winfile
 
Регистрация: 10.04.2013
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
В программе "Excel" есть ещё одно событие, которое возникает при изменении данных на листе. Это событие "Calculate".
Извиняюсь за тупой вопрос, а как это событие подставить в мой макрос ? Как это будет выглядеть ?
спасибо .
winfile вне форума Ответить с цитированием
Старый 10.04.2013, 21:50   #4
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

winfile, если вам кажется, что вопрос простой, на самом деле может быть так, что вопрос сложный и даже вообще не решаемый.

Для начала нужно проверить, вызывает ли "RTD" событие "Calculate" (у меня "RTD" нет и я проверить не смогу. Я даже не знаю, что такое "RTD").

Для эксперимента:
  1. создайте новую Excel-книгу;
  2. вставьте в эту книгу одну формулу с "RTD";
  3. поместите в модуль листа этот код:
    Код:
    Private Sub Worksheet_Calculate()
        
        MsgBox "Calculate."
    
    End Sub
  4. сделайте так, чтобы "RTD" сработал;
  5. если "RTD" вызывает событие "Calculate", то можно будет дальше что-нибудь подумать. Если не вызывает, то тогда нужно что-нибудь другое предпринять.
Скрипт вне форума Ответить с цитированием
Старый 10.04.2013, 23:11   #5
winfile
 
Регистрация: 10.04.2013
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
winfile, если вам кажется, что вопрос простой, на самом деле может быть так, что вопрос сложный и даже вообще не решаемый.

Для начала нужно проверить, вызывает ли "RTD" событие "Calculate" (у меня "RTD" нет и я проверить не смогу. Я даже не знаю, что такое "RTD").

Для эксперимента:
  1. создайте новую Excel-книгу;
  2. вставьте в эту книгу одну формулу с "RTD";
  3. поместите в модуль листа этот код:
    Код:
    Private Sub Worksheet_Calculate()
        
        MsgBox "Calculate."
    
    End Sub
  4. сделайте так, чтобы "RTD" сработал;
  5. если "RTD" вызывает событие "Calculate", то можно будет дальше что-нибудь подумать. Если не вызывает, то тогда нужно что-нибудь другое предпринять.
RTD - Real-Time Data в excel .. Замена DDE ...

Вопрос снят. Спасибо за попытку помочь.
Проблему решил так (может кому пригодится):

Цитата:
ZVI:2008-03-30 http://www.planetaexcel.ru/forum.php?thread_id=3146
' ZVI:2009-09-10 изменена ячейка DDE, событие SheetCalculate вместо SheetChange, применено Dirty

Dim IsStarting As Boolean

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
' Выйти если Стоп
If Not IsStarting Then Exit Sub
' Если изменения произошли не на Листе1, то ничего не делать
If Sh.Name <> Лист1.Name Then Exit Sub
' Отключить события
Application.EnableEvents = False
' ===== Записать историю изменения значений ячейки [B2] =====
Dim rng As Range, СтрокаДляЗаписи As Range, v As Double
' Задать диапазон таблицы данных
Set rng = Sh.Range("A3").CurrentRegion
' Отпределить последнюю строку для записи
Set СтрокаДляЗаписи = rng.Rows(1).Offset(rng.Rows.Count). Cells
' Вычислить новое значение
v = Sh.Range("B1").Value
' Если новое и 2 предыдущих значения не менялись, то переписывать дату и время предыдущего
With СтрокаДляЗаписи
If v = .Cells(1, 1).Offset(-1, 1) And v = .Cells(1, 1).Offset(-2, 1) Then
Set СтрокаДляЗаписи = .Offset(-1)
End If
End With
' Добавить в конец дату+время и значение
СтрокаДляЗаписи(1, 1) = Now
СтрокаДляЗаписи(1, 2) = v
' Переопределить именованный диапазон [БД]
Sh.Names.Add Name:="БД", RefersTo:="=" & rng.CurrentRegion.Address
' Переопределить диапазон данных диаграммы
Sh.ChartObjects(1).Chart.SetSourceD ata Source:=Sh.Range("БД")
' Задать необходимость пересчета ячейки
Sh.Range("B1").Dirty
' Включить события


' Задать диапазон таблицы данных
Set rng = Sh.Range("D3").CurrentRegion
' Отпределить последнюю строку для записи
Set СтрокаДляЗаписи = rng.Rows(1).Offset(rng.Rows.Count). Cells
' Вычислить новое значение
v = Sh.Range("G1").Value
' Если новое и 2 предыдущих значения не менялись, то переписывать дату и время предыдущего
With СтрокаДляЗаписи
If v = .Cells(1, 1).Offset(-1, 1) And v = .Cells(1, 1).Offset(-2, 1) Then
Set СтрокаДляЗаписи = .Offset(-1)
End If
End With
' Добавить в конец дату+время и значение
СтрокаДляЗаписи(1, 1) = Now
СтрокаДляЗаписи(1, 2) = v
' Переопределить именованный диапазон [БД]
Sh.Names.Add Name:="БД", RefersTo:="=" & rng.CurrentRegion.Address
' Переопределить диапазон данных диаграммы
Sh.ChartObjects(1).Chart.SetSourceD ata Source:=Sh.Range("БД")
' Задать необходимость пересчета ячейки
Sh.Range("G1").Dirty
' Включить события


Application.EnableEvents = True
End Sub

' Стоп
Sub StopWriting()
IsStarting = False
[StartStop] = "Stopped"
End Sub

' Старт
Sub StartWriting()
IsStarting = True
[StartStop] = "Starting"
Лист1.Range("B1").Dirty
End Sub

' Стоп при загрузке
Private Sub Workbook_Open()
StopWriting
End Sub
winfile вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение изменений в таблице GarBa4 C# (си шарп) 2 25.01.2012 19:08
Сохранение изменений Dmitrov БД в Delphi 2 16.05.2011 09:25
Сохранение изменений Dmitrov Помощь студентам 0 15.05.2011 13:36
Сохранение изменений в архиве. mrChester Общие вопросы .NET 3 25.10.2010 10:29
сохранение изменений в списке nurmizmat Паскаль, Turbo Pascal, PascalABC.NET 4 07.06.2010 12:35