есть ли способ реагировать на изменения условного форматирования в excel?

У меня есть лист Excel, на котором есть ссылки dde на рыночные данные в реальном времени. Я использую таймер, чтобы смотреть цены dde каждую секунду. Затем отправьте заказы, когда будут выполнены определенные условия. Я попробовал бесконечный цикл с DoEvent в середине, который работает в течение 5 секунд, а затем замораживает книгу.

Есть ли способ реагировать на изменения в обновлениях dde? Событие изменения не обнаруживает их. Он просто определяет, когда пользователь вносит изменения вручную.

Мне сказали, что если у меня есть условное форматирование, есть способ подобрать это событие. Таким образом, я могу создать формулу ячейки, которая станет истинной, когда мое условие будет выполнено, а затем условно отформатировать эту ячейку для некоторого форматирования, когда оно истинно, а затем выбрать событие изменения формата. Это возможно? Если да то как. Мы ценим любые предложения.

Чтобы уточнить: я хочу получить событие В VBA, которое отправит заказ на торговлю акциями. Сейчас я делаю это с помощью таймера, который перебирает все строки в поисках истинной ячейки в столбце триггера. После обнаружения он отключает флаг для этой строки (устанавливает истинное условие на ложное) и отправляет заказ.

Проблема в том, что одна секунда — это вечность для быстро движущихся акций. Поэтому мне нужно, чтобы в VBA возникало событие, когда ячейка в столбце триггера становится истинной, чтобы я мог немедленно ответить, а не ждать второго интервала класса таймера.

Насколько я знаю, нельзя вызывать таймер со значением меньше секунды. Если бы я мог использовать миллисекунды, моя проблема была бы решена. Я бы просто перебирал список каждые 10 миллисекунд.

Насколько я знаю, я не могу создать другой поток в VBA. Если бы я мог, я бы сделал бесконечный цикл и засыпал его после каждой итерации примерно на 10 миллисекунд.

Насколько мне известно, я не могу напрямую подключить dde к VBA или даже к .net, поскольку MSDN говорит, что он больше не поддерживается.

Я надеюсь, что это проясняет. Все предложения приветствуются.


person Behrooz Karjoo    schedule 25.07.2012    source источник
comment
Если вы создаете фиктивную функцию, в которой в качестве параметров используются ваши выходные ячейки DDE, вы должны иметь возможность реагировать на событие Worksheet_Calculate? Я предполагаю, что это может сработать, но у меня нет опыта работы с DDE.   -  person Tim Williams    schedule 25.07.2012
comment
@Tim Когда срабатывает Worksheet_Calculate?   -  person Behrooz Karjoo    schedule 26.07.2012
comment
Когда рабочий лист вычисляет. Я не знаю, запускает ли изменение DDE вычисление напрямую - если оно не использует фиктивную формулу для запуска события (в качестве входных данных будут ваши ячейки DDE, изменение в этих ячейках должно вызвать перерасчет)   -  person Tim Williams    schedule 26.07.2012
comment
Это помогло. Бесконечно благодарен   -  person Behrooz Karjoo    schedule 26.07.2012
comment
@TimWilliams Пожалуйста, добавьте этот ответ.   -  person brettdj    schedule 26.07.2012


Ответы (3)


Если вы создаете фиктивную функцию, в которой в качестве параметров используются ваши выходные ячейки DDE, вы должны иметь возможность реагировать на событие Worksheet_Calculate?

Я предполагаю, что это может сработать, но у меня нет опыта работы с DDE: обновление DDE может даже вызвать событие Calculate напрямую.

person Tim Williams    schedule 26.07.2012
comment
Итак, в заключение, не нужно использовать условное форматирование. Worksheet_Calculate реагирует на изменения dde. - person Behrooz Karjoo; 26.07.2012

Если вы спрашиваете, можете ли вы использовать условное форматирование для запуска события, да, это возможно. Однако я сам не знаком с моделью DDE, и смешивание условного форматирования для запуска события из условия данных кажется дополнительным шагом, как отмечает Stepan1010.

Вы можете рассмотреть обсуждение в Mr Excel по этой ссылке, так как проблема связана с изменением значения ячейки на основе изменений, внесенных в ячейки из соединения DDE: http://www.mrexcel.com/forum/showthread.php?176508-Comments-VBA-amp-Min-Max

Вы также можете рассмотреть возможность использования DoEvent с циклом, установленным на период времени, в зависимости от того, как долго вы фактически будете реализовывать макрос, если это применимо к вашему приложению. Эта статья SO посвящена строке состояния, но я думаю, что та же логика применима к выполнению события, скажем, на основе условного выражения в цикле: Принудительное обновление экрана в Excel VBA

Надеюсь, это будет полезно для вас =)

~ДжОЛ

person DotNetDeveloper    schedule 25.07.2012

Почему бы вам просто не воссоздать любую логику условного форматирования, которая у вас есть в этой ячейке, в отдельную ячейку?

Например, ваша логика условного форматирования может выделить ячейку, когда она превышает определенное число — вы можете просто поместить эту логику в другую ячейку, например. =если(A1>100,ИСТИНА,ЛОЖЬ)

Итак, я думаю, мой вопрос: зачем выбирать событие изменения формата, когда вы можете просто выбрать само событие?

Изменить для вашего разъяснения:

Если вы хотите непрерывно запускать макрос в VBA, вам не нужен таймер - вы можете просто выполнить непрерывный цикл следующим образом:

Sub macro1()

    Dim i As Double

    With Sheet1

        Do

            '.Cells(5, 4).Value = i

            i = i + 1

            .Cells(1, 1).Value = i

            ' you are going to want to comment this out if you want to don't need to do other things
            DoEvents

            If Sheets("Sheet1").Range("A2").Value = True Then
                ' put your code here.
            End If
        Loop

    End With
End Sub

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

person Stepan1010    schedule 25.07.2012
comment
Как мне зафиксировать изменение другой ячейки в VBA? - person Behrooz Karjoo; 26.07.2012
comment
Это базовый vba: If Sheets(Sheet1).Range(A1).Value = False Then 'здесь ваш код End If - person Stepan1010; 26.07.2012
comment
это не то, чем я хочу заниматься. читайте мои пояснения выше. - person Behrooz Karjoo; 26.07.2012
comment
Я попробовал цикл с doevents в нем. Он работает около 10 секунд, а затем замораживает книгу. Я не знаю почему, но, возможно, 450+ ссылок dde как-то связаны с этим. - person Behrooz Karjoo; 26.07.2012