Что такое контроллер в excel

Время на прочтение
7 мин

Количество просмотров 2.1K

В статье описан простой контроллер инициализации модулей VBA Excel.

Все типы модулей VBA MS Excel позволяют создавать код, автоматически выполняемый при загрузке и/или выгрузке модуля.

Однако, для обычных модулей с макросами, VBComponent.Type=001, примера автоматической инициализации автор в сети не обнаружил.

Вступление

Автоматическая инициализация модуля VBA MS Excel производится по факту наличия в модуле подпрограммы с заданным интерфейсом.

Это удобно. Наличие подпрограммы с заданным интерфейсом включает автоматические инициализацию модуля. Удаление из кода модуля подпрограммы — выключает.

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

Private Sub Worksheet_Activate()
    ' your code here
End Sub

Private Sub Worksheet_Deactivate()
    ' your code here
End Sub

Первая подпрограмма автоматически вызывается перед получением фокуса ввода. Например, для установки начальных значений переменных.

Вторая — перед тем как, как фокус ввода будет потерян.

В других листах электронных таблиц эти функции могут отсутствовать, если в инициализации там потребности нет.

Таким же образом устроен механизм инициализации классов, книг и форм MS Excel.

Но, иногда возникает потребность автоматической инициализации обычных модулей с макросами, Type=001.

Постановка задачи

  1. Создать автоматический вызов процедур инициализации и завершения для обычных модулей VBA.

  2. Повторить привычный механизм управления инициализацией — наличие в модуле VBA подпрограммы с известным именем.

  3. Осуществлять автоматически инициализацию и завершение только тех модулей VBA, где присутствуют соответствующие подпрограммы.

Решение задачи

Синтаксис MS EXCEL VBA, допускает:

  1. размещение в разных модулях подпрограмм с одинаковыми именами и интерфейсом;

  2. косвенный вызов подпрограмм VBA по имени внутри переменной;

  3. уточняющий синтаксис VBA.

Договоримся об именовании подпрограмм инициализации и завершения:

  • moduleInit(ByRef Wb As Workbook) — автоматически вызываемая процедура инициализации;

  • moduleLeave(ByRef Wb As Workbook) — автоматически вызываемая процедура завершения;

  • В любом модуле VBA, подпрограммы инициализации могут отсутствовать или присутствовать, совместно или по одной.

Подпрограммы инициализации принимают один параметр, Wb, хранящий ссылку на книгу, для которой производится инициализация модуля макросов.

Инициализируемый модуль определяется местоположением вызываемой подпрограммы.

Для включения автоматической инициализации добавляем в любое место модуля макросов подпрограмму инициализации:

Option Explicit

' Your VBA module code here

Public Sub moduleInit(ByRef Wb As Workbook)

' The starting code for your VBA module is here

End Sub

Для завершения работы модуля, помещаем соответствующую подпрограмму где-нибудь рядом:

Option Explicit

' Your VBA module code here

Public Sub moduleLeave(ByRef Wb As Workbook)

' The final code for your VBA module is here

End Sub

Public Sub moduleInit(ByRef Wb As Workbook)

' The starting code for your VBA module is here

End Sub

Удаляем текст договорных подпрограмм, если потребности в инициализации модуля нет.

Контроллер инициализации

Интерфейс контроллера инициализации содержит две константы и одну подпрограмму.

Public Const vbaMODULE_INIT As String = "moduleInit"
Public Const vbaMODULE_LEAVE As String = "moduleLeave"

Public Sub vbaWbModuleControl( _
			subName As String, _
			Optional printDebugOnly As Boolean = False)

Константы закрепляют договор вызова подпрограмм инициализации и завершения обычных модулей VBA MS Excel.

Прототипы подпрограмм инициализации завершения:

Public Sub moduleInit(ByRef Wb As Workbook)	' module initialization
Public Sub moduleLeave(ByRef Wb As Workbook)	' module completion

В подпрограмме контроллера инициализации vbaWbModuleControl два параметра:

  • subName — название подпрограммы инициализации или завершения;

  • printDebugOnly — запуск контроллера в режиме отладки.

Каждый раз при вызове, контроллер инициализации «пробегает» по всем модулям проекта VBA MS Excel, создаёт список подпрограмм с именем subName по факту их присутствия, запускает на исполнение передавая, как параметр, объект рабочей книги.

Порядок запуска подпрограмм инициализации определяется порядком создания модулей VBA.

Запуск vbaWbModuleControl с параметром printDebugOnly=True выдаёт на консоль отладки список всех функций инициализации или завершения в порядке вызова, но без вызова.

Для инициализации модулей макросов по событиям получения или потери фокуса ввода электронной таблицы, контроллер инициализации размещается в обработчике событий _Activate().

Private Sub Workbook_Activate()

	vbaWbModuleControl vbaMODULE_INIT

End Sub

Private Sub Workbook_Deactivate()

	vbaWbModuleControl vbaMODULE_LEAVE

End Sub

Для одноразового вызова процедур инициализации и завершения достаточно переместить вызов контроллера в обработчики открытия и закрытия книги электронной таблицы.

Private Sub Workbook_Open()

 	vbaWbModuleControl vbaMODULE_INIT

End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)

  vbaWbModuleControl vbaMODULE_LEAVE

End Sub

Для восстановления инициализации после сбоя во время отладки контроллер запускается в ручном режиме.

Sub ReInitProject()

 	vbaWbModuleControl vbaMODULE_INIT

End Sub

Интеграция контроллера

Контроллер инициализации интегрируется в новый проект простым переносом исходного текста [^C;^V] в модуль макросов VBA Excel.

Контроллер работает без начальной инициализации.

В современных версиях MS Excel дополнительно отмечается чекбокс «Доверять доступ к объектной модели макросов VBA» в разделе «Центр управления безопасности».

Исходный код контроллера инициализации

Attribute VB_Name = "mWbInit"
'***************************************************************************
' Module "mWbInit.bas"
' Controller for automatic initialization of VBA modules
'
' Copyright (c) 2022, "Nikolay E. Garbuz" <nik_garbuz@list.ru>
'
' This program is free software: you can redistribute it and/or modify
' it under the terms of the GNU Lesser General Public License version 3 as
' published by the Free Software Foundation.
'
' This program is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY; without even the implied warranty of
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
' GNU General Public License for more details.
'
' You should have received a copy of the GNU Lesser General Public License
' along with this program.  If not, see <http://www.gnu.org/licenses/>.
'
' Authored by Nikolay Garbuz <nik_garbuz@list.ru>
' Modified by
'
' TAB Size .EQ 4
'***************************************************************************

Option Explicit
Option Compare Text

' Public Sub moduleInit(ByRef Wb As Workbook)
Public Const vbaMODULE_INIT As String = "moduleInit"

' Public Sub moduleLeave(ByRef Wb As Workbook)
Public Const vbaMODULE_LEAVE As String = "moduleLeave"


' Call vbaWbModuleControl vbaMODULE_INIT    ' for initialization
' Call vbaWbModuleControl vbaMODULE_LEAVE   ' for release

Public _
Sub vbaWbModuleControl( _
                        subName As String, _
                        Optional printDebugOnly As Boolean = False _
)
    vbaWbModuleRun ThisWorkbook, subName, printDebugOnly
End Sub

Public _
Sub vbaWbModuleRun( _
                    ByRef Wb As Workbook, _
                    subName As String, _
                    Optional printDebugOnly As Boolean = False _
)
    Dim i As Integer
    Dim subList() As String
    
    i = vbaSubroutineList(ThisWorkbook, subName, subList)
    
    If i > 0 Then
        If printDebugOnly Then
            Debug.Print Join(subList(), vbCrLf)
        Else
            For i = LBound(subList) To UBound(subList)
                Application.Run subList(i), Wb
            Next i
        End If
    End If
    
    Erase subList
End Sub

Private _
Function vbaSubroutineList( _
                                ByRef Wb As Workbook, _
                                sName As String, _
                                ByRef sList() As String _
) As Integer

    Dim i As Long
    Dim j As Long
    Dim k As Long
    Dim l As Long
    Dim sc As Long
    Dim fc As Long
    Dim sLine As String
    Dim modName As String
    Dim subName As String
    Dim chkName As String
    
    ReDim sList(0)
    
    i = InStr(sName, ".")
    
    If i > 0 Then
        modName = Left(sName, i - 1)
        subName = Mid(sName, i + 1)
    Else
        modName = ""
        subName = sName
    End If
    
    sc = vbaModuleIdx(Wb, modName)
    If sc > 0 Then
        fc = sc
    Else
        sc = 1
        fc = Wb.VBProject.VBComponents.Count
    End If
    
    With Wb.VBProject.VBComponents
        For i = sc To fc
            l = .Item(i).CodeModule.CountOfLines
            For j = 1 To l
                chkName = ""
                Do
                    sLine = .Item(i).CodeModule.Lines(j, 1)
                    If Right(sLine, 1) = "_" Then
                        chkName = chkName & Left(sLine, Len(sLine) - 1)
                        j = j + 1
                    Else
                        chkName = chkName & sLine
                        Exit Do
                    End If
                Loop

                chkName = vbaRemComment(chkName)
                chkName = vbaRemPrefix(chkName)
                chkName = vbaRemIdentLine(chkName)
                chkName = vbaSubroutineName(chkName)
                
                If chkName <> "" Then
                    If subName = "*" Or StrComp(subName, chkName) = 0 Then
                        If UBound(sList) < k Then
                            ReDim Preserve sList(UBound(sList) + 10)
                        End If
                        
                        sList(k) = .Item(i).Name & "." & chkName
                        k = k + 1
                    End If
                End If
            Next j
        Next i
    End With
    
    If k > 0 Then
        ReDim Preserve sList(k - 1)
    End If

    vbaSubroutineList = k

End Function

Private _
Function vbaModuleIdx( _
    							ByRef Wb As Workbook, _
    							sModuleName As String _
) As Integer

    Dim i As Integer
    Dim m As String
    
    vbaModuleIdx = 0
    
    With Wb.VBProject.VBComponents
        For i = 1 To .Count
            m = .Item(i).Name
            If StrComp(sModuleName, m) = 0 Then
                vbaModuleIdx = i
                Exit Function
            End If
        Next i
    End With
    
End Function

Private _
Function vbaSubroutineName(sLn As String) As String
    
    Const maskSubName As String = "sub *(*)*"
    Const maskFuncName As String = "function *(*)*"
    
    Dim p_space As Integer
    Dim p_bra As Integer
    Dim sn As String
    
    sn = ""
    
    If (sLn Like maskSubName) Or (sLn Like maskFuncName) Then
        p_space = InStr(sLn, " ") + 1
        p_bra = InStr(sLn, "(")
        sn = Mid(sLn, p_space, p_bra - p_space)
    End If
    
    vbaSubroutineName = Trim(sn)

End Function

Private _
Function vbaRemComment(sLn As String) As String
    
    Const comSymbols = "REM ,', REM ,: REM "
   
    Dim i As Long
    Dim s As String
    Dim pc As Long
    
    Static csym() As String

    On Error GoTo InitArray

    i = 0
    Do
        s = csym(i)
        
        pc = InStr(sLn, s)
        
        If pc = 1 Then
            sLn = ""
            Exit Do
        Else
            If pc > 1 And i > 0 Then
                sLn = Left(sLn, pc - 1)
                Exit Do
            End If
        End If
        
        i = i + 1
    Loop Until i > UBound(csym)
    
    vbaRemComment = sLn
    
    On Error GoTo 0
    
    Exit Function
    
InitArray:
    csym = Split(comSymbols, ",")
    s = csym(0)
    Resume Next
    
End Function

Private _
Function vbaRemPrefix(sLn As String) As String
    
      Const prefixKeys = "Public ,Private ,Friend ,Static "

    Dim i As Long
    Dim s As String
    Dim ps As Long
    Dim pf As Long
    
    Static pref() As String
    
    On Error GoTo InitArray
    
    i = 0
    Do
        s = pref(i)
        
        ps = InStr(sLn, s)
        
        If ps > 0 Then
            pf = ps + Len(s)
            If ps = 1 Then
                sLn = Mid(sLn, pf)
            Else
                sLn = Left(sLn, ps - 1) & Mid(sLn, pf)
            End If
        End If
        
        i = i + 1
    Loop Until i > UBound(pref)
    
    vbaRemPrefix = sLn
    
    On Error GoTo 0
    
    Exit Function
    
InitArray:
    pref = Split(prefixKeys, ",")
    s = pref(0)
    Resume Next
    
End Function

Private _
Function vbaRemIdentLine(sLn As String) As String
    
    Const lnSymbols = " " & vbTab & vbCr & vbLf

    While sLn <> "" And InStr(lnSymbols, Left(sLn, 1)) > 0
        sLn = Mid(sLn, 2)
    Wend
    
    vbaRemIdentLine = sLn
End Function

Excel

Для того чтобы обезопасить себя от ошибок (описок) при вводе каких-то показателей или данных, работая в Excel, мы с помощью самой программы имеем возможность контролировать правильность занесения этих самых показателей в ячейки.

Для приведения контроллера в действие нам необходимо задать ему определённые условия и установить необходимые параметры. Правда за всем-всем контроль установить мы не можем, но и предлагаемых условий вполне может быть достаточно.

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

Первым нашим шагом станет открытие вкладки «Данные» верхнего меню:

 Контроль ввода данных в Excel 2010

В этой вкладке мы направим своё внимание на раздел под названием «Работа с данными»:

 Контроль ввода данных в Excel 2010

Ну, а в самом разделе устремимся взором на функционал поименованный «Проверка данных»:

 Контроль ввода данных в Excel 2010

Давайте щелчком левой кнопки мыши по стрелочке справа от названия откроем этот функционал и посмотрим на содержащиеся в нём опции:

 Контроль ввода данных в Excel 2010 

Нам сейчас интересна первая самая верхняя опция. Одним щелчком развернём её окно, чтобы посмотреть на содержимое:

 Контроль ввода данных в Excel 2010

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

Например, мы собираемся вводить в ячейки показатели, содержащие не менее и не более 5-ти нулей. Конечно, если количество самих показателей не более пяти, то вероятность недобрать нули или перебрать, невелика. А если количество показателей значительно больше, то после 125-го введённого показателя, в наших глазах появится мелькание нулей, резь и слезливость. Нам это нужно? Нет!

Давайте на простом примере с этими нулями проверим, как контроллер работает.

На практике работа контроллера будет выражаться появлением окошка сообщения о нарушении условий ввода, которые мы же сами и определим. Предположим, что ввод показателей будет производиться нами в ячейки столбца «В». Выделим его, щёлкнув единожды по букве «В»:

 Контроль ввода данных в Excel 2010

Затем откроем окошко проверки данных и начнём работу с параметрами:

 Контроль ввода данных в Excel 2010

В окошке «Тип данных» установим параметр «Целое число»:

 Контроль ввода данных в Excel 2010

В поле «Значение» выберем из списка параметр «Между»:

 Контроль ввода данных в Excel 2010

После того как мы выбрали этот параметр в нижней части окошка появились две строки ввода поименованные «Минимум» и «Максимум»:

 Контроль ввода данных в Excel 2010

Поскольку в нашем примере показатели не должны содержать менее или более пяти нулей, то в строку минимума мы собственноручно впишем параметр равный 100 000, а в строку максимума 900 000:

 Контроль ввода данных в Excel 2010

Нажимать кнопку «Ок» не спешим, а в верхней части окошка открываем следующую вкладку с названием «Сообщение для ввода»:

 Контроль ввода данных в Excel 2010

Строки этой вкладки мы заполняем произвольно, вводя любой текст, какой только захотим. Число символов заголовка ограничено, поэтому, решив написать заголовок, мы не должны делать его слишком длинным. Текст сообщения, напротив, предусматривает большое количество слов. На мой взгляд, без острой на то необходимости, строки этой вкладки можно и не заполнять. Мы можем, даже снять галочку с отображения подсказки ввода в текущую ячейку. Но если мы сочтём появление подсказки ещё до начала ввода показателей (данных) жизненно необходимой, то эта самая подсказка будет появляться одновременно с помещением курсора в ту ячейку, в которую мы собираемся вводить показатель:

 Контроль ввода данных в Excel 2010

В общем, с заполнением строк этой вкладки поступаем на своё усмотрение.

Давайте откроем следующую вкладку поименованную «Сообщение об ошибке»:

 Контроль ввода данных в Excel 2010

В этой вкладке мы также можем ввести заголовок и сам текст сообщения. На мой взгляд, заполнение одного лишь поля «Сообщение» вполне будет достаточно. При выборе одного из вариантов: Остановка, Предупреждение, Сообщение раздела «Вид» мы должны быть готовы к тому, что варианты Предупреждение и Сообщение выполнив каждый свою задачу (предупредив или же сообщив) всё же позволят осуществить ввод показателя не соответствующего условию:

  Контроль ввода данных в Excel 2010

А вот вариант остановки ввода не позволит продолжать ввод данных или каких-то показателей в те предварительно выделенные ячейки, пока в ячейке с данными, внесёнными с нарушением условий, не будут произведены изменения или же ввод и вовсе прекращён:

 Контроль ввода данных в Excel 2010

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

Оставить комментарий

  1. Обязательно представиться на русском языке кириллицей (заполнить поле «Имя»).
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему — вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома — бан без предупреждения.
  5. Рекламу и частные объявления «куплю/продам/есть халтура» мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать — читать здесь и здесь.

bublonikon

здесь недавно
здесь недавно
Сообщения: 7
Зарегистрирован: 31 окт 2018, 11:53
Имя: Алексей
Страна: Россия
город/регион: г Полевской

Из контроллера в Exel

Сообщение

bublonikon » 08 ноя 2018, 21:25

Подскажите, мож кто делал уже.
Необходимо состояние дискретного выхода раз в секунду писать в exel не используя визуализацию.
Понятно что данные нужно дергать из OPC-сервера. Но как это сделать? Голова уже пухнет от натуги. :icon_wall:

Аватара пользователя

Jackson

администратор
администратор
Сообщения: 15840
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 563 раза
Поблагодарили: 995 раз

Из контроллера в Exel

Сообщение

Jackson » 10 ноя 2018, 23:24

bublonikon писал(а): ↑08 ноя 2018, 21:25
Понятно что данные нужно дергать из OPC-сервера

Это как раз совсем неочевидно.

bublonikon писал(а): ↑08 ноя 2018, 21:25
Голова уже пухнет от натуги

Чтобы кто-то смог Вам помочь, Вам лучше полностью описать задачу: вход ЧЕГО, например, где ОНО установлено, где Excel при этом, какие доступны интерфейсы, и т.д.

Можете, например, взять и написать программку, которая будет это делать.

По вопросам работы Форума можно обратиться по этим контактам.

bublonikon

здесь недавно
здесь недавно
Сообщения: 7
Зарегистрирован: 31 окт 2018, 11:53
Имя: Алексей
Страна: Россия
город/регион: г Полевской

Из контроллера в Exel

Сообщение

bublonikon » 12 ноя 2018, 07:44

Jackson писал(а): ↑10 ноя 2018, 23:24
где ОНО установлено, где Excel при этом, какие доступны интерфейсы, и т.д.

Контроллер S7-300. Управляет открытием-закрытием задвижки с дискретных выходов. Компьютер подключен к PLC по ethernet. Состояние этих выходов необходимо раз в секунду писать в Exel.
Получается что нужно чтобы Exel раз в секунду дергал данные из OPC-сервера к себе. Знаю что можно написать в экселе скрипт на Visual basik который будет это делать. Но в Visual нет познаний.
Может у кого уже есть такие наработки.

Ryzhij

почётный участник форума
почётный участник форума
Сообщения: 5373
Зарегистрирован: 07 окт 2011, 09:12
Имя: Гаско Вячеслав Эриевич
Страна: Россия
город/регион: Рязань
Благодарил (а): 424 раза
Поблагодарили: 617 раз

Из контроллера в Exel

Сообщение

Ryzhij » 12 ноя 2018, 07:54

В сети информации полно.
Например тут, здесь http://portalnp.ru/wp-content/uploads/2 … _Ed_31.pdf
или тут, в конце-концов.

—————————————————
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
«Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить.» (святитель Николай Сербский)

bublonikon

здесь недавно
здесь недавно
Сообщения: 7
Зарегистрирован: 31 окт 2018, 11:53
Имя: Алексей
Страна: Россия
город/регион: г Полевской

Из контроллера в Exel

Сообщение

bublonikon » 12 ноя 2018, 10:12

Ryzhij писал(а): ↑12 ноя 2018, 07:54
В сети информации полно.
Например тут…

Ну все равно Visual придется изучать.
Буду разбираться, полезно будет.
Спасибо за ответ!

Аватара пользователя

Jackson

администратор
администратор
Сообщения: 15840
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 563 раза
Поблагодарили: 995 раз

Из контроллера в Exel

Сообщение

Jackson » 12 ноя 2018, 11:50

bublonikon писал(а): ↑12 ноя 2018, 10:12
Ну все равно Visual придется изучать.

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

По вопросам работы Форума можно обратиться по этим контактам.

bublonikon

здесь недавно
здесь недавно
Сообщения: 7
Зарегистрирован: 31 окт 2018, 11:53
Имя: Алексей
Страна: Россия
город/регион: г Полевской

Из контроллера в Exel

Сообщение

bublonikon » 12 ноя 2018, 22:45

Думаю разберусь. Одним языком в багаже за спиной больше станет.

Аватара пользователя

MuadDib

частый гость
частый гость
Сообщения: 462
Зарегистрирован: 31 июл 2010, 09:12
Имя: Павел
Страна: РФ
Благодарил (а): 8 раз
Поблагодарили: 13 раз

Из контроллера в Exel

Сообщение

MuadDib » 13 ноя 2018, 11:39

К приведенным выше ссылкам добавлю вот эту:
http://gray-box.net/daawrapper.php?lang=ru

OPC-серверы зачастую предоставляют только custom-интерфейс и не поддерживают OLE Automation. А из VBA вы можете работать только с Automation (или dual) интерфейсами. Wrapper по ссылке позволяет обойти это ограничение.

Аватара пользователя

MuadDib

частый гость
частый гость
Сообщения: 462
Зарегистрирован: 31 июл 2010, 09:12
Имя: Павел
Страна: РФ
Благодарил (а): 8 раз
Поблагодарили: 13 раз

Из контроллера в Exel

Сообщение

MuadDib » 13 ноя 2018, 12:32

К слову, обеспечить периодическую работу макроса («раз в секунду писать в файл данные из OPC) в рамках Excel VBA не так-то просто. Макросы VBA привязываются к событиям типа «юзер кликнул кнопку на листе» или «происходит сохранение workbook». Для периодического процессинга в фоновом режиме готового решения нет.

В свое время я делал в экселе однократный вызов функции VBA с выдержкой по времени. Для этого пришлось задействовать функции Windows API, в частности, SetTimer:

https://docs.microsoft.com/en-us/window … r-settimer

Эту же функцию можно использовать и для периодической активности, но как все это будет работать в жизни — большой вопрос. Короче, ждите приключений :crazy0to:

Впрочем, мои упражнения были еще во времена Excel 2003, и, возможно, сейчас есть нечто, что упростит вам жизнь. Если найдете чисто VBA решение, поделитесь плиз.

Но в любом случае, идея писать данные в Excel каждую секунду не очень хорошая. Такое надо делать с базой данных, на худой конец, с CSV. Но уж никак не в Excel.

Аватара пользователя

Jackson

администратор
администратор
Сообщения: 15840
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 563 раза
Поблагодарили: 995 раз

Из контроллера в Exel

Сообщение

Jackson » 13 ноя 2018, 14:03

MuadDib писал(а): ↑13 ноя 2018, 12:32
Но в любом случае, идея писать данные в Excel каждую секунду не очень хорошая. Такое надо делать с базой данных, на худой конец, с CSV. Но уж никак не в Excel.

С чего такой вывод? Вы же не знаете цели автора.
Я сам такими вещами балуюсь во время наладок, и уверен что не я один.

По вопросам работы Форума можно обратиться по этим контактам.

winb

освоился
освоился
Сообщения: 248
Зарегистрирован: 31 янв 2017, 08:44
Имя: Маркушин Андрей Геннадьевич
Страна: Россия
город/регион: Нижегородская обл., Выкса
Благодарил (а): 14 раз
Поблагодарили: 59 раз

Из контроллера в Exel

Сообщение

winb » 13 ноя 2018, 15:14

Если совсем дешево и без претензий на супер-надежность работы нужно, то для .Net есть бесплатные библиотечки для связи с контроллерами по S7 (TCP/IP). Ставите бесплатную версию Visual Studio, NuGet-ом тяните из сети библиотеку, несколько часов на разобраться и вперед тянуть данные. Всяко лучше Эксельного VBA будет.

Аватара пользователя

MuadDib

частый гость
частый гость
Сообщения: 462
Зарегистрирован: 31 июл 2010, 09:12
Имя: Павел
Страна: РФ
Благодарил (а): 8 раз
Поблагодарили: 13 раз

Из контроллера в Exel

Сообщение

MuadDib » 14 ноя 2018, 04:14

Jackson писал(а): ↑13 ноя 2018, 14:03
С чего такой вывод? Вы же не знаете цели автора.
Я сам такими вещами балуюсь во время наладок, и уверен что не я один.

Как временное решение с ручным запуском-остановом может и прокатит, хотя гемора даже для «времянки» слишком много. На постоянной основе — надо искать другое решение.

Отправлено спустя 5 минут 24 секунды:

winb писал(а): ↑13 ноя 2018, 15:14
Если совсем дешево и без претензий на супер-надежность работы нужно, то для .Net есть бесплатные библиотечки для связи с контроллерами по S7 (TCP/IP). Ставите бесплатную версию Visual Studio, NuGet-ом тяните из сети библиотеку, несколько часов на разобраться и вперед тянуть данные. Всяко лучше Эксельного VBA будет.

