bg

Получение данных в Excel через интерфейс DDE с помощью модуля DDE Server

Сценарий проблемы:

Лабораторный инструмент имеет RS232 порт, через который выводятся данные каждые 10 минут. Я хотел бы использовать значения из выводимых данных в формах, формулах и моих скриптах VBA в документах Microsoft Excel.

Требования:

Подразумевается что:

Вы настроили параметры связи с устройством (скорость, количество бит данных, контроль передачи и т.п.) в логгере и можете принимать данные без каких либо ошибок.

Вы можете работать в Microsoft Excel, в частности создавать и использовать формы.

Решение:

Замечание: Этот пример базируется на предыдущем примере с именем "Данные из последовательного порта и Excel. Рисование графиков в реальном времени". Этот пример будет использовать настройки парсера и пример данных их этого примера. Поэтому вы можете прочитать этот обучающий пример перед продолжением чтения этого примера.

Парсер готов и мы протестировали его в предыдущем примере. Если парсер верно настроен, то в окне DDE сервера будут отображены наши переменные и их значения (рис.1).

Данные из COM порта, Excel и DDE. Окно DDE сервера.
Рис.1. Данные из COM порта, Excel и DDE. Окно DDE сервера.

Все переменные теперь готовы для использования в Microsoft Excel. Имя переменной отображается в колонке "Имя". Вы должны знать имя DDE сервера и имя топика для того, чтобы получать данные через DDE. Эта информация представлена на следующем рисунке (рис.2 поз.1). Пожалуйста, обратите внимание, что имя сервера может отличаться на вашем компьютере.

Данные из COM порта, Excel и DDE. Параметры сервера DDE.
Рис.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.

Данные из COM порта, Excel и DDE. Ссылки на данные DDE.
Рис.3. Данные из COM порта, Excel и DDE. Ссылки на данные DDE.

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

Теперь мы готовы для создания кода VBA, который будет обрабатывать наши DDE данные. Этот код будет копировать значения DDE в колонки, передвигать старые значения и добавлять строки в историю значений (рис.4, 5).

Данные из COM порта, Excel и DDE. Исходный документ Excel.
Рис.4. Данные из COM порта, Excel и DDE. Исходный документ Excel.

Рисунок выше содержит следующие элементы:

  1. Данные DDE будут помещаться здесь, и будут служить источником данных для графиков;
  2. График;
  3. История данных.

Код 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).

Данные из COM порта, Excel и DDE. Результаты.
Рис.5 Данные из COM порта, Excel и DDE. Результаты.

Рисунок выше содержит следующее:

  1. Последние 30 значений DDE данных;
  2. Последние значения переменных DDE сервера;
  3. История данных DDE.

Файл Excel со всеми значениями и графиками вы можете скачать здесь.

Этот метод получения данных сложен и может быть непонятен для неподготовленного пользователя, но позволяет вам обрабатывать и отображать данные как вам хочется. Позднее, вы можете сделать следующие улучшения:

  1. Помечать некоторые значения цветом;
  2. Добавлять метку даты/времени в историю и автоматически очищать историю;
  3. Использовать формулы и вычисления.

Сопутствующие статьи: