Chuyển đến nội dung
Diễn đàn CADViet
emhn

AutoCAD với Excel

Các bài được khuyến nghị

Ngoài ra, các chương trình VB nói chung có một nhược điểm chí mạng: phụ thuộc quá nhiều vào cái đám Libraries -> phụ thuộc vào version của Excel, VB lẫn Acad. Điều đó có nghĩa là, cái bạn làm chạy rất tốt trên máy bạn nhưng khi share cho ai đó thì chưa chắc họ dùng được. Ví dụ, bản thân mình muốn thử chương trình của bạn cũng phải vào Tools - References khai báo lại AutoCAD Type Library. Nếu không, chương trình cứ báo error!

 

Dùng VB theo kiểu late binding thì không phụ thuộc vào bất kỳ version nào của Office hay AutoCAD cả.

Mọi thứ đều khai báo là kiểu Object.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Dùng VB theo kiểu late binding thì không phụ thuộc vào bất kỳ version nào của Office hay AutoCAD cả.

Mọi thứ đều khai báo là kiểu Object.

 

Chưong trình trên viết đã lâu rồi nên còn nhiều lỗi và không tương thích với các véion sinh sau đẻ mụôn của CAD.

Tuy nhiên những chtr sau này của tôi sẽ luôn luôn tương thích với bất kỳ version tuơng lai nào của CAD.

Thank ssg.

Rất mong bác Anhcos chia sẻ thêm vấn đề này. Tue_NV thấy hay lắm

Cảm ơn bác Anhcos và anh gia_bach thật nhiều :undecided:

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Việc Add references Excel trong Cad ta có thể sử dụng hàm sau:

Application.VBE.ActiveVBProject.References.AddFromGuid(guid, major, minor)

Tuy nhiên việc xác định được guid, major, minor lại là cái khó.

Trên máy tôi cài cad 2007, Office2003(11) thì các thông số như sau

guid = "{00020813-0000-0000-C000-000000000046}"

major = 1

minor = 5

Nếu trong Module ta có đoạn mã

Application.VBE.ActiveVBProject.References.AddFromGuid "{00020813-0000-0000-C000-000000000046}", 1, 5

Thì người sử dụng không cần phải Add References nữa.

Tương tự trong Excel ta có đoạn mã bổ sung thư viện Cad 2007 như sau:

Application.VBE.ActiveVBProject.References.AddFromGuid "{851A4561-F4EC-4631-9B0C-E7DC407512C9}",1,0

Theo tôi nghĩ, nếu ta có thể liệt kê được hết các thông số này của các đời Excel và Cad thì có thể giải quyết được vấn đề bằng phương pháp loại trừ lỗi.

Mọi người cùng nghiên cứu xem có khả thi không nhé.

NOTE: In Office 2002 or later, the TRUST ACCESS TO VISUAL BASIC PROJECT box MUST be checked, or the code will not work. (This box is located in Tools|Options|Security|Macro Security|Trusted Publishers) - Vẫn hơi khó chịu.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Việc sử dụng Visual basic hoặc Visual studio (không phải VBA for AutoCAD) để giao tiếp với AutoCAD mà không phụ thuộc vào phiên bản đang cài đặt trên máy bằng kỹ thuật late bingding - có nghĩa là liên kết muộn.

 

Kỹ thuật này không đòi hỏi phải thêm vào bất kỳ các reference nào nhằm liên kết với Acad or Excel. Tuy nhiên cần phải có sự liên kết với Acad or Excel or Word or có thể bất kỳ một chương trình nào (VD: notepad)

 

VD khi khai báo biến như sau:

 

Dim myEntity as Object

Thì kiểu đối tượng của myEntity sẽ không thay đổi cho đến khi nó được gán giá trị mới, tức là KIỂU CỦA BIẾN CHỈ ĐƯỢC XÁC ĐỊNH VÀO THỜI ĐIỂM THỰC THI MÃ.

 

Xem các câu lệnh sau, xem như biến AcadApp đại diện cho chương trình AutoCAD đang thực thi

 

1. myEntity = AcadApp.ActiveDocument

Thì kiểu của biến myEntity sẽ là kiểu Document của AutoCAD

 

2. myEntity = AcadApp.ActiveDocument.SelectionSets

Thì kiểu của biến myEntity sẽ là kiểu SelectionSets của bộ tập chọn trong bản vẽ hiện hành.

 

Như vậy ta có thể truy xuất đến các thuộc tính và hàm của đối tượng myEntity sau khi gán giá trị cho nó.