Согласен, в такой задаче гораздо эффективнее задействовать .NET. Порог вхождения выше, но проблем и ограничений в ходе решения будет меньше.

bublonikon

здесь недавно
здесь недавно
Сообщения: 7
Зарегистрирован: 31 окт 2018, 11:53
Имя: Алексей
Страна: Россия
город/регион: г Полевской

Из контроллера в Exel

Сообщение

bublonikon » 16 ноя 2018, 22:45

MuadDib писал(а): ↑13 ноя 2018, 12:32
Но в любом случае, идея писать данные в Excel каждую секунду не очень хорошая. Такое надо делать с базой данных, на худой конец, с CSV. Но уж никак не в Excel

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

Вернуться в «Simatic Step7»


Перейти

  • Работа форума
  • База знаний (Knowledge Exchange)
  • ↳   Eplan Electric P8
  • ↳   Общий F.A.Q.
  • ↳   Общие вопросы
  • ↳   Новости
  • ↳   Ошибки
  • ↳   Проект
  • ↳   Изделия
  • ↳   Устройства
  • ↳   Соединения
  • ↳   Кабели
  • ↳   Клеммы
  • ↳   ПЛК
  • ↳   Компоновка 2D
  • ↳   Макросы
  • ↳   Eplan API
  • ↳   Сценарии (Только готовые решения)
  • ↳   Внешняя обработка
  • ↳   ProPanel
  • ↳   Инструкции ProPanel (Только готовые решения)
  • ↳   Прочие направления Eplan
  • ↳   FieldSys (Топология)
  • ↳   Preplanning
  • ↳   Harness proD
  • ↳   EEC One
  • ↳   Advantech
  • ↳   F.A.Q., Инструкции
  • ↳   Allen Bradley
  • ↳   Общие вопросы
  • ↳   ПЛК
  • ↳   Операторские панели
  • ↳   B&R Automation
  • ↳   F.A.Q.
  • ↳   Danfoss
  • ↳   DEIF A/S
  • ↳   Общие вопросы
  • ↳   UNI-LINE
  • ↳   MULTI-LINE
  • ↳   MULTI-LINE 300
  • ↳   Emerson
  • ↳   Общие вопросы
  • ↳   КИП и регуляторы
  • ↳   DeltaV
  • ↳   ОВЕН
  • ↳   Прософт-Системы
  • ↳   Общие вопросы
  • ↳   ПЛК REGUL
  • ↳   Schneider Electric
  • ↳   Общие вопросы
  • ↳   ПЛК
  • ↳   Панели оператора
  • ↳   SCADA
  • ↳   Электротехника
  • ↳   Приводная техника
  • ↳   SIEMENS
  • ↳   Общие вопросы
  • ↳   LOGO!
  • ↳   ПЛК SIMATIC (S7-200, S7-1200, S7-300, S7-400, S7-1500, ET200)
  • ↳   Simatic Step7
  • ↳   Simatic TIA Portal
  • ↳   Simatic PCS 7
  • ↳   Операторские панели
  • ↳   WinCC
  • ↳   Приводная техника (Sinamics, Micromaster, Masterdrive, Simoreg, Simotics)
  • ↳   SmartGen
  • ↳   Общие вопросы
  • ↳   Промышленные (береговые) контроллеры
  • ↳   Морские контроллеры и устройства
  • ↳   WEINTEK (операторские панели)
  • ↳   F.A.Q., Инструкции
  • ↳   Архив
  • ↳   Микроконтроллеры и электроника
  • ↳   Arduino
  • ↳   Raspberry
  • ↳   Другие микроконтроллеры
  • ↳   Электроника
  • Общие вопросы АСУТП
  • ↳   Общие вопросы
  • ↳   Вопросы от студентов
  • ↳   Литература
  • ↳   Новости и отчётность
  • ↳   Нормативы, ГОСТы, стандарты
  • ↳   Информационная безопасность
  • ↳   Проектирование и САПР
  • ↳   Системная интеграция
  • ↳   Разбор полетов
  • ↳   Работа
  • ↳   Заготовки для базы знаний
  • ↳   Производство и технология
  • ↳   MES — Системы автоматизации управления производством
  • ↳   Метрология, КИП и датчики
  • ↳   Исполнительные устройства, регуляторы
  • ↳   Средний уровень автоматизации (управляющий)
  • ↳   Алгоритмы
  • ↳   Операторские панели
  • ↳   Верхний уровень автоматизации (отображение)
  • ↳   GE iFix
  • ↳   Wonderware Intouch
  • ↳   MasterScada
  • ↳   SCADA+
  • ↳   Альфа платформа
  • ↳   Интерфейсы, протоколы, связь
  • ↳   Радиосвязь
  • ↳   Полезное ПО
  • ↳   Электротехника, энергетика и электропривод
  • ↳   Генераторы, электростанции и силовые агрегаты
  • ↳   Теплотехника
  • ↳   Подбор аналогов
  • F.A.Q. (краткая выжимка из некоторых сообщений форума)
  • ↳   Документация (вариант 1)
  • ↳   Документация (вариант 2)
  • ↳   Электротехника и электроэнергетика
  • ↳   F.A.Q. по программируемым логическим контроллерам (PLC)
  • ↳   Обсуждение F.A.Q. по PLC
  • ↳   F.A.Q. по выбору PLC
  • ↳   F.A.Q. по аппаратной части PLC
  • ↳   F.A.Q. по языкам программирования
  • ↳   F.A.Q. по структуре программ
  • ↳   F.A.Q. по взаимодействию PLC с HMI
  • О жизни
  • ↳   Для дома, для семьи
  • ↳   Комната смеха
  • ↳   Электродвижение

Часть 1. Microsoft Word и Microsoft Excel

Коротко об автоматизации

VBA и средства разработки контроллеров автоматизации

Объектные модели Microsoft Office

Общие принципы создания контроллеров автоматизации

Автоматизация Microsoft Word

   Программные идентификаторы и объектная модель Microsoft Word

   Создание и открытие документов Microsoft Word

   Сохранение, печать и закрытие документов Microsoft Word

   Вставка текста и объектовв документ и форматирование текста

   Перемещение курсора по тексту

   Создание таблиц

   Обращение к свойствам документа

Автоматизация Microsoft Excel

   Программные идентификаторы и объектная модель Microsoft Excel

   Запуск Microsoft Excel, создание и открытие рабочих книг

   Сохранение, печать и закрытие рабочих книг Microsoft Excel

   Обращение к листам и ячейкам

   Создание
диаграмм

Настоящая статья посвящена теме, может быть, и не новой,
но, как показывают письма читателей, по-прежнему актуальной — автоматизации
приложений Microsoft Office. Многие разработчики в процессе работы над своими
проектами (неважно, с помощью какого средства разработки — Delphi, C++Builder,
Visual Basic…) нередко применяют сервисы, предоставляемые Microsoft Office,
например построение сводных таблиц и диаграмм с помощью Microsoft Excel, генерацию
и печать документов с помощью Microsoft Word и т.д. Нередко пользователи, привыкшие
использовать приложения Microsoft Office в повседневной работе, сами настаивают
на применении в приложениях таких сервисов либо просто на сохранении отчетов
и других документов в одном из форматов Microsoft Office. Отметим, что потенциальные пожелания подобного рода
компанией Microsoft учтены достаточно давно — практически все, что в состоянии
сделать пользователь любого приложения Microsoft Office с помощью меню, клавиатуры
и инструментальной панели, может быть произведено и автоматически, то есть либо
из VBA-программы, либо из приложения, созданного с помощью одного из средств
разработки. Иными словами, приложения Microsoft Office являются программируемыми.
Программируемость в общем случае означает возможность
управления данным приложением с помощью макроязыков либо с помощью других приложений.
Все компоненты Microsoft Office поддерживают один и тот же макроязык: Visual
Basic for Applications (VBA), позволяющий создавать приложения непосредственно
внутри документов Office (это называется «решения на базе Microsoft Office»).
Управление же компонентами Office из других приложений осуществляется с помощью
автоматизации (Automation, ранее — OLE Automation) — все приложения
Microsoft Office являются серверами автоматизации (или COM-серверами).
Для создания таких приложений пригодны любые средства
разработки, позволяющие создавать контроллеры автоматизации (COM-клиенты).
Наиболее часто для этой цели используется Visual Basic,
но это могут быть и Delphi, и C++Builder, и Visual C++. Однако прежде чем обсуждать
возможности тех или иных средств разработки, следует разобраться, что такое
автоматизация.

Коротко об автоматизации

Автоматизация — это одна из возможностей, предоставляемых технологией
Microsoft COM (Component Object Model). Не вдаваясь в подробности реализации
этой технологии, заметим, что она используется приложениями (называемыми COM-серверами)
для предоставления доступа к их объектам, а также к свойствам и методам этих
объектов другим приложениям (называемым COM-клиентами), каковыми могут быть
и средства разработки. Например, текстовый процессор, будучи COM-сервером, может
предоставлять другим приложениям доступ к документу, абзацу, закладке с помощью
соответствующих объектов. Для именования (и опознания) COM-серверов обычно используются
специальные строковые обозначения — программные идентификаторы (Programmatic
Identifier, ProgID). Они нужны для того, чтобы операционная система могла с
помощью этих идентификаторов определить, в каком именно каталоге (или на каком
компьютере локальной сети, если используется тот или иной способ удаленного
доступа к серверу) расположен исполняемый файл сервера автоматизации, и запустить
его на выполнение. О том, какие именно программные идентификаторы применяются
для того или иного приложения Microsoft Office, будет сказано в разделах, посвященных
этим приложениям.

Объекты автоматизации с точки зрения программирования мало чем отличаются от
обычных объектов, знакомых нам из теории и практики объектно-ориентированного
программирования. Как и обычные объекты, они обладают свойствами и методами.
Свойство — это характеристика объекта; например, свойством абзаца (объект
Paragraph) может быть его стиль (Style). Методом называется действие, которое
можно выполнить с объектом (например, можно сохранить документ с помощью метода
SaveAs объекта Document).

Нередко серверы автоматизации содержат наборы однотипных объектов, называемых
коллекциями. Например, текстовый процессор может содержать коллекцию документов,
а каждый документ — коллекцию абзацев.

Как узнать, какие объекты доступны в серверах автоматизации? Для этой цели
в комплект поставки любого сервера автоматизации входит документация и файлы
справки, описывающие их объектную модель. Если брать приложения Microsoft Office
2000, то это справочные файлы для программистов на Visual Basic for Applications
VBAxxx9.CHM (для Microsoft Office 97 — VBxxx8.HLP соответственно). Отметим,
что по умолчанию они не устанавливаются, так как нужны разработчикам, а не рядовым
пользователям.

Вся информация об объектах, необходимая контроллерам автоматизации, содержится
в библиотеках типов. Библиотеки типов хранятся в специальном бинарном формате
и обычно представлены в виде файлов с расширениями *.olb или *.tlb, а также
могут содержаться внутри исполняемых файлов (*.exe) или динамически загружаемых
библиотек (*.dll). Библиотеки типов можно просматривать с помощью утилиты OleView,
входящей в состав Microsoft Platform SDK, а средства разработки фирмы Borland
содержат свои собственные утилиты просмотра библиотек типов.

Заканчивая это более чем краткое введение в автоматизацию, остановимся также
на понятии связывания. Связыванием называется способ, с помощью которого переменная
или класс приложения-контроллера ссылается на объект автоматизации. Таких способов
существуют два: позднее связывание и раннее связывание.

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

Раннее связывание означает, что реальная ссылка на объект автоматизации появляется
уже на этапе компиляции. Поэтому в коде приложения-контроллера требуется ссылка
на библиотеку типов (или на специальный модуль, являющийся интерфейсом к ней),
и это приводит к генерации в этом приложении классов с теми же свойствами и
методами, что и у объектов автоматизации, что делает возможными синтаксическую
проверку имен методов на этапе компиляции и доступ к именованным константам,
содержащимся в библиотеке типов. Отметим, однако, что далеко не все средства
разработки, поддерживающие позднее связывание, осуществляют также поддержку
раннего связывания.

Закончив экскурс в COM и автоматизацию, вернемся к вопросу о том, какие средства
разработки удобно применять для создания контроллеров автоматизации.

в начало

в начало

VBA и средства разработки контроллеров автоматизации

Как уже было сказано выше, контроллеры автоматизации можно создавать с помощью
различных средств разработки, и если вы уже используете какое-либо из инструментальных
средств, поддерживающих создание контролеров автоматизации, можно именно им
и воспользоваться. Единственное, что следует сделать — это узнать, поддерживается
ли вашим средством разработки ранее связывание, если вы планируете его использовать.
Примеры простейших контроллеров автоматизации (как правило, для Microsoft Word
или Microsoft Excel), дающие представление о том, как вызываются методы сервера,
обычно можно найти в комплекте поставки большинства современных средств разработки.

Освоение объектной модели автоматизируемого сервера можно начать с записи необходимой
последовательности действий в виде макроса с помощью VBА. Создать макрос можно,
выбрав из меню приложения Microsoft Office пункт Tools | Macro |Record New Macro.
Просмотр полученного макроса в редакторе кода VBA обычно позволяет понять, как
должен выглядеть код, реализующий эту последовательность действий.

Обсудив возможные средства разработки контроллеров автоматизации, можно наконец
перейти к самим приложениям Microsoft Office, к их объектным моделям и к их
использованию. В качестве средства разработки для приведенных ниже примеров
используется Borland Delphi 5, но поскольку в них приводится последовательность
вызова свойств и методов объектов Microsoft Office, перенос кода на другие языки
программирования не должен вызвать особых затруднений. Если специально не оговорено,
в данной статье во всех примерах используется раннее связывание.

в начало

в начало

Объектные модели Microsoft Office

Как было сказано выше, приложения Microsoft Office предоставляют контроллерам
автоматизации доступ к своей функциональности с помощью своей объектной модели,
представляющей собой иерархию объектов. Объекты могут предоставлять доступ к
другим объектам посредством коллекций.

В качестве иллюстрации того, как выглядит иерархия объектов Microsoft Office,
приведем небольшой фрагмент объектной модели Microsoft Word (рис.1):

В объектных моделях всех приложений Microsoft Office
всегда имеется самый главный объект, доступный приложению-контроллеру и представляющий
само автоматизируемое приложение. Для всех приложений Microsoft Office он называется
Application, и многие его свойства и методы для всех этих приложений также одинаковы.
Наиболее часто мы будем использовать следующие из них:

  1. Свойство Visible (доступное для объекта Application всех приложений Microsoft
    Office) позволяет приложению появиться на экране и в панели задач; оно принимает
    значения True (пользовательский интерфейс приложения доступен) или False (пользовательский
    интерфейс приложения недоступен; это значение устанавливается по умолчанию).
    Если вам нужно сделать что-то с документом Office в фоновом режиме, не информируя
    об этом пользователя, можно не обращаться к этому свойству — в этом случае
    приложение можно будет найти только в списке процессов с помощью приложения
    Task Manager.
  2. Метод Quit закрывает приложение Office. В зависимости от того, какое приложение
    Office автоматизируется, он может иметь параметры или не иметь таковых.
в начало

в начало

Общие принципы создания контроллеров автоматизации

В общем случае контроллер автоматизации должен выполнять следующие действия:

  1. Проверить, запущена ли копия приложения-сервера.
  2. В зависимости от результатов проверки запустить копию автоматизируемого
    приложения Office либо подключиться к уже имеющейся копии.
  3. Сделать окно приложения-сервера видимым (в общем случае это не обязательно).
  4. Выполнить какие-то действия с приложением-сервером (например, создать или
    открыть документы, изменить их данные, сохранить документы и пр.)
  5. Закрыть приложение-сервер, если его копия была запущена данным контроллером,
    или отключиться от него, если контроллер подключился к уже имеющейся копии.

Соответствующий код для Delphi представлен в листинге 1.

Здесь мы воспользовались функциями GetActiveOleObject и CreateOleObject для
подключения к уже запущенной копии приложения-сервера или запуска новой, если
сервер не запущен, что приводит к тому, что в вариантную переменную помещается
ссылка на объект Application соответствующего сервера.

Приведенная часть кода контроллера в других средствах разработки может выглядеть
по-другому — она не имеет прямого отношения к методам объектов Office,
так как обусловлена правилами вызова стандартных функций OLE в Delphi (за исключением
вызовов методов Visible и Quit объекта Application). А вот все то, что должно
быть вставлено вместо комментария «Здесь выполняются другие действия с объектами
приложения Office», в разных средствах разработки должно выглядеть более или
менее однотипно — используя созданную вариантную переменную, мы манипулируем
методами и свойствами объекта Application.

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

App.Quit;

несмотря на то что метод Quit объекта Application в случае некоторых приложений
Microsoft Office (например, Microsoft Word) имеет параметры.

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

App.Quit(EmptyParam, EmptyParam, EmptyParam);

Исключением из этого правила является Visual Basic — это средство разработки
позволяет не задумываться о числе параметров методов при написании кода.

Обсудив общие принципы создания контроллеров автоматизации и узнав, как это
делается средствами Borland Delphi, мы можем перейти к рассмотрению автоматизации
конкретных приложений Microsoft Office. Начнем с одного из самого популярных
компонентов этого пакета — с Microsoft Word.

в начало

в начало

Автоматизация Microsoft Word

В данном разделе мы обсудим наиболее часто встречающиеся задачи, связанные
с автоматизацией Microsoft Word. Но перед этим рассмотрим, каковы программные
идентификаторы основных объектов Microsoft Word и что представляет собой его
объектная модель.

в начало

в начало

Программные идентификаторы и объектная модель Microsoft Word

Для приложения-контроллера доступны непосредственно следующие объекты:

Объект

Программный идентификатор

Комментарий

Application

Word.Application, Word.Application.9

С помощью этого программного идентификатора создается экземпляр Word
без открытых документов

Document

Word.Document, Word.Document.9, Word.Template.8

С помощью этого программного идентификатора создается экземпляр Word
с одним вновь созданным документом

Все остальные объекты Word являются так называемыми внутренними объектами.
Это означает, что они не могут быть созданы сами по себе; так, объект Paragraph
(абзац) не может быть создан отдельно от содержащего его документа.

Если вспомнить, что основное назначение Word — работа с документами, можно
легко понять иерархию его объектной модели (фрагмент ее был показан на рис.
1). Основным объектом в ней, как иво всех других приложениях Microsoft Office,
является объект Application, содержащий коллекцию Documents объектов типа Document.
Каждый объект типа Document содержит коллекцию Paragraphs объектов типа Paragraph,
Bookmarks типа Bookmark, Characters типа Character и т.д. Манипуляция документами,
абзацами, символами, закладками реально осуществляется путем обращения к свойствам
и методам этих объектов.

Ниже мы рассмотрим наиболее часто встречающиеся задачи, связанные с автоматизацией
Microsoft Word. Если же вам встретилась задача, не совпадающая ни с одной из
перечисленных, вы можете попытаться найти подходящий пример на Visual Basic
в справочном файле VBAWRD9.CHM, либо, как уже было сказано выше, записать необходимую
последовательность действий в виде макроса и проанализировать его код.

в начало

в начало

Создание и открытие документов Microsoft Word

Для создания примеров использования Microsoft Word можно использовать код создания
контроллера, приведенный выше, и модифицировать его, заменяя комментарии кодом,
манипулирующим свойствами и методами объекта Word.Application. Мы начнем с создания
и открытия документов.

Создать новый документ Word можно, используя метод Add коллекции Documents
объекта Application:

App.Documents.Add;

Как создать нестандартный документ? Очень просто — нужно указать имя шаблона
в качестве параметра метода Add:

App.Documents.Add(‘C:Program Files _
   Microsoft OfficeTemplates1033Manual.dot’);

Для открытия уже существующего документа следует воспользоваться методом Open
коллекции Documents:

App.Documents.Open(‘C:MyWordFile.doc’);

Отметим, что свойство ActiveDocument объекта Word.Application указывает на
текущий активный документ среди одного или нескольких открытых. Помимо этого
к документу можно обращаться по его порядковому номеру с помощью метода Item;
например ко второму открытому документу можно обратиться так:

App.Documents.Item(2)

Отметим, что нумерация членов коллекций в Microsoft Office начинается с единицы.

Сделать документ активным можно с помощью метода Activate:

App.Documents.Item(1).Activate;

Следующее, чему следует научиться — это сохранять документ Word и закрывать
сам Word.

в начало

в начало

Сохранение, печать и закрытие документов Microsoft Word

Закрытие документа может быть осуществлено с помощью метода Close:

App.Documents.Item(2).Close;

или

App.ActiveDocument.Close ;

Метод Close имеет несколько необязательных (в случае позднего связывания) параметра,
влияющих на правила сохранения документа. Первый из них влияет на то, сохраняются
ли внесенные в документ изменения, и принимает три возможных значения (соответствующие
константы рекомендуется описать в приложении. См. листинг
2):

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

Таким образом, при использовании этих параметров закрыть документ можно, например,
так:

App.ActiveDocument.Close(wdSaveChanges, _
   wdPromptUser) ;

Просто сохранить документ, не закрывая его, можно с помощью метода Save:

App.ActiveDocument.Save;

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

Напоминаем, что закрыть сам Word можно с помощью метода Quit объекта Word.Application.
Этот метод имеет в общем случае три параметра, совпадающих с параметрами метода
Close объекта Document.

Вывод документа на устройство печати можно осуществить с помощью метода PrintOut
объекта Document, например:

App.ActiveDocument.PrintOut;

Если нужно изменить параметры печати, следует указать значения соответствующих
параметров метода PrintOut (в случае Microsoft Word их около двадцати).

в начало

в начало

Вставка текста и объектовв документ и форматирование текста

Для создания абзацев в документе можно использовать коллекцию Paragraphs объекта
Document, представляющую набор абзацев данного документа. Добавить новый абзац
можно с помощью метода Add этой коллекции:

App.ActiveDocument.Paragraphs.Add;

Для вставки собственно текста в документ, тем не менее, применяется не объект
Paragraph, а объект Range, представляющий любую непрерывную часть документа
(в том числе и вновь созданный абзац). Этот объект может быть создан разными
способами. Например, можно указать начальный и конечный символы диапазона (если
таковые имеются в документе):

var
   Rng : Variant;
...
   Rng := App.ActiveDocument.Range(2,4);
//со 2-го по 4-й символы

или указать номер абзаца (например, только что созданного):

Rng:= App.ActiveDocument.Paragraphs.Item(1).Range;

или указать несколько абзацев, следующих подряд:

Rng := App.ActiveDocument.Range _
   (App.ActiveDocument.Paragraphs.Item(3).Range.Start,_
   App.ActiveDocument.Paragraphs.Item(5).Range.End)

Вставить текст можно с помощью методов объекта Range InsertBefore (перед диапазоном)
или InsertAfter (после диапазона), например:

Rng.InsertAfter(‘Это вставляемый текст’);

Помимо объекта Range текст можно вставлять с помощью объекта Selection, являющийся
свойством объекта Word.Application и представляющий собой выделенную часть документа
(этот объект создается, если пользователь выделяет часть документа с помощью
мыши, и может быть также создан с помощью приложения-контроллера). Сам объект
Selection можно создать, применив метод Select к объекту Range, например:

var
   Sel : Variant;
...
App.ActiveDocument.Paragraphs.Item(3).Range.Select;

В приведенном выше примере в текущем документе выделяется третий абзац.

Если мы хотим вставить строку текста в документ либо вместо выделенного фрагмента
текста, либо перед ним, это можно сделать с помощью следующего фрагмента кода:

var
   Sel : Variant;
...
   Sel := App.Selection;
   Sel.TypeText(‘Это текст, которым мы заменим _
      выделенный фрагмент’);

Отметим, что если свойство Options.ReplaceSelection объекта Word.Application
равно True, выделенный текст будет заменен на новый текст (этот режим действует
по умолчанию); если же нужно, чтобы текст был вставлен перед выделенным фрагментом,
а не вместо него, следует установить это свойство равным False:

App.Options.ReplaceSelection := False;

Символ конца абзаца при использовании объекта Selection может быть вставлен
с помощью следующего фрагмента кода:

Sel.TypeParagraph;

К объекту Selection, так же как и к объекту Range, можно применить методы InsertBefore
и InsertAfter. В этом случае, в отличие от предыдущего, вставляемый текст станет
частью выделенного фрагмента текста.

С помощью объекта Selection, используя его свойство Font и свойства объекта
Font, такие как Bold, Italic, Size,…, можно отформатировать текст. Например,
таким образом можно вставить строку, выделенную жирным шрифтом:

Sel.Font.Bold := True;
Sel.TypeText(‘Это текст, который мы выделим _
   жирным шрифтом.’);
Sel.Font.Bold := False;
Sel.TypeParagraph;

Для наложения на вставляемый текст определенного заранее стиля можно использовать
свойство Style этого же объекта, например:

Sel.Style := ‘Heading 1’;
Sel.TypeText(‘Это текст, который станет _
   заголовком’);
Sel.TypeParagraph;

Нередко документы Word содержат данные других приложений. Простейший способ
вставить такие данные в документ — использовать метод Paste объекта Range:

Var
   Rng : Variant;
...
   Rng := App.Selection.Range;
   Rng.Collapse(wdCollapseEnd);
   Rng.Paste;

Естественно, в этом случае в буфере обмена уже должны содержаться вставляемые
данные.

Если нужно поместить в буфер обмена часть документа Word, это можно сделать
с помощью метода Copy объекта Range:

Var
   Rng : Variant;
...
   Rng := App.Selection.Range;
   Rng.Copy;

Следующее, чему нужно научиться — перемещению курсора в нужное место текста,
чем мы и займемся в следующем разделе.

