안년하세요!
이번에 시스템을 업그레이드 하면서 이전에 사용중인 Lisp을 사용하고자 하였으나 오류가 발생하여 엑셀 경로와 버젼 등을 수정하였으나 해결이 안되고 있습니다. 여러 고수분들의 도움이 절실하오니 내용 보시고 의견을 달아 주시기 부탁 드립니다
; 오류: 잘못된 인수 유형: VLA-OBJECT nil
변경 전: 윈도우 xp 32bit,. Autocad2013 32bit, 엑셀 2007 32bit
변경 후: 윈도우 7 64Bit, AutoCAD2015 64Bit, 엑셀: 2013 64Bit
(defun excel_to_lisp ()
(setq sheetname “CAD_OUT”);; 엑셀의 시트 이름
(vl-load-com)
(if (null msxc-xl24HourClock)
(vlax-import-type-library
:tlb-filename
;;;”C:/Program Files/Microsoft Office/OFFICE12/XL5EN32.OLB”
“C:/Program FilesMicrosoft OfficeOffice15/MSOUTL.OLB”
:methods-prefix
“msxm-“
:properties-prefix
“msxp-“
:constants-prefix
“msxc-“
)
)
;; (setq *msx* (vlax-get-or-create-object “Excel.Application.12”))
(setq *msx* (vlax-get-or-create-object “Excel.Application.15”))
;; 엑셀이 실행되고 있지 않으면.. 실행 구문 추가(2013.02.13)
(if (/= (vla-get-visible *msx*) :vlax-true)
(progn
(vla-put-visible *msx* 1);;———— 엑셀을 실행한다
(alert “시트 이름 CAD_OUT이 있는 엑셀파일을 선택하시오..”)
(msxm-findfile *msx*);;—————- 엑셀에서 파일열기 대화상자가 열려서, 파일을 선택한다..
)
)
(if (/= nil *msx*)
(progn
(setq *sheets* (vlax-get-property *msx* ‘Sheets))
(setq *worksheet* (vlax-get-property *sheets* ‘Item sheetname))
(msxm-activate *worksheet*)
(setq *range* (vlax-get-property *worksheet* ‘UsedRange))
(setq *columns* (vlax-get-property *range* ‘columns))
(setq col_cnt (vlax-get-property *columns* ‘count))
(setq *rows* (vlax-get-property *range* ‘rows))
(setq row_cnt (vlax-get-property *rows* ‘count))
(setq row 1)
(setq gear_list (list))
(repeat row_cnt
(setq col 1)
(setq gear_list_X (list))
(repeat col_cnt
(setq newrange (vlax-get-property *range* ‘Item row col))
(setq *newrange2* (vlax-variant-value newrange))
(setq cellValue (vlax-variant-value (vlax-get-property *newrange2* ‘value xlRangeValueDefault)))
(setq gear_list_X (append gear_list_X (list cellValue)))
(setq col (1+ col))
)
(setq row (1+ row))
(setq gear_list (append gear_list (list cellValue)))
;;; (setq gear_list (append gear_list (list gear_list_X)))
)
)
)
(vlax-release-object *msx*)
(vlax-release-object *sheets*)
(vlax-release-object *worksheet*)
(vlax-release-object *columns*)
(vlax-release-object *rows*)
(vlax-release-object *newrange2*)
gear_list
)
공유
(defun excel_to_lisp ()
(setq sheetname “CAD_OUT”);; 엑셀의 시트 이름
;(setq sheetname “Sheet1”);; 엑셀의 시트 이름
(vl-load-com)
(setq *msx* (vlax-get-or-create-object “Excel.Application”))
(if (/= (vla-get-visible *msx*) :vlax-true)
(progn
(vla-put-visible *msx* 1);;———— 엑셀을 실행한다
(alert “시트 이름 CAD_OUT이 있는 엑셀파일을 선택하시오..”)
(vlax-invoke-method *msx* ‘findfile);;—————- 엑셀에서 파일열기 대화상자가 열려서, 파일을 선택한다..
)
)
(if (/= nil *msx*)
(progn
(setq *sheets* (vlax-get-property *msx* ‘Sheets))
(setq *worksheet* (vlax-get-property *sheets* ‘Item sheetname))
(vlax-invoke-method *worksheet* ‘activate)
(setq *range* (vlax-get-property *worksheet* ‘UsedRange))
(setq *columns* (vlax-get-property *range* ‘columns))
(setq col_cnt (vlax-get-property *columns* ‘count))
(setq *rows* (vlax-get-property *range* ‘rows))
(setq row_cnt (vlax-get-property *rows* ‘count))
(setq row 1)
(setq gear_list (list))
(repeat row_cnt
(setq col 1)
(setq gear_list_X (list))
(repeat col_cnt
(setq newrange (vlax-get-property *range* ‘Item row col))
(setq *newrange2* (vlax-variant-value newrange))
(setq cellValue (vlax-variant-value (vlax-get-property *newrange2* ‘value 10)))
(setq gear_list_X (append gear_list_X (list cellValue)))
(setq col (1+ col))
)
(setq row (1+ row))
(setq gear_list (append gear_list (list cellValue)))
)
)
)
(vlax-release-object *msx*)
(vlax-release-object *sheets*)
(vlax-release-object *worksheet*)
(vlax-release-object *columns*)
(vlax-release-object *rows*)
(vlax-release-object *newrange2*)
gear_list
)
수정해 주신 프로그램 중 ” (setq sheetname “Sheet1”);; 엑셀의 시트 이름 “
이 부분을 삭제하고 하니 정상적으로 프로그램이 돌아 갑니다.
바쁘신데 도와 주셔서 감사 드립니다.
테스트하느라 임시로 만들고 안지웠네요. ㅎㅎ
죄송한데 이 리습 명령어가 먼가요???
엑셀에 있는.. 값을 리트스로 가져오는 함수 인걸로 추정되네요..