Ở câu lệnh 1 ta có thể viết câu lệnh này

Dim myPaper as Object = myEntity.PaperSpace 'code VS

 

Nhưng không thể sử dụng nó ở câu lệnh thứ 2, vì đó không phải là thuộc tính của SelectionSets, mà có thể dùng

Dim Count as Integer = myEntity.Count 'code VS

 

Liên kết với Acad, Excel, Word như sau:

Dim AcadApp, ExcelApp, WordApp as Object

 

'VB

On error resume next

Set AcadApp = GetObject(,"Acad.Application")'Liên kết với bản AutoCad đang chạy

If err <> 0 then

Set AcadApp = CreateObject("Acad.Application")'tạo bản AutoCad mới

endif

 

'VS

Try

AcadApp = GetObject(,"Acad.Application")'Liên kết với bản AutoCad đang chạy

Catch

AcadApp = CreateObject("Acad.Application")'tạo bản AutoCad mới

End Try

 

Với Excel or Word chỉ cần thay thế Acad.Application --> Excel.Application or Word.Application

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào các anh chị!

Hôm nay em muốn nhờ các anh chị giúp em về liên kết giữa Autocad với Excel với mục đích như sau:

Em có 1 file Autocad vẽ sẵn các đường ống (được đánh số nút tại 2 đầu)

http://www.4shared.com/file/257566389/3ef10f46/cad_3.html

Và 1 file Excel mà phần số liệu cần quan tâm được tô màu:

http://www.cadviet.com/upfiles/2/excel.rar

Em muốn các số liệu ở excel được viết vào cad (một cách nhanh nhất) sao cho mỗi đoạn ống được viết 6 số liệu: chiều dài, lưu lượng, đường kính, vận tốc, độ dốc, tổn thất.

3 số liệu ở phía trên ống, gồm: chiều dài, lưu lượng, đường kính.

3 số liệu ở phía dưới ống, gồm: vận tốc, độ dốc, tổn thất.

Nếu ống nằm thẳng đứng thì (chiều dài, lưu lượng, đường kính) nằm bên trái ống, (vận tốc, độ dốc, tổn thất) nằm bên phải ống.

 

Em xin chân thành cảm ơn!

 

Bạn thử dùng cái này

Mở file Acad

Active sheet có phương án muốn xuất

Bấm Alt+F8 chạy macro "ExcelToAcad"

 

Vì không thể có thuật toán tốt cho vị trí text nên ctrình chọn điểm giữa của 2 điểm node

và Offset 2 bên theo khoảng cách trong name "TextOffset"

Kết quả xuất lấy row của name "chdai" và column của các name

"luuluong", "dkinh", "dodoc", "vantoc" va name "doday" do tôi thêm vào ở sheet PA1.

- Y/c trên là "tổn thất", nhưng trong file cad lại là "Độ đầy" ??

 

Nếu sheet PA2 có row và column khác với sheet PA1 thì kết quả sẽ sai.

Vì vậy bạn bỏ sheet PA2, copy lại sheet PA1=>PA2 thì cả 2 PA có cùng name

 

Trong file cad, các text của node có style là "p", tuy nhiên có 2 text khác không phải là

số, vì vậy nếu text có chiều dài >4 sẽ bị loại, nếu text có chiều dài <=4 mà không phải

số thì chương trình sẽ lỗi.

 

Tôi có thêm vào các name là

TextOffset : khoảng cách Text so với trục

Ang1, Ang2: Giới hạn góc để xoay Text 180 độ

Nếu bạn dùng tiện và cần customize các yêu cầu khác thì gửi lại file excel mới.

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

anh Nguyenhoanh ơi anh cho em hỏi là đánh lệnh vao đâu thế anh. em mới học cad anh à hihi. anh cho em yahoo hay number phone của anh đi! :undecided:

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

mình đang sư dụng autocad 2007 và office 2003. mình có điều này hỏi các bạn:

mình vẽ trong autocad một cây dài 30 x 50 x 5 thì trong excel cập nhặt vào các ô tương sứng là dài 30 rộng 50 dày 5

mong các bạn gần xa giúp cho mình. mình đang rất cần sự giúp đỡ các bạn

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Dạ e đi đo mặt bằng, nhập điểm lập bình đồ. Nếu đo bằng máy kinh vĩ thì chỉ có khoảng cách và góc quay so với mốc chuẩn thôi bác ạ. Còn nếu đo bằng máy toàn đạc có tọa độ X,Y,Z thì họ cũng đổ vào excel khi giao cho e. Ngồi nhập từng điểm 1 thì lâu quá. Mong bác chỉ cho.

Mình có 1 chương trình để xử lý số liệu đo bằng kinh vĩ trên Excel nếu Bạn là chuyên đụng vấn đề này thì liên lạc với mình!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Nhân chủ đề trao đổi dữ liệu Cad và Excel. Trước đây em có làm đề tài tự động hoá thiết kế Cầu dầm BTCT DƯL và dùng ngôn ngữ VBA trao đổi cơ sở Excel và Cad thấy khá gần gũi và thành công. Không biết các anh thấy ntn ? Khi nào rảnh em sẽ post code lên ( hiện tại e đang bận với dự án mà nhờ bác Hoanh viết Lisp)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Cám ơn bạn về chầu giao lưu. Có duyên ắt sẽ gặp!

My email: ngomai@khatoco.com

 

Cảm ơn bác SSG nhiều, chương trình chạy tuyệt vời, đúng theo ý tưởng của e. Hy vọng sớm có duyên.

E sẽ mail địa chỉ mail và phone của e cho bác.

 

Các bác cho em hỏi chút. Bên địa hình cung cấp cho em đường địa hình dạng polyline nối liền nhiều điểm. Họ có cột cao độ và cự ly. Có cách nào đưa giá trị cao độ và cự ly về dạng file txt rùi cho vào excel ko ạ.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

From AutoCad 2008 up

 

Dùng Table kết hợp với Datalink là có thể đạt được nguyện vọng rồi. Mình có viết một bài ngắn (tiếng Anh) muốn gởi tặng mọi người ở đây nhưng không upload được. Bạn nào thích thì email cho mình (avguycf@yahoo)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Về vấn đề VBA lisp thì theo sở thích của mỗi người thôi. nhưng theo mình thì nếu đã thành thạo về autocad thì theo con đường lisp có vẻ nhanh hơn

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

chào các bác cho em hỏi 1 chút về list exppnt-imppnt khi em imppnt thì ở cad cho ra cả toạ độ và cao độ nhưng khi em exppnt thì file txt ở excell chỉ xuất hiện toạ độ thôi mà cao độ thì toàn ra 0.00 hà xin các bác chỉ giáo, em làm bên khảo sát nê rất cần cho ra cả cao đô và toạ độ, tiện đây em xin upload file cad của em lên: http://www.cadviet.com/upfiles/3/289_1.dwg

em cũng xin up file exppnt lên các bác xem giùm http://www.cadviet.com/upfiles/3/khong_thay_cao_do.txt

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
AutoCAD 2008 đã hỗ trợ liên kết dữ liệu với excel rồi đấy :lol:

Chào các bác

Mong các bác chỉ giúp vấn đề em gặp phải dưới đây

Em muốn chuyển dữ liệu CAD sang file excel có sẵn

Về file CAD:

- Dữ liệu chuyển là Dtext và Mtext

- Text viết được bỏ dấu theo cách / của font chữ

Em đã dùng thử lisp c2e seach trên diễn đàn nhưng chưa được vì

- Dữ liệu xuất sang file excel mới, text không đọc được.

File upload sau mong các bác chỉ giúp:

http://www.cadviet.com/upfiles/3/cad_to_excel.dwg

Em cũng chưa biết về tính năng liên kết dữ liệu với excel CAD 2008, bác "bemove" có thể nói thêm giúp em với

Thanks các bác

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

có tiện ích này hi vọng giúp được các bạn trong việc xuất dữ liệu qua lại giữa Autocad và Excel http://www.mediafire.com/file/iiyonukkupv34if/didg.rar để tìm hiểu thêm về cách sử dụng tiện ích này các bạn có thể tham khảo tại đây http://camranhvinh.blogspot.com/2011/05/xuat-du-lieu-qua-lai-giua-autocad-va.html

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

hãy tải chương trình chitietwin của tác giả Trung Anh (trường ĐH mỏ) về dùng (miễn phí), đáp ứng đầy đủ yêu cầu của bạn.Chúc thành công

T

Bạn Có chi tiết win của Trần trung anh không chi mình xin với.Thank. mình trước có nhưng để đâu mất ko biết. thank bạn

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Xin đóng góp một đoạn code Chương trình con dùng cho việc lấy số liệu từ một file Excel vào ExcelData@ list. Đây là một hàm con rất quan trọng trong  ứng dụng "Vẽ bảng Excel trong CAd" của DuyLisp. Mong anh em mổ xẻ thêm

 