в начало

в начало

Перемещение курсора по тексту

Используя метод Collapse, можно «сжать» объект Range или объект Selection,
сократив его размер до нуля символов:

Rng.Collapse(wdCollapseEnd);

Параметр этого метода указывает, в начале или в конце исходного фрагмента окажется
новый объект Range или Selection. Если вы используете позднее связывание и ваше
средство разработки — не Visual Basic, нужно определить в приложении соответствующие
константы:

const
   wdCollapseStart = $00000001;
   //новый объект находится в начале фрагмента
   wdCollapseEnd = $00000000;
   //новый объект находится в конце фрагмента

Перемещать курсор по тексту можно с помощью метода Move объектов Range и Selection.
Этот метод имеет два параметра. Первый указывает на то, в каких единицах измеряется
перемещение — в символах (по умолчанию), словах, предложениях, абзацах и др.
Второй параметр указывает, на сколько единиц при этом нужно переместиться (это
число может быть и отрицательным; по умолчанию оно равно 1). Например, следующий
фрагмент кода:

Rng.Move;

приведет к перемещению курсора на один символ вперед, а

Rng.Move(wdParagraph,3);

приведет к перемещению курсора на три абзаца вперед. Отметим, что этот метод
использует следующие константы:

const          //Единицей перемещения является:
   wdCharacter           = $00000001; //символ
   wdWord = $00000002; //слово
   wdSentence           = $00000003; //предложение
   wdParagraph          = $00000004; //абзац
   wdStory = $00000006; //часть документа
                       //напр., колонтитул,
                       //оглавление и др.)
   wdSection              = $00000008; //раздел
   wdColumn              = $00000009; //колонка таблицы
   wdRow = $0000000A; //строка таблицы
   wdCell = $0000000C; //ячейка таблицы
   wdTable = $0000000F; //таблица

Нередко для перемещения по тексту используются закладки. Создать закладку в
текущей позиции курсора можно путем добавления члена коллекции Bookmarks объекта
Document c помощью метода Add, указав имя закладки в качестве параметра, например:

App.ActiveDocument.Bookmarks.Add(‘MyBookmark’);

Проверить существование закладки в документе можно с помощью метода Exists,
а переместиться на нее — с помощью метода Goto объектов Document, Range
или Selection:

Rng :=
App.ActiveDocument.Goto(wdGoToBookmark,  
   wdGoToNext, ,‘MyBookmark’);
Rng.InsertAfter(‘Текст, вставленный после  
   закладки’);

Значения констант для этого примера таковы:

const

wdGoToBookmark = $FFFFFFFF;
   //перейти к закладке
wdGoToNext = $00000002;
   //искать следующий объект в тексте

Отметим, что с помощью метода Goto можно перемещаться не только на указанную
закладку, но и на другие объекты (рисунки, грамматические ошибки и др.), и направление
перемещения тоже может быть различным. Поэтому список констант, которые могут
быть использованы в качестве параметров данного метода, довольно велик.

в начало

в начало

Создание таблиц

Создавать таблицы можно двумя способами. Первый заключается в вызове метода
Add коллекции Tables объекта Document и последовательном заполнении ячеек данными.
Этот способ при позднем связывании работает довольно медленно.

Второй способ, намного более «быстрый», заключается в создании текста из нескольких
строк, содержащих подстроки с разделителями (в качестве разделителя можно использовать
любой или почти любой символ, нужно только, чтобы он заведомо не встречался
в данных, которые будут помещены в будущую таблицу), и последующей конвертации
такого текста в таблицу с помощью метода ConvertToTable объекта Range. Ниже
приведен пример создания таблицы из трех строк и трех столбцов этим способом
(в качеcтве разделителя, являющегося первым параметром метода ConvertToTable,
используется запятая):

Var
   Rng : Variant;
...
   Rng := App.Selection.Range;
   Rng.Collapse(wdCollapseEnd);
   Rng.InsertAfter(‘1, 2, 3’);
   Rng.InsertParagraphAfter;
   Rng.InsertAfter(‘4,5,6’);
   Rng.InsertParagraphAfter;
   Rng.InsertAfter(‘7,8,9’);
   Rng.InsertParagraphAfter;
   Rng.ConvertToTable(‘,’);

Отметим, что внешний вид таблицы можно изменить с помощью свойства Format,
а также с помощью свойств коллекции Columns, представляющей колонки таблицы,
и коллекции Rows, представляющей строки таблицы объекта Table.

в начало

в начало

Обращение к свойствам документа

Свойства документа можно получить с помощью коллекции BuiltInDocumentProperties
объекта Document, например:

Memo1.Lines.Add(‘Название — ‘ + _
App.ActiveDocument.BuiltInDocumentProperties
[wdPropertyTitle].Value);
Memo1.Lines.Add(‘Автор — ‘ + _
App.ActiveDocument.BuiltInDocumentProperties
[wdPropertyAuthor]. _ Value);
Memo1.Lines.Add(‘Шаблон — ‘ + _
    App.ActiveDocument.BuiltInDocumentProperties 
[wdPropertyTemplate]. _Value) 

Константы, необходимые для обращения к свойствам документа по имени, приведены
в листинге 3.

Итак, в данном разделе мы изучили основные операции, которые наиболее часто
применяются при автоматизации Microsoft Word. Естественно, возможности автоматизации
Word далеко не исчерпываются приведенными примерами, однако я надеюсь, что,
руководствуясь основными принципами создания контроллеров Word, изложенными
в данной статье, и соответствующим справочным файлом, вы сможете ими воспользоваться —
мы с вами уже убедились, что это вовсе не так сложно.

Следующим приложением Microsoft Office, автоматизацию которого мы рассмотрим,
будет Microsoft Excel — второе по популярности приложение Microsoft Office.

в начало

в начало

Автоматизация Microsoft Excel

В данном разделе мы обсудим наиболее часто встречающиеся задачи, связанные
с автоматизацией Microsoft Excel. Но перед этим рассмотрим, каковы программные
идентификаторы основных объектов Microsoft Excel и что представляет собой его
объектная модель.

в начало

в начало

Программные идентификаторы и объектная модель Microsoft Excel

Существует три типа объектов Excel, которые могут быть созданы непосредственно
с помощью приложения-контроллера. Эти объекты и соответствующие им программные
идентификаторы перечислены ниже.

Все остальные объекты Excel являются так называемыми внутренними объектами.

Небольшой фрагмент объектной модели Microsoft Excel изображен на рис.2:

Основным в объектной модели Excel является объект Application, содержащий коллекцию
Workbooks объектов типа WorkBook. Каждый объект типа WorkBook содержит коллекцию
WorkSheets-объектов типа WorkSheet, Charts типа Chart и др. Манипуляция рабочими
книгами, их листами, ячейками, диаграммами реально осуществляется путем обращения
к свойствам и методам этих объектов.

Ниже мы рассмотрим наиболее часто встречающиеся задачи, связанные с автоматизацией
Microsoft Excel. Если вам встретилась задача, не совпадающая ни с одной из перечисленных,
вы можете попытаться найти подходящий пример на Visual Basic в справочном файле
VBAXL9.CHM, либо, как и в случае Microsoft Word, записать соответствующий макрос
и проанализировать его код.

в начало

в начало

Запуск Microsoft Excel, создание и открытие рабочих книг

Для создания примеров использования Microsoft Excel можно использовать код
создания контроллера, приведенный в разделе «Общие принципы создания контроллеров
автоматизации», заменив первый оператор в приведенном примере на следующий:

AppProgID := ‘Excel.Application’;

и заменить комментарии кодом, манипулирующим свойствами и методами объекта
Excel.Application. Отметим, однако, что подключение контроллера автоматизации
к имеющейся версии Excel с помощью метода GetActiveOleObject может привести
к тому, что вся клиентская часть Excel окажется невидимой (это происходит, если
имеющаяся копия Excel запущена в режиме, когда ее пользовательский интерфейс
недоступен). Причины подобного поведения автору неизвестны. Поэтому, если существует
вероятность возникновения подобной ситуации, лучше упростить код создания контроллера
и всегда создавать новую копию Excel.

Изучение создания контроллеров Excel мы начнем с создания и открытия рабочих
книг.

Создать новую рабочую книгу Excel можно, используя метод Add коллекции Workbooks
объекта Application:

App.WorkBooks.Add;

Для создания рабочей книги на основе шаблона следует указать его имя в качестве
первого параметра метода Add:

App.WorkBooks.Add(‘C:Program FilesMicrosoft _
   OfficeTemplates1033invoice.xlt’);

В качестве первого параметра этого метода можно также использовать следующие
константы:

const
   xlWBATChart = $FFFFEFF3;
//рабочая книга состоит из листа с диаграммой
   xlWBATWorksheet = $FFFFEFB9;
//рабочая книга состоит из листа с данными

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

Для открытия уже существующего документа следует воспользоваться методом Open
коллекции WorkBooks:

App.Documents.Open(‘C:MyExcelFile.xls’);

Отметим, что свойство ActiveWorkBook объекта Excel.Application указывает на
текущую активную рабочую книгу среди одной или нескольких открытых. Помимо этого
к рабочей книге можно обращаться по ее порядковому номеру, например ко второй
открытой рабочей книге можно обратиться так:

App.WorkBooks[2]

Обратите внимание на то, что в Delphi при использовании позднего связывания
синтаксис, используемый для обращения к членам коллекций объектов Excel, отличен
от синтаксиса, используемого для обращения к объектам Word — в случае Word
мы использовали метод Item, а в случае Excel мы обращаемся к членам коллекции
как к элементам массива. Если же вы используете Visual Basic, синтаксис, применяемый
для обращения к членам коллекций, будет одинаков для всех коллекций Microsoft
Office.

Сделать рабочую книгу активной можно с помощью метода Activate:

App.WorkBooks[2].Activate;

Следующее, чему следует научиться — это сохранять рабочие книги в файлах.

в начало

в начало

Сохранение, печать и закрытие рабочих книг Microsoft Excel

Закрытие документа может быть осуществлено с помощью метода Close:

App.WorkBooks[2].Close;

или

App.ActiveWorkBook.Close;

Метод Close имеет несколько необязательных (в случае позднего связывания) параметров,
влияющих на правила сохранения рабочей книги. Первый из параметров принимает
значения True или False и влияет на то, сохранять ли изменения, внесенные в
рабочую книгу. Второй параметр (типа Variant) — имя файла, в котором нужно
сохранить рабочую книгу (если в нее были внесены изменения). Третий параметр,
также принимающий значения True или False, влияет на то, следует ли пересылать
документ следующему пользователю по электронной почте, и может быть проигнорирован,
если эта функциональность не используется.

App.ActiveWorkBook.Close(True,’C:MyWorkBook.xls’);

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

App.ActiveWorkBook.Save;

или

App.ActiveWorkBook.SaveAs(‘C:MyWorkBook.xls’);

Метод SaveAs имеет более десятка параметров, влияющих на то, как именно сохраняется
документ (под каким именем, с паролем или без него, какова кодовая страница
для содержащегося в ней текста и др.).

Закрыть сам Excel можно с помощью метода Quit объекта Excel.Application. В
случае Excel этот метод параметров не имеет.

Вывод документа Excel на устройство печати можно осуществить с помощью метода
PrintOut объекта WorkBook, например:

App.ActiveWorkBook.PrintOut;

Если нужно изменить параметры печати, следует указать значения соответствующих
параметров метода PrintOut (в случае Excel их восемь).

в начало

в начало

Обращение к листам и ячейкам

Обращение к листам рабочей книги производится с помощью коллекции WorkSheets
объекта WorkBook. Каждый член этой коллекции представляет собой объект WorkSheet.
К члену этой коллекции можно обратиться по его порядковому номеру, например:

App.WorkBooks[1].WorkSheets[1].Name := _
   ‘Страница 1’;

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

К листу рабочей книги можно обратиться и по имени, например:

App.WorkBooks[1].WorkSheets[‘Sheet1’].Name := _
   ‘Страница 1’;

Обращение к отдельным ячейкам листа производится с помощью коллекции Cells
объекта WorkSheet. Например, добавить данные в ячейку B1 можно следующим образом:

App.WorkBooks[1].WorkSheets[‘Sheet1’].Cells[1,2].Value:=’25’;

Здесь первая из координат ячейки указывает на номер строки, вторая — на
номер столбца.

Добавление формул в ячейки производится аналогичным способом:

App.WorkBooks[1].WorkSheets[‘Sheet1’] _
   .Cells[3,2].Value := ‘ =SUM(B1:B2)’;

Очистить ячейку можно с помощью метода ClearContents.

Форматирование текста в ячейках производится с помощью свойств Font и Interior
объекта Cell и их подсвойств. Например, следующий фрагмент кода выводит текст
в ячейке красным жирным шрифтом Courier кегля 16 на желтом фоне:

App.WorkBooks[1].WorkSheets[1].Cells[3,2].Interior _
   .Color := clYellow;
App.WorkBooks[1].WorkSheets[1].Cells[3,2].Font _
   .Color := clRed;
App.WorkBooks[1].WorkSheets[1].Cells[3,2] _
   .Font.Name := ‘Courier’;
App.WorkBooks[1].WorkSheets[1].Cells[3,2] _
   .Font.Size := 16;
App.WorkBooks[1].WorkSheets[1].Cells[3,2] _
.Font.Bold := True;

Объект

Программный идентификатор

Комментарий

Application

Excel.Application, Excel.Application.9

С помощью этого программного идентификатора создается экземпляр приложения
без открытых рабочих книг

WorkBook

Excel.AddIn

С помощью этого программного идентификатора создается экземпляр расширения
(add-in) Excel (имеющиеся расширения доступны с помощью пункта меню Tools
| Add-Ins)

 

Excel.Chart, Excel.Chart.8

Рабочая книга, созданная с помощью этих программных идентификаторов,
состоит из двух листов — одного для диаграммы, другого — для
данных, на основе которых она построена

 

Excel.Sheet, Excel.Sheet.8

Рабочая книга, созданная с помощью этих программных идентификаторов,
состоит из одного листа

Вместо свойства Color можно использовать свойство ColorIndex, принимающее значения
от 1 до 56; таблицу соответствий значений этого свойства реальным цветам можно
найти в справочном файле VBAXL9.CHM.

Обратиться к текущей ячейке можно с помощью свойства ActiveCell объекта Excel.Application,
а узнать местоположение ячейки можно с помощью свойства Address объекта Cell,
например:

ShowMessage(App.ActiveCell.Address);

Помимо обращения к отдельным ячейкам, можно манипулировать прямоугольными областями
ячеек с помощью объекта Range, например:

App.WorkBooks[1].WorkSheets[2].Range[‘A1:C5’] _
   .Value := ‘Test’;
App.WorkBooks[1].WorkSheets[2].Range[‘A1:C5’] _
   .Font.Color := clRed;

Приведенный выше код приводит к заполнению прямоугольного участка текстом и
к изменению цвета шрифта ячеек.

Объект Range также часто используется для копирования прямоугольных областей
через буфер обмена. Ниже приведен пример, иллюстрирующий копирование такой области:

App.WorkBooks[1].WorkSheets[2].Range[‘A1:C5’].Copy;
App.WorkBooks[1].WorkSheets[2].Range[‘A11:C15’].Select;
App.WorkBooks[1].WorkSheets[2].Paste;

Обратите внимание на то, что диапазон, куда копируются данные, предварительно
выделяется с помощью метода Select.

Отметим, что примерно таким же образом можно копировать данные и из других
приложений (например, из Microsoft Word).

Довольно часто при автоматизации Excel используются его возможности, связанные
с построением диаграмм. Ниже мы рассмотрим, как это сделать.

в начало

в начало

Создание диаграмм

Диаграммам Excel соответствует объект Chart, который может располагаться как
на отдельном листе, так и на листе с данными. Если объект Chart располагается
на листе с данными, ему соответствует член коллекции ChartObjects объекта WorkSheet
и создание диаграммы нужно начать с добавления элемента в эту колекцию:

Ch:=App.WorkBooks[1].WorkSheets[2].ChartObjects.Add(10,50,400,400);

Параметрами этого метода являются координаты левого верхнего угла и размеры
диаграммы в пунктах (1/72 дюйма).

Если же диаграмма располагается на отдельном листе (не предназначенном для
хранения данных), то создание диаграммы нужно начать с добавления элемента в
коллекцию Sheets объекта Application (которая отличается от коллекции WorkSheets
тем, что содержит листы всех типов, а не только листы с данными):

App.WorkBooks[1].Sheets.Add(,,1,xlWBATChart);

В этом случае первый параметр метода Add указывает порядковый номер листа,
перед которым нужно поместить данный лист (или данные листы, если их несколько),
второй параметр — порядковый номер листа, после которого нужно поместить данный
лист (используется обычно один из них), третий параметр — сколько нужно
создать листов, а четвертый — какого типа должен быть лист. Значения четвертого
параметра совпадают со значениями первого параметра метода Add коллекции WorkBooks
объекта Application, и при использовании имен соответствующих констант следует
определить их в приложении-контроллере.

Простейший способ создать диаграмму, с точки зрения пользователя, — создать
ее с помощью соответствующего эксперта на основе прямоугольной области с данными.
Точно так же можно создать диаграмму и с помощью контроллера автоматизации —
для этой цели у объекта Chart, являющегося свойством объекта ChartObject (члена
коллекции ChartObjects), имеется метод ChartWizard. Первым параметром этого
метода является объект Range, содержащий диапазон ячеек для построения диаграммы,
а вторым — числовой параметр, указывающий, какого типа должна быть эта
диаграмма:

Var Ch: Variant;
…
Ch.Chart.ChartWizard _
(App.WorkBooks[1].WorkSheets[2].Range[‘A1:C5’], _
   xl3DColumn);

Возможные значения параметра, отвечающего за тип диаграммы, можно найти в справочном
файле.

У объекта Chart имеется множество свойств, отвечающих за внешний вид диаграммы,
с помощью которых можно изменить ее точно так же, как пользователи делают это
вручную. Ниже приводится пример создания заголовка диаграммы и подписей вдоль
ее осей (отметим, что оси есть не у всех типов диаграмм).

Ch.Chart.HasTitle :=1;
Ch.Chart.HasLegend := False;
Ch.Chart.ChartTitle.Text := _
   ‘Пример диаграммы Excel ‘;
Ch.Chart.Axes(1).HasTitle := True;
Ch.Chart.Axes(1).AxisTitle.Text := _
   ‘Подпись вдоль оси абсцисс’;
Ch.Chart.Axes(2).HasTitle := True;
Ch.Chart.Axes(2).AxisTitle.Text := _
   ‘Подпись вдоль оси ординат’;

Еще один способ создания диаграммы — определить все ее параметры с помощью
свойств объекта Chart, включая и определение серий, на основе которых она должна
быть построена. Данные для серии обычно находится в объекте Range, содержащем
строку или столбец данных, а добавление серии к диаграмме производится путем
добавления члена к коллекции SeriesCollection, например:

App.WorkBooks[1].Sheets.Add(,,1,xlWBATChart);
App.WorkBooks[1].Sheets[1].ChartType := xl3DPie;
Rng:=App.WorkBooks[1].WorkSheets[2].Range[‘B1:B5’];
App.WorkBooks[1].Sheets[1].SeriesCollection.Add(Rng);

В данном примере к диаграмме, созданной на отдельном листе, специально предназначенном
для диаграмм, добавляется одна серия на основе диапазона ячеек другого листа.

Мы изучили основные операции, применяемые при автоматизации Microsoft Excel.
Описания некоторых аналогичных операций для Microsoft Word, например обращение
к свойствам документов, были здесь опущены во избежание повторов. Возможности
автоматизации Microsoft Excel и Word далеко не исчерпываются приведенными примерами.
Сведения о них можно всегда найти в соответствующем справочном файле.

В следующих статьях данного цикла будет рассмотрена автоматизация других приложений
Microsoft Office — Microsoft PowerPoint, Microsoft Access, Microsoft Outlook
и др.

КомпьютерПресс 11’2000

Контроллер для получения данных и экспорта в Excel, подробное руководство

IDEA 2019-03 версия весна 3.x версия tomcat 7.5 старый проект Итак, самая старая версия, используемая easypoi, выберите соответствующую версию в соответствии с версией, использованной самими друзьями
1: Импорт пакета jar ps: проект Maven может импортировать соответствующие зависимости

** 2: создать класс сущности User **

public class User {
	 // имя представляет строку заголовка orderNum представляет порядок сортировки
         @Excel (name = "name", orderNum = "0")
    private String name;
         @Excel (name = "пол", orderNum = "1")
    private String sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

Создайте класс инструмента FileUtil, класс инструмента, исправленный метод записи, вы можете использовать его напрямую

package hr.manage.util;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import org.apache.poi.ss.usermodel.Workbook;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;

public class FileUtil {

    public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName, HttpServletResponse response){
        defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
    }

         // Устанавливаем содержимое в экспортируемом файле
    private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {
        Workbook workbook = ExcelExportUtil.exportExcel(exportParams,pojoClass,list);
        if (workbook != null);
        downLoadExcel(fileName, response, workbook);
    }

         // Установить имя файла экспорта, кодировку
    private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
        try {
            response.setCharacterEncoding("UTF-8");
                         // Пусть сервер сообщает браузеру, к какому типу файла принадлежат данные, которые он отправляет
            response.setHeader("content-Type", "application/vnd.ms-excel");
                         // Когда тип Content-Type является типом для загрузки, этот заголовок сообщит браузеру имя и тип файла.
            response.setHeader("Content-Disposition",
                    "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            workbook.write(response.getOutputStream());
        } catch (IOException e) {
            //  throw new NormalException(e.getMessage());
        }
    }

}

Создать UserController

package hr.manage.controller.book;
import hr.manage.entity.User;
import hr.manage.util.FileUtil;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
 // Экспорт данных в Excel
@RequestMapping("/user")
@Controller
public class UserController {

