Страницы: 1 2 След.
RSS
На сколько изменилось число в ячейке относительно предыдущего
 
Время доброго всем , такой вопрос . В столбце А1:A60 имеются цифры поступающие по DDE ,  можно ли сделать так что бы отображалось в столбце В , на сколько было изменение в ячейках  А1:A60 .?
 
Цитата
yrikovsy написал:
на сколько было изменение в ячейках  А1:A60 .?
Изменение относительно чего? Файл-пример?
 
Цитата
Anchoret написал:
Изменение относительно чего? Файл-пример?
Как бы понятнее объяснить , попробую . В ячейке число , оно обновляется DDE . Если было допустим 100 , оно изменилось через час на 110 , в соседней ячейке показывало 10 .  
 
yrikovsy, это только макросом можно... ну или вы перед тем как менять значение в таблице копируете предыдущие ( результат ) куда-то
Изменено: a.i.mershik - 23.03.2018 15:49:37
Не бойтесь совершенства. Вам его не достичь.
 
Цитата
a.i.mershik написал:
( результат ) куда-то
Да так и делаю на данный момент , думаю как избавится от этого .
 
yrikovsy, ну говорю макросом только может кто-то и поможет, но с примером файла)
Не бойтесь совершенства. Вам его не достичь.
 
Пробовал макрос подобрать , не получилось .  
 
Код
Private Sub WorkSheet_Change(ByVal Target As Range)
Dim arr, arr1, a&
If Intersect(Columns(1), Target) Is Nothing Then Exit Sub
arr = Intersect(Columns(1), Target).Value
Application.EnableEvents = False
Application.Undo
arr1 = Intersect(Columns(1), Target).Value
If Not IsArray(arr) Then
  Intersect(Columns(1), Target).Offset(0, 1) = arr1 - arr: Intersect(Columns(1), Target) = arr
Else
  For a = 1 To UBound(arr)
    arr1(a, 1) = arr1(a, 1) - arr(a, 1)
  Next
  Intersect(Columns(1), Target).Offset(0, 1).Value = arr1
  Intersect(Columns(1), Target).Value = arr
End If
Application.EnableEvents = True
End Sub
 
Anchoret , работает при ручном воде , а вот при обновление с DDE нет.

Вот что нашёл по этому поводу  , Worksheet_Change не работает, если данные поступают по DDE. Самый оптимальный вариант - создать текстбокс из элементов ActiveX, в LinckedCell указать адрес ячейки, изменение которой надо отслеживать и в событие Change текстбокса записать нужный код. Тогда поступление данные по DDE тоже будет обрабатываться.
 
Все правильно нашли. Осталось создать текстбокс и перенести приведенный выше код в него. Должно получиться что-то вроде:
Код
Private Sub TextBox1_Change()
Dim arr, arr1, a&
arr = Intersect(Columns(1), ActiveSheet.UsedRange).Value
Application.EnableEvents = False
Application.Undo
arr1 = Intersect(Columns(1), Target).Value
If Not IsArray(arr) Then
  Intersect(Columns(1), Target).Offset(0, 1) = arr1 - arr: Intersect(Columns(1), Target) = arr
Else
  For a = 1 To UBound(arr)
    arr1(a, 1) = arr1(a, 1) - arr(a, 1)
  Next
  Intersect(Columns(1), Target).Offset(0, 1).Value = arr1
  Intersect(Columns(1), Target).Value = arr
End If
Application.EnableEvents = True
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Возможно проще сделать макрос который будет копировать значение ячеек и вставлять их в тот столбец ? Что то вроде такого,  Sub Копия_числа() '
' Копия_числа Макрос''
Application.Run "'Прайс.xls'!myMacro"
For i = 7 To 66
Range("AW" & i).Value = Range("AJ" & i)
Next
End Sub
Выдаёт ошибку данный макрос.
Изменено: yrikovsy - 23.03.2018 17:35:04
 
Спасибо большое , но данный пример не работает , или я что то делаю не так.
Изменено: yrikovsy - 23.03.2018 19:03:43
 
Цитата
yrikovsy написал:
но данный пример не работает
там много чего надо еще изменить, сразу не увидел. Заменить везде Target надо бы:
Код
Private Sub TextBox1_Change()
Dim arr, arr1, a&, rr as range
set rr = Intersect(Columns(1), ActiveSheet.UsedRange)
if rr is nothing then exit sub'на всякий случай
arr = rr.Value
Application.EnableEvents = False
Application.Undo
arr1 = rr.Value
If Not IsArray(arr) Then
  rr.Offset(0, 1) = arr1 - arr: rr = arr