Ví dụ:

 (GetExcel "C: \ \ Temp \ \ Temp.xls" "Sheet1" "E19") = Mở C: \ Temp \ Temp.xls trên Sheet1 và đọc số liệu ô E19

        (phần này áp dụng đối với trường hợp chỉ rõ tên của sheet)
(GetExcel "C: \ \ Temp \ \ Temp.xls" nil "xyz123") = Mở C: \ Temp \ Temp.xls trên bảng tính hành và đọc số liệu ô xyz123

        (áp dụng cho sheet bất kỳ, chỉ cần lúc Save lần cuối cùng, nó là sheet hiện hành)

Xem tại: http://phongqlda.tk/viewtopic.php?f=21&t=89

Hoặc tại http://duylisp.tk/vi/news/Bai-moi/Quan-diem-xay-dung-DuyLisp-11/

 

 

(defun GetExcel (ExcelFile$ SheetName$ MaxRange$ / Column# ColumnRow@ Data@ ExcelRange^
  ExcelValue ExcelValue ExcelVariant^ MaxColumn# MaxRow# Range$ Row# Worksheet)
  (if (= (type ExcelFile$) 'STR)
    (if (not (findfile ExcelFile$))
      (progn
        (alert (strcat "Tệp Excel " ExcelFile$ " không được tìm thấy"))
        (exit)
      );progn
    );if
    (progn
      (alert "Đường dẫn tệp Excel không đúng.")
      (exit)
    );progn
  );if
  (gc)
  (if (setq *ExcelApp% (vlax-get-object "Excel.Application"))
    (progn
      (alert "Đóng bảng tính Excel để tiếp tục !")
      (vlax-release-object *ExcelApp%)(gc)
    );progn
  );if
  (setq ExcelFile$ (findfile ExcelFile$))
  (setq *ExcelApp% (vlax-get-or-create-object "Excel.Application"))
  (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Open ExcelFile$)
  (if SheetName$
    (vlax-for Worksheet (vlax-get-property *ExcelApp% "Sheets")
      (if (= (vlax-get-property Worksheet "Name") SheetName$)
        (vlax-invoke-method Worksheet "Activate")
      );if
    );vlax-for
  );if
  (setq ColumnRow@ (ColumnRow MaxRange$))
  (setq MaxColumn# (nth 0 ColumnRow@))
  (setq MaxRow# (nth 1 ColumnRow@))
  (setq *ExcelData@ nil)
  (setq Row# 1)
  (repeat MaxRow#
    (setq Data@ nil)
    (setq Column# 1)
    (repeat MaxColumn#
      (setq Range$ (strcat (Number2Alpha Column#)(itoa Row#)))
      (setq ExcelRange^ (vlax-get-property *ExcelApp% "Range" Range$))
      (setq ExcelVariant^ (vlax-get-property ExcelRange^ 'Value))
      (setq ExcelValue (vlax-variant-value ExcelVariant^))
      (setq ExcelValue
        (cond
          ((= (type ExcelValue) 'INT) (itoa ExcelValue))
          ((= (type ExcelValue) 'REAL) (rtosr ExcelValue))
          ((= (type ExcelValue) 'STR) (vl-string-trim " " ExcelValue))
          ((/= (type ExcelValue) 'STR) "")
        );cond
      );setq
      (setq Data@ (append Data@ (list ExcelValue)))
      (setq Column# (1+ Column#))
    );repeat
    (setq *ExcelData@ (append *ExcelData@ (list Data@)))
    (setq Row# (1+ Row#))
  );repeat
  (vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") 'Close :vlax-False)
  (vlax-invoke-method *ExcelApp% 'Quit)
  (vlax-release-object *ExcelApp%)(gc)
  (setq *ExcelApp% nil)
  *ExcelData@
);defun GetExcel

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tôi có một file Excel và một lisp để mở file Excel rồi ghi số liệu mới vào.

Tôi muốn lisp thực hiện theo hai cách sau:

1- Mở file Excel, xóa toàn bộ nội dung cũ trong các Sheet để ghi số liệu mới.

2- Mở file Excel, xóa toàn bộ các Sheet cũ, tạo các Sheet mới và ghi số liệu mới.

Tôi quá kém về các hàm Vla... nên không thực hiện được, nhờ mọi người giúp đỡ nhé,

xin cảm ơn.

fIle Excel:  http://www.cadviet.com/upfiles/3/88193_du_tkk_1.rar

file lsp:

; Test lisp 09/09/2014
;-----------------------------------------------------------------------------------------
(defun C:excel()
  (vl-load-com)
  (setq lst_Sheet '("Kenh_chinh" "Kenh_CI" "Kenh_CII" "Kenh_CIII" "Kenh_ND"))
  (if (not fn)
    (progn
	  (setq fn (getfiled "Select Excel File" "" "xls" 0))
	  (if fn
        (progn
		  (WriteToExcel fn lst_Sheet T)
		)
		(progn
		  (WriteToExcel nil lst_Sheet T)
        )
	  )	
	)
  )
)
;------------------------------------------------------------------------------
(defun WriteToExcel (ExcelFile$ lst_Sheet Visible / Sheet$ Sheets@ Worksheet n)
  (if (= (type ExcelFile$) 'STR)
    (if (findfile ExcelFile$)
      (setq *ExcelFile$ ExcelFile$)
      (progn
        (alert (strcat "Excel file " ExcelFile$ " not found."))
        (exit)
      )
    )
    (setq *ExcelFile$ "")
  )
  (gc)
  (if (setq *ExcelApp% (vlax-get-object "Excel.Application"))
    (progn
      (alert "Close all Excel spreadsheets to continue!")
      (vlax-release-object *ExcelApp%)(gc)
    )
  )
  (setq *ExcelApp% (vlax-get-or-create-object "Excel.Application"))
  (if ExcelFile$
    (if (findfile ExcelFile$)
      (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Open ExcelFile$)
      (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Add)
    )
    (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Add)
  )
  (if Visible
    (vla-put-visible *ExcelApp% :vlax-true)
  )
  (setq n 0)
  (repeat (length lst_Sheet)
    (setq SheetName$ (nth n lst_Sheet))
    (if (= (type SheetName$) 'STR)
      (progn
        (vlax-for Sheet$ (vlax-get-property *ExcelApp% "Sheets")
          (setq Sheets@ (append Sheets@ (list (vlax-get-property Sheet$ "Name"))))
        )
;		(if (member SheetName$ Sheets@)
;          (vlax-for Worksheet (vlax-get-property *ExcelApp% "Sheets")
;            (if (= (vlax-get-property Worksheet "Name") "Kenh_ND")
;              (vlax-invoke-method Worksheet "Delete")
;            )
;          )
;        )
		(if (member SheetName$ Sheets@)
          (vlax-for Worksheet (vlax-get-property *ExcelApp% "Sheets")
            (if (= (vlax-get-property Worksheet "Name") "Kenh_ND")
              (vlax-invoke-method Worksheet "ClearContents")
            )
          )
        )
        (if (member SheetName$ Sheets@)
          (vlax-for Worksheet (vlax-get-property *ExcelApp% "Sheets")
            (if (= (vlax-get-property Worksheet "Name") SheetName$)
              (vlax-invoke-method Worksheet "Activate")	  
            )
          )
          (vlax-put-property (vlax-invoke-method (vlax-get-property *ExcelApp% "Sheets") "Add") "Name" SheetName$)
		)
      )
    )
    (setq n (1+ n))
  )
  (princ)
)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tại trang tin cũng đã có 1 ví dụ về chương trình LISP nhập xuất dữ liệu giữa AutoCAD và Excel.

http://www.cadviet.com/content/view/20/1/

 

Đó là chương trình eiPoint (Export Import Point), là chương trình khá đơn giản và cơ bản. Chúng ta có thể cải tiến nó để đáp ứng được từng mục đích riêng của mình.

 

Dưới đây là mã lệnh của chương trình eiPoint (lấy từ trang tin):

[code=

Bản chất của quá trình trao đổi dữ liệu giữa AutoCAD và Excel trong ví dụ trên là tạo ra một tệp có đuôi .txt làm trung gian.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tại trang tin cũng đã có 1 ví dụ về chương trình LISP nhập xuất dữ liệu giữa AutoCAD và Excel.

http://www.cadviet.com/content/view/20/1/

 

Đó là chương trình eiPoint (Export Import Point), là chương trình khá đơn giản và cơ bản. Chúng ta có thể cải tiến nó để đáp ứng được từng mục đích riêng của mình.

 

Dưới đây là mã lệnh của chương trình eiPoint (lấy từ trang tin):

[code=

Bản chất của quá trình trao đổi dữ liệu giữa AutoCAD và Excel trong ví dụ trên là tạo ra một tệp có đuôi .txt làm trung gian.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×