Получение данных в Excel через интерфейс DDE с помощью модуля DDE Server
Сценарий проблемы:
Лабораторный инструмент имеет RS232 порт, через который выводятся данные каждые 10 минут. Я хотел бы использовать значения из выводимых данных в формах, формулах и моих скриптах VBA в документах Microsoft Excel.
Требования:
Подразумевается что:
Вы настроили параметры связи с устройством (скорость, количество бит данных, контроль передачи и т.п.) в логгере и можете принимать данные без каких либо ошибок.
Вы можете работать в Microsoft Excel, в частности создавать и использовать формы.
Решение:
Замечание: Этот пример базируется на предыдущем примере с именем "Данные из последовательного порта и Excel. Рисование графиков в реальном времени". Этот пример будет использовать настройки парсера и пример данных их этого примера. Поэтому вы можете прочитать этот обучающий пример перед продолжением чтения этого примера.
Парсер готов и мы протестировали его в предыдущем примере. Если парсер верно настроен, то в окне DDE сервера будут отображены наши переменные и их значения (рис.1).
Рис.1. Данные из COM порта, Excel и DDE. Окно DDE сервера.
Все переменные теперь готовы для использования в Microsoft Excel. Имя переменной отображается в колонке "Имя". Вы должны знать имя DDE сервера и имя топика для того, чтобы получать данные через DDE. Эта информация представлена на следующем рисунке (рис.2 поз.1). Пожалуйста, обратите внимание, что имя сервера может отличаться на вашем компьютере.
Рис.2. Данные из COM порта, Excel и DDE. Параметры сервера DDE.
Кликните на кнопке "OK" и закройте окно настройки модуля сервера DDE, а затем кликните кнопку "OK" в окне настройки конфигурации.
Поскольку мы хотим рисовать графики в реальном времени, то мы должны подготовить файл Excel перед следующим шагом. В этом примере мы создали диаграмму с тремя графиками. Каждый график базируется на данных их колонок A, B или C. Мы будем помещать значения переменных FLOW1, VOLW1 и TEMP1 в соответствующую колонку, а Excel будет автоматически обновлять нашу диаграмму. Мы будем использовать только последние 30 значений на нашей диаграмме. В этом примере мы поместили 3 ссылки на DDE переменные в ячейки D21-F21 вида: "=testcore|ddesrv!srviFLOW1" (без кавычек) (рис.3 и 4). Как вы можете видеть, имя сервера, имя топика и имя переменной указаны в этой ссылке на данные DDE.
Рис.3. Данные из COM порта, Excel и DDE. Ссылки на данные DDE.
После того как вы создали ссылки на данные DDE в вашем документе, Microsoft Excel автоматически запустит логгер и получит данные. Если логгер уже запущен, то Microsoft Excel попробует считать данные из запущенной программы. Если логгер еще не получил и не обработал никаких данных, то Microsoft Excel отобразит информацию о неверной ссылке, но считает значения, как только данные будут получены и обработаны логгером.
Теперь мы готовы для создания кода VBA, который будет обрабатывать наши DDE данные. Этот код будет копировать значения DDE в колонки, передвигать старые значения и добавлять строки в историю значений (рис.4, 5).
Рис.4. Данные из COM порта, Excel и DDE. Исходный документ Excel.
Рисунок выше содержит следующие элементы:
- Данные DDE будут помещаться здесь, и будут служить источником данных для графиков;
- График;
- История данных.
Код VBA из файла Excel
Private Sub btnClear_Click()
lbHistory.Clear
'MsgBox (CStr(Target.Row) + ":" + CStr(Target.Column))
End Sub
Public Sub Process_Value(ByVal X_Coord As Long, ByVal ValueName As String, ByVal Value As Variant)
Dim TmpValue As Variant
Dim LastIndex As Long
' if we've read and non-numeric value, then replace it by ### in the grid
If IsNumeric(Value) Then
TmpValue = Value
Else
TmpValue = "####"
End If
' search for an empty cell
LastIndex = 0
For I = 1 To 30
If Cells(I, X_Coord).Value = "" Then
LastIndex = I
Exit For
End If
Next
' if we did not find an empty cell the move old value
If LastIndex = 0 Then
LastIndex = 30
For I = 2 To 30
Cells(I - 1, X_Coord).Value = Cells(I, X_Coord).Value
Next
End If
' place new value to the cell
Cells(LastIndex, X_Coord).Value = TmpValue
' add new value to the history list
lbHistory.AddItem (ValueName + ": " + CStr(TmpValue))
End Sub
Private Sub btnClearData_Click()
For I = 1 To 30
Cells(I, 1).Value = ""
Cells(I, 2).Value = ""
Cells(I, 3).Value = ""
Next
End Sub
Private Sub btnClearHistory_Click()
lbHistory.Clear
End Sub
Private Sub Worksheet_Calculate()
On Error GoTo ErrHandler
Application.EnableEvents = False
Call Process_Value(1, "FLOW1", Cells(21, 4).Value)
Call Process_Value(2, "VOLW1", Cells(21, 5).Value)
Call Process_Value(3, "TEMP1", Cells(21, 6).Value)
Application.EnableEvents = True
ErrHandler:
Application.EnableEvents = True
End Sub
Файл Excel, который мы создали, вы можете скачать здесь и использовать в вашей работе.
Хорошо. Процедура настройки завершена и пришло время попробовать получить данные в Excel.
Подсоедините ваше устройство или включите его, если это необходимо. Попробуйте принять пакет данных от устройства. Если парсер верно настроен, то в Excel будут отображены наши DDE переменные и их значения (рис.5).
Рис.5 Данные из COM порта, Excel и DDE. Результаты.
Рисунок выше содержит следующее:
- Последние 30 значений DDE данных;
- Последние значения переменных DDE сервера;
- История данных DDE.
Файл Excel со всеми значениями и графиками вы можете скачать здесь.
Этот метод получения данных сложен и может быть непонятен для неподготовленного пользователя, но позволяет вам обрабатывать и отображать данные как вам хочется. Позднее, вы можете сделать следующие улучшения:
- Помечать некоторые значения цветом;
- Добавлять метку даты/времени в историю и автоматически очищать историю;
- Использовать формулы и вычисления.
Сопутствующие статьи: