TIPTOP

4GL execute excel macro

#axmi171-02 start
DEFINE xlapp           INTEGER  # Excel 應用程式 Handle
DEFINE xlwb            INTEGER  # Excel workbook Handle
DEFINE result          STRING   # 錯誤代碼
#axmi171-02 end
IF cl_chk_act_auth() THEN
    display cl_download_file("/u1/topprod/topcust/doc/axmi171_yearPlan.xlt", "C:/tiptop/axmi171_yearPlan.xlt")
    CALL openExcel()
    CALL SetProperty( "N1", 0, 0, "value", g_opc.ta_opcud01)
    call ui.interface.frontcall("WinCOM","CallMethod",[xlwb,'Sheets(1).setYearPlanQty'],[result])
    CALL freeExcelMemory()
END IF
#axmi171-02 start
FUNCTION SetProperty( p_location, p_x, p_y, p_type, p_value)
      DEFINE p_location STRING,
             p_x        INTEGER,
             p_y        INTEGER,
             p_type     STRING,
             p_value    STRING,
             l_error_count INT
      #先判定用Range還是用Cells
      IF p_location is null THEN
            LET p_location = 'Activesheet.Cells( ',p_x,', ',p_y,')'
      ELSE
            LET p_location = 'Activesheet.Range("',p_location,'")'
      END IF

      CASE p_type
            WHEN "value"
                  LET p_location = p_location , ".Value"
            WHEN "size"
                  LET p_location = p_location , ".Font.Size"
            WHEN "bold"
                  LET p_location = p_location , ".Font.Bold"
            WHEN "name"
                  LET p_location = p_location , ".Font.Name"
            WHEN "border-left" #1:細實  2:細虛  4:點虛  9:雙細實線) 
                  #1:左 2:右 3:頂 4:底 5:斜 6:斜/
                  LET p_location = p_location , ".Borders(1).LineStyle"
            WHEN "border-right"
                  LET p_location = p_location , ".Borders(2).LineStyle"
            WHEN "border-top"
                  LET p_location = p_location , ".Borders(3).LineStyle"
            WHEN "border-bottom"
                  LET p_location = p_location , ".Borders(4).LineStyle"
            WHEN "Horizontal" #設定水平
                  CASE p_value
                        WHEN "center"
                              LET p_value = "3"
                        WHEN "right"
                              LET p_value = "4"
                        OTHERWISE
                              LET p_value = "2"
                  END CASE
                  LET p_location = p_location , ".HorizontalAlignment"
            WHEN "Vertical"   #設定垂直 4可自動換列
                  CASE p_value
                        WHEN "top"
                              LET p_value = "1"
                        WHEN "bottom"
                              LET p_value = "3"
                        WHEN "auto"
                              LET p_value = "4"
                        OTHERWISE
                              LET p_value = "2"
                  END CASE
                  LET p_location = p_location , ".VerticalAlignment"
      END CASE

      WHILE TRUE
          CALL ui.interface.frontCall("WinCOM", "SetProperty", [xlwb, p_location, p_value], [result])
          IF result=0 THEN
              EXIT WHILE
          else
              sleep 0.1
              LET l_error_count = l_error_count + 1
              IF l_error_count > 100 THEN
                  EXIT WHILE
              END IF
          END IF
      END WHILE
      #CALL checkExcelError( result, "Excel SetProperty Error!")
END FUNCTION

FUNCTION checkExcelError( p_result, p_errMsg)
      DEFINE p_result   INTEGER,
             p_errMsg   STRING
      IF p_result <> "-1" THEN RETURN END IF
      display p_errMsg
END FUNCTION

FUNCTION openExcel()
      CALL ui.Interface.frontCall("WinCOM", "CreateInstance", ["Excel.Application"], [xlapp])
      #CALL checkExcelError( xlapp, "Open Excel Error!")
      #CALL checkExcelError(xlapp,"Open Excel",1)

      #新的excel
      #CALL ui.interface.frontcall("WinCOM","CallMethod",[xlapp,"WorkBooks.Add"],[xlwb])
      #CALL checkExcelError( xlwb, "WorkBooks Add Error!")
      #CALL checkExcelError(xlwb,"Create Excel",1)

       CALL ui.interface.frontcall("WinCOM","CallMethod",[xlapp,"WorkBooks.Open","C:\\tiptop\\axmi171_yearPlan.xlt"],[xlwb])


      #CALL ui.interface.frontCall("WinCOM", "GetProperty", [xlapp, 'Worksheets.Count'], [l_body_value])
      #CALL checkExcelError(xlwb,"Count Sheet",2)
      #display xlapp
      #display l_body_value

      CALL ui.interface.frontcall("WinCOM","SetProperty",[xlapp,"Visible",true],[result])
      #CALL checkExcelError( result, "Excel Visible Error!")
      #CALL ui.interface.frontcall("WinCOM","SetProperty",[xlapp,"Worksheets(2).Visible",false],[result])
      #CALL ui.interface.frontcall("WinCOM","SetProperty",[xlapp,"Worksheets(1).Name", "JOSH"],[result])

      #顯示格線否
      #call ui.interface.frontcall("WinCOM","SetProperty",[xlapp,"ActiveWindow.DisplayGridlines",false],[result])


END FUNCTION

FUNCTION freeExcelMemory()
      CALL ui.interface.frontcall("WinCOM","SetProperty",[xlapp,"Visible",true],[result])
      CALL ui.Interface.frontCall("WinCOM","ReleaseInstance", [xlwb], [result] )
      CALL ui.Interface.frontCall("WinCOM","ReleaseInstance", [xlapp], [result] )
END FUNCTION

#axmi171-02 end
#精簡範例
#########################################################
CALL ui.Interface.frontCall("WinCOM", "CreateInstance", ["Word.Application"], [xlapp])
CALL ui.interface.frontcall("WinCOM","CallMethod",[xlapp,"Documents.Open","C:\\tiptop\\macro01.doc"],[xlwb])
#CALL ui.Interface.frontCall("WINCOM","CallMethod",[xlapp,"Documents.Add"],[xlwb])

CALL ui.interface.frontcall("WinCOM","SetProperty",[xlapp,"Visible",false],[result])

#call宏
CALL ui.interface.frontcall("WinCOM","CallMethod",[xlwb,'test','arg123','arg456'],[result])

#存檔並關閉
#CALL ui.Interface.frontCall("WinCOM","CallMethod",[xlwb, 'Save'],[result])
#CALL ui.Interface.frontCall("WinCOM","CallMethod",[xlwb, 'close'],[result])
#不存檔不提示,避免卡彈
CALL ui.interface.frontCall('WinCOM','CallMethod',[xlwb,'close',false],[result])

#關閉程式
CALL ui.interface.frontCall('WinCOM','CallMethod',[xlApp,'Quit'],[result])

CALL ui.Interface.frontCall("WinCOM","ReleaseInstance", [xlwb], [result])
CALL ui.Interface.frontCall("WinCOM","ReleaseInstance", [xlapp],[result])

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。