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

VBA для копирования значений свойств из одного объекта в другой

Модератор: Глоб.модераторы

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

Автор темы
Exactamente
частый гость
частый гость
Сообщения: 409
Зарегистрирован: 20 ноя 2012, 13:45
Имя: :.О.N.Ф
Страна: Россия
Благодарил (а): 3 раза
Поблагодарили: 7 раз

VBA для копирования значений свойств из одного объекта в другой

Сообщение Exactamente »

Есть у кого-нибудь такой, поделитесь?
В частности, интересуют динамические (привязки к тегам и скриптам) и события. Для случаев, когда нужно в customized object'e что-то поменять, а таких объектов полсотни - чтобы не ручками набивать, а изменить один, наклонировать и подменить ими уже существующие с переносом их настроек. За пару дней, конечно, можно наваять, но чтоб время не терять - вдруг есть готовое? Да и не сказать, что испытываю особую любовь к VBA, даже наоборот) Кстати, VB по результатами опроса stackoverflow в этом году признан самой нелюбимой технологией)
«Сразу видно внимание к каждой мелочи, неиспорченным не осталось ничто».

SaNNy
освоился
освоился
Сообщения: 260
Зарегистрирован: 01 фев 2010, 10:37
Имя: Александр
Страна: Россия
город/регион: Брянск
Благодарил (а): 10 раз
Поблагодарили: 33 раза

VBA для копирования значений свойств из одного объекта в другой

Сообщение SaNNy »

В общем виде такого в VBA сделать не возможно, а так, проще самому скрипт набросать
Аватара пользователя

DelSnos
не первый раз у нас
не первый раз у нас
Сообщения: 323
Зарегистрирован: 26 сен 2010, 10:18
Имя: Artur
Страна: Russia
Поблагодарили: 2 раза

VBA для копирования значений свойств из одного объекта в другой

Сообщение DelSnos »

Готового кода для вашей задачи нет, но есть код, который может быть вам сэкономит время. Давно это было, правда. Попробую вспомнить :ges_hmm:
Ниже код, который ищет тип объекта GroupObject, в имени которого есть "ST_AS_", далее он уже в этом GroupObject ищет объект с именем "Value", после чего копирует название тега из свойства "OutputValue в атрибут "ReplaceTagname".
Далее происходит поиск "ReplaceTagname" по Excel-документу "All_CommentsEngUnits.xlsm", если есть, то копируются оттуда ячейки, содержащие комментарий тега и ед. измерения. в определенный массив "Comment".
Далее происходит запись С-скрипта по mouse action этого GroupObject . Текст скрипта копируется из файла "PictureTreeManager.xlsx"
c подстановкой массива "Comment" в определенное место скрипта... Как-то так.
Также код автоматически открывает и сохраняет проделанные изменения в PDL-файлы. Список PDL-файлов подсасывается из excel-документа "PictureTreeManager.xlsx".

Код: Выделить всё

Sub FindObjectsByName()
Dim fso As FileSystemObject
Dim TextStream As TextStream
Dim pStream As TextStream
Dim strCode As String
Dim FileLines() As String
Set fso = CreateObject("Scripting.FileSystemObject")
Set TextStream = fso.OpenTextFile("D:\work\forVBA\CTrendSmallRightClick.txt", ForReading) ' в этом файле записан скрипт, который будет автоматически вставляться п.к.м по нажатию на иконку.
strCode = TextStream.ReadAll
TextStream.Close

Dim colSearchResults As HMICollection
[b]Dim objMember As HMIObject[/b]
Dim iResult As Integer
Dim strName As String
Dim objGroup As HMIGroup
Dim iMaxMembers As Integer
Dim NameGroup As String

Dim objVBScript As HMIScriptInfo
Dim ObjEvent As HMIEvent

Dim objXLS As Excel.Application
Dim objWSheet As Excel.Worksheet
Dim objWBook As Excel.Workbook
Dim objWSheet_All_comments As Excel.Worksheet
Dim objWBook_All_comments As Excel.Workbook
Dim iRow As Long
Dim iClm As Long
Dim str As String
Set objWBook = Workbooks.Open("D:\work\forVBA\PictureTreeManager.xlsx")
Set objWSheet = objWBook.Worksheets.Item("PTM")

Set objWBook_All_comments = Workbooks.Open("D:\work\forVBA\All_CommentsEngUnits.xlsm")
Set objWSheet_All_comments = objWBook_All_comments.Worksheets.Item("Лист1")

Dim strCodeReplace As String
Dim ReplaceTagname As String


For t = 1 To objWSheet.UsedRange.Rows.Count
Set PDL1 = Documents.Open(objWSheet.Cells(t, 2).value, hmiOpenDocumentTypeInvisible) 'Активация PDL-ки
[b]Set colSearchResults = PDL1.HMIObjects.Find(ObjectType:="HMIGroup", ObjectName:="*ST_AS_*")[/b]

[b]For Each objMember In colSearchResults
        iResult = colSearchResults.Count
        strName = objMember.ObjectName
        Set objGroup = PDL1.HMIObjects(strName)
        iMaxMembers = objGroup.GroupedHMIObjects.Count
          For j = 1 To iMaxMembers

                If InStr(1, objGroup.GroupedHMIObjects(j).ObjectName, "value", vbTextCompare) > 0 Then
                    If objGroup.GroupedHMIObjects(j).Properties("OutputValue").DynamicStateType > 1 Then
                            Set DynamicName = objGroup.GroupedHMIObjects(j).Properties("OutputValue").Dynamic

                            ReplaceTagname = DynamicName.SourceCode ' Если есть Dynamic соединение (DynamicStateType>1)

                        Else
                            If objGroup.GroupedHMIObjects(j).Properties("OutputValue").DynamicStateType = 0 Then
                                ReplaceTagname = "NotTag"

                                    Else
                                        ReplaceTagname = objGroup.GroupedHMIObjects(j).Properties("OutputValue").Dynamic.VarName ' Прямое соединение тега (DynamicStateType=1)[/b]
'On Error Resume Next: Err.Clear

Dim Comment
Dim pos
Dim k
Set FindText = Range("D1", Range("D" & Rows.Count).End(xlUp))   'Текст для поиска

For pos = 1 To FindText.Count
If InStr(1, Cells(pos, 4).value, ReplaceTagname, vbTextCompare) > 0 Then
Comment = ReplaceTagname + ";" + Cells(pos, 7) + ";" + Cells(pos, 6)
End If

Next

                            End If
                    End If
                End If
            Next
        Set objVBScript = objMember.Events(1).Actions.AddAction(hmiActionCreationTypeVBScript)
        objVBScript.Delete
        Set objVBScript = objMember.Events(1).Actions.AddAction(hmiActionCreationTypeCScript)
            With objVBScript
            .SourceCode = strCode
            End With
        ' Замена динамических значений уже записанного кода
        strCodeReplace = Replace(objVBScript.SourceCode, "ReplaceTagname", Comment) ' меняем имя тега
        objVBScript.SourceCode = strCodeReplace

Next objMember

ActiveDocument.Save
ActiveDocument.Close
Next
MsgBox "Готово!"
End Sub
Аватара пользователя

Автор темы
Exactamente
частый гость
частый гость
Сообщения: 409
Зарегистрирован: 20 ноя 2012, 13:45
Имя: :.О.N.Ф
Страна: Россия
Благодарил (а): 3 раза
Поблагодарили: 7 раз

VBA для копирования значений свойств из одного объекта в другой

Сообщение Exactamente »

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

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