Else
  For a = 1 To UBound(arr)
    arr1(a, 1) = arr1(a, 1) - arr(a, 1)
  Next
  rr.Offset(0, 1).Value = arr1
  rr.Value = arr
End If
Application.EnableEvents = True
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Что то не получается запустить  
 
А у меня получается, все работает. Что именно не получается у Вас? Не срабатывает? Проверьте, не оставили ли включенным режим конструктора после создания TextBox-а - он будет блокировать макросы.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
А у меня нет , не работает , даже если в ручную вожу данные на этом коде  не пойму по чему так.
 
Приложил усовершенствованный пример - попробуйте. Должен срабатывать. При использовании TextBox-а код отмены может срабатывать не так, как ожидалось.
Обращаю внимание, что код записан и в модуле листа и в стандартном модуле.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Зато загуглил, что такое DDE)
 
USER=6]Дмитрий Щербаков[/USER], когда подаю данные с DDE . пример =ДРВ("tos.rtd"; ; "VOLUME"; "/6A") , вставляется значение , а обновляться перестаёт , данные которые подал они пропадают с ячейки .
 
Так у Вас значения формулой попадают на лист? Т.е. в столбце А - формулы, которые тянут DDE? Там несколько иной принцип у них. Но попробуйте заменить процедуру в моем файле так:
Код
Sub SetChanges()
'процедура вызывается при изменении в Текстбоксе
'сама процедура отслеживания изменений в Лист1
    Dim arr, afrml, arr1, a&, rr As Range
    Set rr = Intersect(Columns(1), ActiveSheet.UsedRange)
    If rr Is Nothing Then Exit Sub 'на всякий случай
    arr = rr.Value
    afrml = rr.Formula
    Application.EnableEvents = False
    'при цикличном вызове буфер может быть пуст
    'поэтому дополнительно отслеживаем и это
    On Error Resume Next
    Application.Undo
    'если отменить не получилось - переходим на строку включения отслеживания событий
    If Err.Number <> 0 Then GoTo END_
    
    arr1 = rr.Value
    If Not IsArray(arr) Then
      rr.Offset(0, 1) = arr1 - arr: rr = arr
    Else
      For a = 1 To UBound(arr)
        arr1(a, 1) = arr1(a, 1) - arr(a, 1)
      Next
      rr.Offset(0, 1).Value = arr1
      rr.Formula = afrml
    End If
END_:
    Application.EnableEvents = True
End Sub
У меня нет сервера DDE, поэтому проверить не могу.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Именно так , вот что выдало
 
Ну это уже Ваши проблемы :) - Вы скопировали код без буквы S в названии:
ub SetChanges()
а у меня оно на месте:
Sub SetChanges()
Изменено: Дмитрий Щербаков - 23.03.2018 19:18:23
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий Щербаков. Да извиняюсь не заметил что не скопировал  , что то не могу разобраться с последним макросом
 
Цитата
yrikovsy написал:
что то не могу разобраться с последним макросом
а я как должен помочь? Я уж и файл вложил вместе с текстбоксом, кодами, пояснениями. В последнем сообщении показал как изменить код, там такой один. что теперь-то разбираться? Где не получается разобраться и с чем? Я решительно не понимаю. Опишите что ли по шагам где у Вас проблема появляется и какая...
Изменено: Дмитрий Щербаков - 23.03.2018 19:34:37
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий Щербаков, Нет последний код не работает с формулой , в ручном воде работает.  
 
yrikovsy, лучше объясните как дынные попадают на лист Excel. Сразу в ячейки, или через цепочку формул с другого листа или диапазона?
 
Anchoret, Могу вставить и просто формулой которая тянет данные из программы ,  могу вставить с другого листа , пробовал всяко , в ручном воде работают , а с остальным проблема .
 
Дмитрий Щербаков, Вставил последний макрос в свой файл , он работает если запускаю макрос вручную .
 
Знаете в чем проблема...В том, что данные по формуле попадают на лист. И приведенный код становится не совсем рабочим. Когда мы возвращаем прежние данные на лист, то это затрет формулу. Если возвращать формулу - она пересчитается тут же и будет тянуть данные с DDE заново. И если они там изменятся - то данные не совпадут.
Пришлось кардинально пересмотреть алгоритм. При первом запуске ничего не произойдет, просто будет запоминание полученных из DDE значений. А при следующем пересчете уже будет вычисление разницы текущих показаний и предыдущих.
Изменено: Дмитрий Щербаков - 23.03.2018 20:24:43
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий Щербаков, Работает  
Страницы: 1 2 След.
Наверх