    @RequestMapping("/excel")
    public void exceladd(HttpServletResponse response){
        List<User>list = new ArrayList<>();
                 list.add (новый пользователь («Чжан Сан», «мужчина»));
                 list.add (новый пользователь (" ", " "));
                 // параметр
                 // 1: входящий сбор данных, 2: заголовок, 3: имя рабочего листа 4: класс сущностей Класс 5: сохраненное имя Excel, переданное в HttpServletResponse
                 FileUtil.exportExcel (список, «Ростер», «Сотрудник», User.class, «Roster.xls», ответ);
    }

Откройте tomcat, чтобы получить доступ к своему пути

Откройте Excel и данные были импортированы

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

package hr.manage.entity;

import cn.afterturn.easypoi.excel.annotation.Excel;

import java.util.Date;

import javax.xml.soap.Detail;

public class CwgBookManager {
	 // Идентификатор первичного ключа
	private Integer id;
	 // номер
	 @Excel (name = "Number", orderNum = "0")
	private String number;
	 // Название книги
	 @Excel (name = "Название книги", orderNum = "1")
	private String name;
	 // Номер книги
	 @Excel (name = "Номер книги", orderNum = "2")
	private String serialNumber;
	 // Нажмите
	 @Excel (name = "Publisher", orderNum = "3")
	private String publisher;
	 // Автор
	 @Excel (name = "author", orderNum = "4")
	private String author;
	 // Создано
	 @Excel (name = "Creator", orderNum = "5")
	private int createBy;
	 // Создать время
	 @Excel (name = "время создания", exportFormat = "yyyy-MM-dd", orderNum = "6")
	private Date creationDate;
	 // Количество книг, количество
	 @Excel (name = "количество книг", orderNum = "7")
	private int total;
	 // Цена
	 @Excel (name = "price", orderNum = "8")
	private double price;
	 // Замечания, подробности
	 @Excel (name = "Замечания", orderNum = "9")
	private String detail;
 // Состояние 0: нет записи, 1, запись
	 @Excel (name = "Статус записи", orderNum = "10", type = 10)
	private int status;
	 // Альтернативное поле 1
	private String reserve;
	 // Альтернативное поле 2
	private String spare;
	 // Альтернативное поле 3
	private String standby;

	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSerialNumber() {
		return serialNumber;
	}
	public void setSerialNumber(String serialNumber) {
		this.serialNumber = serialNumber;
	}
	public String getPublisher() {
		return publisher;
	}
	public void setPublisher(String publisher) {
		this.publisher = publisher;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public int getCreateBy() {
		return createBy;
	}
	public void setCreateBy(int createBy) {
		this.createBy = createBy;
	}
	public Date getCreationDate() {
		return creationDate;
	}
	public void setCreationDate(Date creationDate) {
		this.creationDate = creationDate;
	}
	public int getTotal() {
		return total;
	}
	public void setTotal(int total) {
		this.total = total;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	public String getDetail() {
		return detail;
	}
	public void setDetail(String detail) {
		this.detail = detail;
	}
	public int getStatus() {
		return status;
	}
	public void setStatus(int status) {
		this.status = status;
	}
	public String getReserve() {
		return reserve;
	}
	public void setReserve(String reserve) {
		this.reserve = reserve;
	}
	public String getSpare() {
		return spare;
	}
	public void setSpare(String spare) {
		this.spare = spare;
	}
	public String getStandby() {
		return standby;
	}
	public void setStandby(String standby) {
		this.standby = standby;
	}

}

Запрос данных таблицы базы данных

@Repository
public interface BookDao {
	/**
	 * Запрос таблицы данных таблицы
	 * @return
	 */
	@Select("SELECT * FROM cwg_bookmanager")
	public List<CwgBookManager> findBookList();

Контроллер записи

package hr.manage.controller.book;
import hr.manage.dao.book.BookDao;
import hr.manage.entity.CwgBookManager;
import hr.manage.util.FileUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**
   * Экспорт Execl
 */
@Controller
@RequestMapping("/hrm/book")
public class ExcelBookController {

    @Resource
    private BookDao book;

    @RequestMapping("/demo")
    public void execl(HttpServletResponse response) throws IOException {
    	     // Соответствует вашему методу базы данных запросов
        List<CwgBookManager> list = book.findBookList();
        System.out.println("Excel");
                 FileUtil.exportExcel (список, «Информация о книге», «Чжу Ганчао», CwgBookManager.class, «Book.xls», ответ);
    }
}

Просто посетите путь контроллера
Откройте файл Excel. Вы видите, что данные в базе данных были импортированы в Excel

На главной странице можно написать кнопку для привязки события клика

код JQ

function excel(){
	$.ajax({
		url:'/HRManagement/hrm/book/demo',
		type:'get',
		success:function (data) {
			if (data != null){
				 alert («Экспорт выполнен успешно»);
			} 	
		}
	});
}

  • CTRL D в Excel

Excel CTRL D (Содержание)

  • CTRL D в Excel
  • Как использовать CTRL D в Excel?
  • Объяснение CTRL D в Excel

CTRL D в Excel

Несмотря на то, что в Excel предусмотрено множество ярлыков для копирования и вставки данных в Excel. CTRL D — это еще один ярлык в Excel, который делает то же самое. Давайте сначала обсудим, как мы обычно копируем в Excel. Мы выбираем данные, предоставленные нам. Затем мы щелкаем правой кнопкой мыши на данных и появляется окно мастера. Мы видим различные опции, представленные на значке дисплея. Это показано на скриншоте ниже,

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

Это сочетание клавиш CTRL + D.

Как использовать CTRL D в Excel?

Это очень просто и удобно в использовании. Давайте разберемся, как использовать Ctrl D в Excel с некоторыми примерами.

Вы можете скачать этот шаблон CTRL D Excel здесь — Шаблон CTRL D Excel

Этапы использования CTRL + D в Excel:

  • Выберите данные и диапазон ячеек, которые мы хотим скопировать.
  • Нажмите CTRL + D.

Пример № 1

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

Ниже скриншот показывает текущее состояние данных,

Теперь предположим, что Робин, Алекс и Адам учатся в шестом классе, а Ли и Люк — в седьмом. Необходимая сумма для учащихся шестого класса составляет 50 долларов, а для учащихся седьмого класса — 70 долларов. Теперь учитель может вручную ввести данные в каждую ячейку или щелкнуть правой кнопкой мыши на данных, скопировать их и вставить в выбранные ячейки. Или мы можем использовать ярлык Excel CTRL D и мгновенно копировать и вставлять данные. Теперь выполните следующие шаги:

  • Для Робина введите данные для количества и класса.

  • Теперь выберите данные, которые мы хотим скопировать.

  • Теперь выберите ячейки, в которых мы хотим, чтобы одни и те же данные были, например, B2: C4

  • Теперь нажмите CTRL + D и увидите результат.

  • Теперь вставьте данные для Ли в соответствии с требованиями,

  • Теперь выберите диапазон ячеек B5: C6 .

  • Теперь нажмите CTRL + D и увидите результат.

Выше мы видели, как сочетание клавиш или Ctrl + D работает в Excel.

Пример № 2

Теперь давайте попробуем использовать CTRL + D в ячейках, содержащих формулы, чтобы проверить, работает ли CTRL D только в обычных данных или в формулах. Теперь посмотрим на данные ниже,

В ячейке G1 мы напишем формулу суммы и будем использовать CTRL + D для копирования и вставки формул.

  • В ячейке G1 введите формулу = SUM (

  • Выберите диапазон ячеек B2: F2 и нажмите клавишу ввода. Результат будет таким, как указано ниже.

  • Теперь выберите ячейки от G2 до G6.

  • Теперь нажмите CTRL + D.

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

Так что да, CTRL + D работает и для формул Он может копировать и вставлять формулы тоже в Excel.

Пример № 3

Теперь давайте использовать те же данные и использовать условное форматирование в ячейке G1, а затем мы скопируем формулы с помощью сочетания клавиш CTRL + D и посмотрим, будет ли форматирование скопировано или нет.

В приведенных выше данных мы имеем ячейку G1 условно отформатирован и форматирование так, что любое значение выше 350 и ниже 450 будет иметь тот же цвет ячейки, что и ячейка G1, которая оранжевого цвета.

  • Теперь выберите диапазон ячеек от G1 до G6.

  • Теперь нажмите CTRL + D и увидите результат.

Мы видим, что кроме формул даже форматирование копирует и вставляет с помощью сочетания клавиш.

объяснение

Теперь, как мы узнали выше, CTRL D — это еще один ярлык в Excel, который копирует и вставляет данные. Из наших примеров мы видели, что даже если данные являются обычными данными или имеют формулы или имеют какое-то условное форматирование, CTRL + D работает в каждом сценарии.

Что нужно помнить о CTRL D в Excel

  • Единственное, что нужно помнить в сочетаниях клавиш CTRL + D, это то, что они работают только в столбцах, а не в строках.
  • CTRL + D работает, когда скопированные данные передаются не вверх.
  • Когда три ячейки выбраны независимо от того, какие данные находятся в первой ячейке, они копируются в две другие ячейки.

Рекомендуемые статьи

Это было руководство к CTRL D в Excel. Здесь мы обсудим, как использовать CTRL D в Excel вместе с примерами и загружаемым шаблоном Excel. Вы также можете просмотреть наши другие предлагаемые статьи —

  1. Возможность вставки в Excel
  2. Excel Удалить строку ярлык
  3. Ярлык Excel для слияния ячеек
  4. Ярлык строки вставки Excel

Цель работы: Изучить технологии обмена данными через COM порт при помощи средств ActiveX

Задача работы: Построение канала связи “Excel – объект” для целей управления.

Приборы и принадлежности: Два персональных компьютера, Microsoft Excel, COM Port Toolkit, элемент ActiveX MSCOMM32.OCX , нуль-модемный кабель, адаптер MOXA UPort 1150, Модуль дискретного ввода-вывода ОВЕН МК110, датчик температуры с частотным выходом MAX6577.

ВВЕДЕНИЕ

Все мы любим Excel за скорость и простоту отчетов. Использование Excel для прямого управления объектами позволяет исключить затраты связанные с использованием посредников, например, ОРС серверов и, при этом, максимально упростить накопление и обработку данных. В этой работе даны примеры “выхода” Excel во внешнюю среду через СОМ порт, а также показана релейная система термостатирования на базе модуля дискретного ввода-вывода ОВЕН МК110, непосредственно управляемая из Excel.

ОБЩИЕ СВЕДЕНИЯ

COM порт

После́довательный порт (англ. Serial port, COM-порт, англ. Communications port) — сленговое название интерфейса стандарта RS-232, которым массово оснащались персональные компьютеры. Наиболее часто для последовательного порта персональных компьютеров используется стандарт RS-232C. Ранее последовательный порт использовался для подключения терминала, позже для модема или мыши. Сейчас он используется для соединения с источниками бесперебойного питания, для связи с аппаратными средствами разработки встраиваемых вычислительных систем, спутниковыми ресиверами, кассовыми аппаратами, а также с приборами систем безопасности объектов.

С помощью COM-порта можно соединить два компьютера, используя так называемый «нуль-модемный кабель».

Достоинством обмена данными через COM порт является крайняя простота оборудования. Недостатком является низкая скорость, крупные размеры разъемов, а также зачастую высокие требования к времени отклика ОС и драйвера и высокое количество прерываний (одно на половину аппаратной очереди, т.е. 8 байт).

Связь Excel с COM портом осуществляется через управляющий элемент ActiveX — расширенной технологии OLE, призванной существенно увеличить функциональные возможности компьютера.

ActiveX

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

Впервые эта технология была внедрена в 1996 году компанией Microsoft как развитие технологий Component Object Model (COM) и Object Linking and Embedding (OLE) и теперь она широко используется в операционных системах семейства Microsoft Windows, хотя сама технология и не привязана к операционной системе.

Множество приложений для Microsoft Windows, включая приложения самой компании Microsoft, такие, как Internet Explorer, Microsoft Office, Microsoft Visual Studio, Windows Media Player, используют управляющие элементы ActiveX, чтобы реализовать набор функциональных возможностей и в дополнение инкапсулировать их собственный функционал в управляющие элементы ActiveX, чтобы предоставить возможность встраивать их в другие приложения.

Элемент ActiveX: MSCOMM32.OCX

Элемент управления Microsoft Comm Control 6.0 обеспечивает последовательную передачу и прием данных через COM порт. Управляемая событиями связь – мощный метод обработки событий при взаимодействии с последовательным портом.

Во многих ситуациях необходимо получать извещение в тот момент, когда происходит событие, такое как ‘прибытие’ символа или когда происходит изменение в Carrier Detect (CD) или Request To Send (RTS-линии). Для перехвата и обработки этих событий используется событие OnComm. Событие OnComm также обнаруживает и обрабатывает ошибки связи. Каждая управляемая коммуникационная связь использует один последовательный порт. Если необходимо обратиться к более чем одному COM – порту необходимо использовать больше чем одно средство управления связи.

Ряд свойств элемента управления Microsoft Comm Control 6.0 представлен в следующей таблице:



Синтаксис свойства CommPort:

MSComm.CommPort [= portNumber], portNumber можно устанавливать от 1 до 99 (по умолчанию portNumber устанавливается равным 1). Если номера COM-порта не существует MicrosoftCommControl сгенерирует ошибку 68. Свойство CommPort должно устанавливаться перед открытием COM-порта. Тип данных – Integer.

Синтаксис свойства Settings

MSComm.Settings[ = paramString], paramString состоит из четырех установок и имеет следующий формат – «BBBB, P, D, S» , где:

BBBB — скорость в бодах

P — контроль по четности

D — число битов данных

S — число стоповых битов

Примечание: MSCOMM32.OCX можно найти и скачать на официальном сайте компании Microsoft

/1fbd8927a9f57654d204624cd65bf386/ru-ru/default.aspx.

ПРИМЕРЫ ПОЛУЧЕНИЯ ПРОВЕРЕННЫХ РЕЗУЛЬТАТОВ И ВАРИАНТЫ ДЛЯ САМОКОНТРОЛЯ

Задание 1. Настройка соединения двух компьютеров, через COM порт.

1. Соедините два компьютера по RS-232 нуль модемным кабелем или, например, через MOXA UPort 1150 адаптер как показано ниже. В последнем случае необходимо установить драйвер адаптера и настроить его на работу по стандарту RS-232.



2. Запустите программы обмена данными через COM порт, например, программы COM Port Toolkit.

3. Передавая и принимая данные убедитесь, что линия последовательной передачи данных работает



Номер COM порта используемого программой устанавливается через меню Toolkit > Options > COM port configuration > Port. Показанное окно передачи сообщений Send message открывается через меню Toolkit > send. Передаваемые данные отображаются в левом окне, а принимаемые данные — в правом окне. Коды отображаются побайтно в 16-ричном формате. Так, шестнадцатиричный код 36 имеет десятеричный эквивалент 54 (как 3*16+6), это код цифры 6.

Задание 2. Обмен данными из среды Excel через COM порт.

1. Поместите элемент (MSCOMM32.OCX) в папку C:WindowsSystem32

Примечание: Скачать MicrosoftCommControl 6.0 можно с официального сайта компании Microsoft

http://www.microsoft.com/ru-ru/default.aspx.

2. Зарегистрируйте MSCOMM32.OCX в командной строке (cmd) командой regsvr32 MSCOMM32.OCX.





3. Подключите MSCOMM32.OCX к Microsoft Excel, для этого откройте вкладку Excel > Tools->References через последовательность Excel menu > Tools > Macro > Visual Basic Editor > или () и далее > Microsoft Visual Basic menu > Tools > References, в открывшемся окне выберите Browse… и, затем, элемент MSCOMM32.OCX из папки C:WindowsSystem32.

Рис. 1. Окно Referencesпосле с элементом Microsoft Comm Control 6.0 (SP6) (MSCOMM32.OCX).

4. Вставьте форму ()

Рис. 2. Вызов формы.

5. Добавьте в Toolbox элемент MSCOMM32.OCX. Он выглядит как желтый телефон.

Рис. 3. Вставка MSCOMM32.OCX в Toolbox.

6. Перетащите “телефон” из Toolbox на на форму и оставьте его где-нибудь в углу, при работе программы этот элемент отображаться не будет.

7. Добавьте в форму два окна и одну кнопку, одно окно — для ввода передаваемых данных, а второе — для вывода принимаемых данных, редактируя текст кнопки дайте ей название.

Рис. 4. Заполнение формы.

8. Для кнопки формы добавьте код приведённый ниже (для добавления кода, достаточно в редакторе дважды щелкнуть на кнопку и откроется окно для ввода кода):

Private Sub CommandButton1_Click()

MSComm1.CommPort = 1

MSComm1.Settings = «9600,N,8,1»

MSComm1.InputLen = 0

On Error Resume Next

MSComm1.PortOpen = True

If Err Then

MsgBox «Com» & MSComm1.CommPort & «: not available. Change CommPort property to another port.»

Exit Sub

End If

MSComm1.Output = TextBox1.Text

Do

Dummy = DoEvents()

Loop Until MSComm1.InBufferCount >= 8

TextBox2.Text = MSComm1.Input

MSComm1.PortOpen = False

EndSub

Этот код запускается нажатием кнопки. Он устанавливает связь с COM портом пересылает данные верхнего окна формы и дождавшись восьми байт из COM порта отображает их в нижнем окне.

Рис. 5. Форма, и ее код. Функция CommandButton1_Click(), означает, что код будет выполнен при нажатии на кнопку.

9. Понизьте уровень защиты Excel файла перед запуском макрос:

Рис. 6. Снятие защиты запуска макрос.

Примечание. Выберите Enable Macros (разрешить макрос) если система спросит об этом при при запуске программы Excel с макрос:



10. Соедините два компьютера кабелем для обмена данными через COM порты, если такое соединение не установлено.

11. На втором компьютере (по отношению к компьютеру с Excel формой) запустите программу COM Port Toolkit.

12. На первом компьютере запустите макрос кнопкой Run

.

13. Проверьте работоспособность передачи данных от Excel к COM Port Toolkit. Для этого введите данные в верхнее окно формы и нажмите на кнопку формы. COM Port Toolkit должен получить эти данные.

Рис. 7. Вид формы и Toolkit после передачи данных.

Примечание: Если появится сообщение о не возможности работать с COM портом выполните следующее.

• закройте окно предупреждения и форму.

• Узнайте номер подключенного Com порта компьютера: Start > My Computer> Properties > Hardware > Device Manager >

• Укажите на форму UserForm1

и раскройте ее код клавишей F7 или через меню Microsoft Visual Basic > View > Code.

• Замените номер порта в коде формы, например, MSComm1.CommPort = 2

Сообщение об ошибке COM порта было сформировано следующими строками Macros.

If Err Then

MsgBox «Com» & MSComm1.CommPort & «: not available. Change CommPort property to another port.»

14. Проверьте передачу данных в обратном направлении от Toolkit в Excel форму. Для этого запустите форму

введите данные в Toolkit, нажмите на клавишу send и убедитесь, что Excel форма приняла их после нажатия кнопки. Внимание: принятые данные в нижнем окне формы появятся только тогда когда их количество достигнет уровня указанноего в коде: Loop Until MSComm1.InBufferCount >= 8

Задание 3. Циклический обмен данными соединения Excel – Toolkit.

1. Доработайте код кнопки формы как показано ниже.

Private Sub CommandButton1_Click()

MSComm1.CommPort = 2

MSComm1.Settings = «9600,N,8,1»

MSComm1.InputLen = 0

On Error Resume Next

MSComm1.PortOpen = True

If Err Then

MsgBox «Com» & MSComm1.CommPort & «: not available. Change CommPort property to another port.»

Exit Sub

End If

For i = 1 To 4

MSComm1.Output = TextBox1.Text

Do

Dummy = DoEvents()

Loop Until MSComm1.InBufferCount >= 2

TextBox2.Text = MSComm1.Input

Next i

MSComm1.PortOpen = False

End Sub

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

Задание 4. Построение релейной системы термостатирования на базе устройства ввода/вывода данных МК110 с накоплением данных и управлением из Excel .

1. Соберите систему как показано на рисунке ниже.

Рис. 8. Схема соединений системы термостатирования на базе модуля МК110.

Примечание:

• Подключение системы к компьютеру через адаптер UPort 1150 показано на рисунке задания 1.

• Датчик темепатуры установите в зоне нагревателя – лампы.

• Modbus команды приема/передачи данных модуля MK110:



• В соответствии с modbus протоколом устройство МК110 дает ответ на каждую принятую команду в виде последовательности байт.

• Объект COM порта разделяет нулями байты ответа устройства МК110 которые считываются из приемного буфера СОМ порта. Это необходимо учитывать при выделении нужной информации из ответа устройства.

2. Драйвер USB адаптера МОХА UPort 1150 настройте на работу по протоколу RS-485 2W.

3. Запустите Excel и постройте форму как показано в задании 2 включив в нее следующие объекты Toolbox: “телефон”, прокрутку (Scrollbar) и кнопку (CommandButton).

Рис. 9. Пример рабочей формы.

4. Заполните шаблоны объектов формы следующими VBA кодами.

Код кнопки Run:

Private Declare Sub Sleep Lib «kernel32» (ByVal dwMilliseconds As Long) ‘необходима для задания задержки

Private Sub CommandButton1_Click()

Dim MyString As String

Dim b() As Byte

For i = 1 To 20 ‘ начало цикла термостатирования

‘ Установка связи c СОМ портом

MSComm1.CommPort = 2 ‘ номер СОМ порта

MSComm1.Settings = «9600,N,8,1» ‘ скорость передачи СОМ порта и другие параметры

MSComm1.InputLen = 0

On Error Resume Next

MSComm1.PortOpen = True

If Err Then ‘ выводимое сообщение об ошибке открытия СОМ порта:

MsgBox «Com» & MSComm1.CommPort & «: not available. Change CommPort property to another port.»

Exit Sub

End If

b = MSComm1.Input ‘ считывание ответов МК110 на команды “Counter Reset” и “Counter

‘ Read” из входного буфера COM порта (байты ответов разделен нулями),

‘ вычисление значения температуры датчика в градусах С и запись температуры в соответствующую

‘ ячейку таблицы Excel:

Sheet1.Cells(i + 6, 2).Value = (b(UBound(b) — 7) * 256 + b(UBound(b) — 5)) / 1.047 — 273.15

‘ сравнение температуры датчика с заданной температурой хранимой в ячейке В4: Sheet1.Cells(4, 2)

If Sheet1.Cells(i + 6, 2).Value > Sheet1.Cells(4, 2).Value Then

‘ Lamp OFF ‘ выключение лампы по протоколу modbus::

MSComm1.Output = Chr$(16) + Chr$(16) + Chr$(
Innocent
+ Chr$(1) + Chr$(
Innocent
+ Chr$(1) + Chr$(2) + Chr$(
Innocent
+ Chr$(
Innocent
+ Chr$(103) + Chr$(209)

Sheet1.Cells(i + 6, 3) = «Off» ‘ запись “Off” в соответствующую ячейку Excel

Else

‘ Lamp ON OFF ‘ включение лампы по протоколу modbus::

MSComm1.Output = Chr$(16) + Chr$(16) + Chr$(
Innocent
+ Chr$(1) + Chr$(
Innocent
+ Chr$(1) + Chr$(2) + Chr$(3) + Chr$(132) + Chr$(103) + Chr$(66)

Sheet1.Cells(i + 6, 3) = «On» » ‘ запись “On” в соответствующую ячейку Excel

End If

MSComm1.PortOpen = False ‘ отсоединение от COM порта

Next I ‘‘ окончание цикла

End Sub

Код прокрутки:

Private Sub ScrollBar1_Change()

‘запись значения прокрутки как заданной температуры в ячейку B4 Excel

Sheet1.Cells(4, 2).Value = ScrollBar1.Value

End Sub

5. Подготовьте заголовки таблицы:

6. Запустите макрос формы.

7. С помощью прокрутки установите заданную температуру отображаемую в ячейке B4.

8. Запустите термостатирование нажатием кнопки Run формы

9. Сравните собственный процесс термостатирования с результатом, представленным ниже.

Пример результатов работы системы термостатирования управляемой из Excel через COM порт. Excel не только напрямую управляет процессом поддержания заданной температуры (здесь 44С) используя макрос, но и накапливает действительные значения температуры (ячейки B7:B26) и состояния нагревателя (ячейки С7:C26).

КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Какие средства необходимы для обеспечения прямого управления из Excel?

2. От чего зависит частота контура управления через СОМ порт?

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. Модули дискретного ввода/вывода MK110-220.8Д(ДН).4Р, MK110-24.8Д(ДН).4Р, MK110-224.8Д(ДН).4Р. Руководство по эксплуатации

2. Гульванский В.В., Забродин О.В., Кудряшов К.В. Отчет по ЛР №9 на тему: «Обмен данными черезcom-порт из Excel»

MSCOMM32.OCX прилагается:

Вложение Размер
08.04_COM port control in Excel.zip 52.16 КБ

8 апреля 2022 г.

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

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

Некоторые другие функции диспетчера сценариев включают сохранение различных групп значений, объединение различных сценариев и создание сводок по каждой ситуации. Использование этого инструмента может помочь бизнесу понять и предсказать важную информацию о процессе принятия решений. Это также может помочь заинтересованным сторонам эффективно сотрудничать в проекте, основанном на данных.

Как использовать диспетчер сценариев в Excel

Вот шесть шагов, которые вы можете предпринять, чтобы перемещаться по диспетчеру сценариев:

1. Найдите диспетчер сценариев

Чтобы начать использовать диспетчер сценариев, найдите его в Excel. В верхней части экрана вы можете выбрать «Данные». Оттуда найдите значок «Что, если анализ» и щелкните раскрывающееся меню рядом с ним. В меню выберите опцию «Менеджер сценариев».

2. Введите данные в электронную таблицу

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

После того, как вы ввели эти изменяющиеся ячейки, вы можете добавить формулу, отражающую, как изменяющиеся ячейки соотносятся друг с другом. Чтобы ввести формулу, выберите ячейку, в которую вы хотите вставить свои вычисления, и введите знак равенства. Затем вы можете добавить остальную часть формулы. Например, если вы хотите использовать формулу, которая складывает значения затрат на рабочую силу в одной ячейке с пометкой A1 и стоимость материала в другой ячейке с пометкой A2, вы можете ввести «=A1+A2». После этого вы можете нажать «Enter», чтобы применить формулу.

3. Создайте сценарий

Выберите опцию «Добавить» в диспетчере сценариев. В некоторых версиях Excel этот параметр может выглядеть как знак «плюс». Когда откроется экран «Добавить», вы можете ввести имя своего сценария в разделе «Имя сценария». Придумайте описательное имя, которое вы сможете легко распознать при анализе каждого набора значений. Например, если вы хотите создать сценарий для высоких эксплуатационных расходов, вы можете назвать свой сценарий «Сценарий наихудшего случая» или «Максимально возможные эксплуатационные расходы».

После того, как вы назвали свой сценарий, вы можете ввести имена изменяемых ячеек в разделе «Изменение ячеек», разделенные запятой. В зависимости от предпочтений компании вы также можете выбрать «Предотвратить изменения», чтобы защититься от редактирования сценария. Сделав это, нажмите кнопку «ОК», чтобы сгенерировать сценарий.

4. Добавьте еще один сценарий

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

Оттуда вы можете открыть диспетчер сценариев, добавить и назвать новый сценарий. Например, вы можете назвать сценарий с низкими эксплуатационными расходами, используя более описательный язык, например «Благоприятные результаты с низкими затратами». Вы также можете добавить любые комментарии, которые могут добавить контекст. После того как вы создали этот новый сценарий, он обычно появляется в функции менеджера вместе с любыми предыдущими дополнениями.

5. Слияние сценариев

С помощью диспетчера сценариев вы можете объединять несколько сценариев из разных источников для сравнения и анализа данных. Например, компания может решить сравнить данные об операционных расходах из различных отделов бизнеса. Сбор информации о наилучших и наихудших сценариях операционных расходов для каждого отдела может помочь организации лучше подготовиться к будущим результатам бизнеса.

Для начала соберите все соответствующие электронные таблицы, содержащие сценарии. Убедитесь, что все участники написали сценарии в одном и том же формате ячеек, чтобы упростить сравнение данных. Например, если один отдел вводит стоимость рабочей силы в ячейку A1, может быть полезно, если другой отдел поместит свои затраты в ту же ячейку. После. вы можете открыть диспетчер сценариев и выбрать опцию «Объединить». Когда появится список возможных сценариев, выберите те, которые вы хотите объединить, и нажмите кнопку «ОК». Это действие помещает все сценарии на один рабочий лист.

6. Создайте сводный отчет по сценарию

Вы также можете создать сводный отчет по сценариям для параллельного сравнения результатов нескольких сценариев. Это может создать четкое представление о потенциальных результатах каждого сценария. Сводная информация может помочь организации визуализировать влияние различных значений или переменных.

Для этого откройте менеджер сценариев и выберите «Сводка». Оттуда вы можете выбрать «Сводную таблицу сценария» или «Сводную таблицу», которая позволяет размещать большие наборы данных в строках или столбцах одной и той же ячейки. Следующим шагом является проверка того, что раздел «Ячейки результатов» содержит ячейки формулы из вашего сценария, и нажмите «ОК», чтобы создать отчет.

Обратите внимание, что ни одна из компаний, упомянутых в этой статье, не связана с компанией Indeed.

Понравилась статья? Поделить с друзьями:
  • Что такое контекстные вкладки excel
  • Что такое копирование текста в word
  • Что такое контекстное поиск в word
  • Что такое копилка в word
  • Что такое контекстное меню word