none
VISIO SHAPE 바꾸기 매크로 RRS feed

  • 질문

  • visioShape 변수는 visio.Shape 오브젝트로 선언하였으며,

    StencilAUtiliser 변수는 visio.document 오브젝트로 선언하였습니다.

    visioFile은 visio.application으로 오브젝트를 선언했습니다.

    visioFile.Documents.Open (idx1.Value)

    Set StencilAUtiliser = visioFile.Documents.OpenEx("c:\SKCC.vssx", visOpenRW)

    visioShape.replaceShape StencilAUtiliser.Masters.ItemU("주석") 해당 문구에서 오류나 나는데 원인을 못찾고 있습니다.

    'ReplaceShape'메서드('IVShape'개체의)에서 오류가 발생하였습니다.  라고 표기되는데 원인을 못찾고 있습니다.

    ----- 아래 소스 ----

    Sub changeShape()

      Application.DisplayAlerts = False
      Application.ScreenUpdating = False
      Application.Calculation = xlCalculationManual
      Application.EnableEvents = False
      ActiveSheet.DisplayPageBreaks = False

      '비지오 객체정의
      Dim visioFile As New visio.Application
      Dim visioFileNew As New visio.Application
      Dim visioDocument As visio.Document
      Dim visioDocuments As visio.Documents
      Dim visioStencil As visio.Masters
      Dim visioPage As visio.Page
      Dim visioShape As visio.Shape
      Dim visioCommentShape As visio.Shape
      Dim visioIVShape As visio.IVShape
      Dim DiagramServices As Integer
     
     
      '변수 정의
      Dim lErrPointRow As Long     '에러 시트에 찍을 row num 위치
      Dim sMasterNm As String      '마스터명
      Dim sActId As String         'Activity id 저장용
      Dim sComment As String       'Activity id 저장용
      Dim iPageNo As Integer       '페이지 수
      Dim sCustLabel As String     'shape의 데이터 변수명
      Dim sCustVal As String       'shape의 데이터 변수의 값
      Dim lCnt As Long             'shape 정상여부 변수
      
      '현재 엑셀 파일
      Dim mainWorkbook As Workbook
      Set mainWorkbook = ThisWorkbook

      ' 파일 for 문을 위한 파일 오브젝트
      Dim idx1 As Object

      ' 엑셀 파일의 각 시트 오브젝트
      Dim mainSheet As Worksheet
      Dim errSheet As Worksheet
     
      ' 엑셀 파일의 각 시트 오브젝트 대입
      Set mainSheet = mainWorkbook.Worksheets("선택")
      Set errSheet = mainWorkbook.Worksheets("오류목록")
     
      Dim fileRange As Range   '파일리스트
      Dim errRange As Range    'error 시트 삭제할 범위

      '파일리스트 정하기
      Set fileRange = Range(mainSheet.Range("SRC_시작").Offset(1, 0), mainSheet.Range("SRC_시작").End(xlDown))
      Set errRange = Range(errSheet.Range("A2", "D2"), errSheet.Range("A2", "D2").End(xlDown))

      Dim StencilAUtiliser As visio.Document

      errRange.Delete

      lErrPointRow = 2    '에러 시트의 찍는 시작시점
     
           'Visio.Application.Documents.OpenEx "C:\SKCC.vssx", visOpenRO + visOpenDocked
         
     
      For Each idx1 In fileRange.Cells
          
          Set StencilAUtiliser = visioFile.Documents.OpenEx("c:\SKCC.vssx", visOpenRW)
          visioFile.Documents.Open (idx1.Value)
          visioFile.ActiveWindow.Page.Drop visioFile.Application.Documents.Item("c:\SKCC.vssx").Masters.ItemU("주석"), 1.279528, 11.532553

          iPageNo = 0
     
          '파일 하나에 페이지를 하나씩 뒤져 shape를 찾음
          For Each visioPage In visioFile.ActiveDocument.Pages
              iPageNo = iPageNo + 1
              If visioPage.Type = visio.VisPageTypes.visTypeForeground Then
                 
                 'comment 찾기
                 For Each visioShape In visioPage.Shapes
                 
                      If Not visioShape.Master Is Nothing Then

                          '스탠실 명칭에 .붙은 경우 뒷 내용 모두 자르기
                          sMasterNm = visioShape.Master
                          If InStr(sMasterNm, ".") <= 0 Then
                          Else
                              sMasterNm = Left(sMasterNm, InStr(sMasterNm, ".") - 1)
                          End If
                         
                          '★★★★★★ comment 찾기 ★★★★★
                          If sMasterNm = "comment" Then
                              Set visioCommentShape = visioShape
                              Exit For
                          End If
                     End If
                 Next
                
                  '해당 페이지의 각 쉐이프 for문 돌리기
                  For Each visioShape In visioPage.Shapes
                 
                      If Not visioShape.Master Is Nothing Then

                          '스탠실 명칭에 .붙은 경우 뒷 내용 모두 자르기
                          sMasterNm = visioShape.Master
                          If InStr(sMasterNm, ".") <= 0 Then
                          Else
                              sMasterNm = Left(sMasterNm, InStr(sMasterNm, ".") - 1)
                          End If
                         
                          '★★★★★★노트, FR NOTE일 경우 전환작업 진행★★★★★
                          If sMasterNm = "Note" Or sMasterNm = "FR Note" Then
                              lCnt = 0 '초기화
                             
                              For iRowCnt = 0 To visioShape.RowCount(visio.visSectionProp) - 1
                                  sCustLabel = Replace(visioShape.CellsSRC(visio.VisSectionIndices.visSectionProp, iRowCnt, visio.VisCellIndices.visCustPropsLabel).FormulaU, """", "")
                                  sCustVal = Replace(visioShape.CellsSRC(visio.VisSectionIndices.visSectionProp, iRowCnt, visio.VisCellIndices.visCustPropsValue).FormulaU, """", "")
                                  '전환전 값 전환
                                  Select Case sCustLabel:
                                         Case "U_Activity ID"
                                              sActId = sCustVal
                                              lCnt = lCnt + 1
                                         Case "U_주석"
                                              sComment = sCustVal
                                              lCnt = lCnt + 1
                                  End Select
                              Next iRowCnt
                             
                              If lCnt <> 2 Then
                                  '주석과 ACTIVITY ID가 없는 경우 오류 빼기
                                  errSheet.Cells(lErrPointRow, 1).Value = idx1.Value
                                  errSheet.Cells(lErrPointRow, 2).Value = iPageNo
                                  errSheet.Cells(lErrPointRow, 3).Value = visioShape.ID
                                  errSheet.Cells(lErrPointRow, 4).Value = sMasterNm
                                  errSheet.Cells(lErrPointRow, 5).Value = sComment
                              Else
                                  '정상인 경우 저장하기
                                  DiagramServices = visioFile.ActiveDocument.DiagramServicesEnabled
                                  visioFile.ActiveWindow.DeselectAll
                                  visioFile.ActiveWindow.Select visioShape, visio.visSelect
                                  visioShape.replaceShape StencilAUtiliser.Masters.ItemU("주석")
                                 
                                  visioFile.ActiveDocument.DiagramServicesEnabled = DiagramServices
                                 
                              End If
                          ElseIf sMasterNm = "comment" Then
                              MsgBox visioShape.ID
                          End If
                      End If
                  Next
              End If
          Next
         
          'visioFile.ActiveDocument.Version = visVersion140
         
          visioFile.ActiveDocument.Save
         
          'visioFile.ActiveWindow.Close
          visioFile.ActiveDocument.Close

    2015년 2월 27일 금요일 오전 4:27

모든 응답

  • ReplaceShape 메서드 사용형식은 아래 와 같습니다.

    expression  .ReplaceShape(MasterOrMasterShortcutToDrop,ReplaceFlags)

    expression   A variable that represents a Shape object.

    Name

    Required/Optional

    Data type

    Description

    MasterOrMasterShortcutToDrop

    Required

    UNKNOWN

    Specifies the replacement shape to drop. Must be either a Master or MasterShortcut object.

    ReplaceFlags

    Optional

    INT32

    Specifies the properties of the original shape to retain in the new shape. Possible values include any of the VisReplaceFlags constants, and certain combinations of those constants. See Remarks for more information.

    참조 API와 형식이 상이해보이는데... 위와 같이 선언하신 부분이 가능한 부분인지 확인이 되지 않습니다.

    Visio 전문 커뮤니티에 문의 해보시길 바랍니다.

    [참고자료]

    Shape.ReplaceShape Method (Visio)

    감사합니다.

    2015년 2월 27일 금요일 오전 7:31
    중재자