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

AutoCAD với Excel

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

...

"Option 4" tui để dành cho bác "ngâm cứu."

Nguyên tắc trong lập trình là hạn chế sử dụng lệnh "SendCommand".

Cám ơn Gia_bach.

Các nút lệnh khác PP vừa mới thực hiện xong theo hướng dẩn sau:

 

+ Right click any ToolBar and choose Control ToolBox.

+ Click the CommandButton and click and drag in your worksheet to position and size it.

+ Right click the button and choose View Code.

+ Change the code.

+ Press Alt+F11 to return to your workbook.

+ Click the Design icon (top left) in the Control Toolbox to exit design mode, and close the ToolBox.

+ Make some selections and click the button.

Xin Bác nói về "Nguyên tắc trong lập trình là hạn chế sử dụng lệnh "SendCommand". "

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 Phiphi

Sáng nay đọc bài của Phiphi rồi nhưng trên Cty không có Office nên đành chịu.

 

Đây là file Excel có 3 ô lệnh :

- Xuat sang ACAD : xuất sang Acad cel A3:A5

- Xuat sang ACAD B3:B50 : xuất sang Acad cel B3:B5

- Xuat sang ACAD C3:C50 : xuất sang Acad cel C3:C5

 

Chú ý : chỉ xuất 3 cell đầu tiên của cột sang CAD.

Bác có thể vào vào Visual Basic Editor sửa lại cho phù hợp với công việc, cũng đơn giản thôi.

"Option 4" tui để dành cho bác "ngâm cứu."

Nguyên tắc trong lập trình là hạn chế sử dụng lệnh "SendCommand".

 

Link file Excel

Bạn có thể dùng

Range("A3", Range("A65536").End(xlUp)).Cells

để xuất các ô từ A3 đến ô có data cuối cùng trong cột A

Hoặc

Range("A3", Range("A50").End(xlUp)).Cells

để xuất các ô từ A3 đến ô có data cuối cùng trong cột A từ A50 trở lên

1 VD minh họa cho "Nguyên tắc trong lập trình là hạn chế sử dụng lệnh "SendCommand".

Nếu bạn sử dụng code trên cho file excel từ xuat_command__autocad_20072008_1.rar

thì vì ô B373 là ô có data cuối trong cột B nên các ô từ B6-B373 sẽ gây ra lỗi vì trong đó không phải là các lệnh đúng của CAD

  • Vote tăng 1

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
Lisp chỉ có thể làm việc (read và write) với text file, không xâm nhập được vào cấu trúc của *.xls (nếu được, chắc bác Bill Gate đã phá sản rồi!).

Có 2 dạng file mà Lisp và Excel cùng hiểu và xử lý được là *.txt và *.csv. Mình xin phân tích kỹ hơn:

Text file là... file dạng text, nội dung gồm tập hợp các ký tự ASCII, thường là *.txt. Cho dù bạn có đổi nó thành *.abc, *.def, *.doc... thậm chí là *.xls cũng được(!) nhưng bản chất của nó vẫn là text file (cốt khỉ vẫn là... cốt khỉ!).

Một bảng dữ liệu bao gồm các số liệu được tổ chức theo hàng (row - record) và cột (column - field). Excel hiểu bảng dữ liệu của text file như sau:

1) Đối với file *.txt:

- Field: căn cứ vào ký tự TAB ("\t")

- Record: căn cứ vào ký tự xuống dòng ("\n")

2) Đối với file *.csv (Comma Separated Value File):

- Field: phân biệt bằng dấu phẩy (,)

- Record: theo ký tự xuống dòng như trên

Bạn có thể mở 2 kiểu file trên bằng Excel để xem, sửa, bổ sung; có thể dùng được các công cụ của Excel (ngay cả gán function) rất thuận tiện cho biên tập. Nhưng khi save, bạn phải giữ nguyên định dạng cũ (Excel sẽ hiện cảnh báo đối với các trường hợp này). Nếu bạn save theo dạng *.xls, toàn bộ cấu trúc file sẽ thay đổi (theo đúng kiểu của MicroSoft), và sau đó chương trình lisp của bạn sẽ không thể nào đọc nó được nữa!

Nếu bạn muốn làm việc trực tiếp với *.xls thì phải dùng VBA (MicroSoft Visual Basic for Application) thay cho Lisp. VBA trong Acad là sản phẩm hợp tác của Autodesk và MicroSoft nên việc hiểu và xử lý *.xls là "chuyện nhỏ".

Nếu bạn có hứng thú với VBA, chúng ta có thể đề nghị Admin lập thêm một box mới cho mục này.

 

PS:

Khi bạn dùng Excel để open 3 kiểu file *.txt, *.csv, *.xls, chúng hiển thị giống nhau nhưng bản chất khác nhau một trời một vực:

- *.txt và *.csv: chỉ chứa giá trị (value)

- *.xls: ngoài value, mỗi cell của nó còn chứa rất nhiều thông tin khác: định dạng (format), công thức (function), tham chiếu (reference), liên kết (link).... và nhiều thứ khác nữa!

Thông tin hữu ích. Thanks!

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
Bạn thử lisp này xem thế nào cho ý kiến (XLD)

Đây bạn

mình test thử rồi, cad2004 nó báo lỗi Select objects: ; error: bad argument type: stringp nil

không chạy đượ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
Tôi đã viết mã đọc files Excel trực tiếp từ AutoCad bằng ngôn ngữ AutoLISP . Chương trình chạy tốt trên Excel200, 2002,2003 còn Excel 2007 tôi chưa thử . Còn AutoCad đã chạy trên Cad 2000,2002,2004,các bản khác chưa dùng.

Tôi đã sử dụng đối tượng ActiveX trong AutoLISP để đọc dữ liệu trong files Excel (đối tượng ActiveCell)

sao không chạy đượ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
Góp ý: với các code khá dài, bạn nên cho nó vào hộp codebox để bài viết gọn gàng (mình đã làm giúp bạn như trên)

 

Chương trình này rất hay, tập hợp một loạt functions để làm việc với excel bằng lisp.

Công dụng các functions:

- getexcel: 3 đối số là file_name, sheet_name và max_range. Return: list dữ liệu từ cell A1 đến cell ứng với max_range

- getcell: lấy dữ liệu tại 1 cell, được chỉ định bằng địa chỉ cell

- openexcel: mở file *.xls có trên đĩa

- putcell: gán giá trị cho cell

- closeexcel: đóng file *xls đã open ở trên

Để hiểu rõ hơn, bạn ghép thêm vào code có sẵn của bạn đoạn sau:

;;;Vi du ap dung cac function tren
;;;---------------------------------------------------------------------
(defun C:VD1()
(vl-load-com)
(setq fn (getfiled "Select Excel File" "" "xls" 0))
(getexcel fn "sheet1" "D5")
)
;;;---------------------------------------------------------------------
(defun C:VD2() (alert (strcat "B3 = " (getcell "B3"))))
;;;---------------------------------------------------------------------
(defun C:VD3() (openexcel fn "sheet4" T))
;;;---------------------------------------------------------------------
(defun C:VD4() (putcell "B10" (list "How"  "are you?")))
;;;---------------------------------------------------------------------
(defun C:VD5() (closeExcel fn))

 

Tạo 1 file *.xls, ghi ở sheet1 các số liệu tuỳ ý, khoảng chừng 4 cột, 6 hàng. Save và thoát hẳn excel

lần lượt các lệnh từ VD1 đến VD5:

- VD1: lấy dữ liệu trong sheet1, từ cell A1 đến cell D5 của file mà bạn chỉ định và chuyển thành list. Bạn bấm F2 sau khi chạy xong sẽ thấy

- VD2: lấy dữ liệu ở cell B3

- VD3: mở file, tạo sheet mới có tên sheet4

- Vẫn để Excel hiện hành, quay lại Acad gõ VD4 -> Cell B10 sẽ được gán nội dung "How" và cell C10 là "are you?"

- VD5: save và thoát Excel

 

Thông suốt được những cái trên đây thì những functions còn lại không thành vấn đề. Chúng chỉ là những tiện ích hỗ trợ thêm (bạn đọc comments và examples của họ sẽ hiểu)

Khi đã nắm được toàn bộ, bạn sẽ giải quyết được vấn đề đã nêu ở topic "Ghi dữ liệu từ Cad sang file Excel đã có".

Chào bác SSG,

Lâu lắm rồi, bây giờ mình mới dám sờ mó một chút tới cái thằng Excel to Cad này. Sau khi đọc cái lisp của bác mình thấy có một vấn đề là trong lệnh VD1, khi mình thay (getexcel fn "sheet1" "D5") bằng (getexcel fn "sheet2" "D5") thì kết quả nó vẫn y chang nhau, nghĩa là lisp chỉ lấy dữ liệu trên file được mở ở đúng cái sheet đang hiện hành, bất chấp việc thay tham số "sheet1" bằng "sheet2" bác ạ.

Điều này theo mình đoán là nó do cái hàm (getexcel ....) mà ra. Thế nhưng do cái lisp này hơi rậm rì rắc rối mà mình thì chưa thạo về mấy cái hàm (vlax- .....) nên chưa dám mò mẫm vào.

Về các hàm (vlax- .....) này bác có thể chỉ giùm cách để mình tham khảo được không chứ mình mò hoài trong Help cũng như help Developer mà chưa vỡ ra được bác ạ.

Chúc bác khỏe và luôn thành công.

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

Gửi các bác hàm ghi 1 danh sách (list) ra file Excel.

Yêu cầu : phải có MS Excel đã cài đặt trên hệ thống.

 

Cú pháp : (WriteToExcel pt_lst)

trong đó : pt_lst là 1 danh sách (list) .

Giá trị trả về (nếu thành công) là toàn bộ danh sách đuợc ghi ra file Excel.

 

Data bắt đầu ghi tại Sheet1, cell C3, hai dòng-cột đầu dành cho các bác tùy nghi xử lí.

Lisp sẽ tạo 1 file Excel mới, các bác tùy nghi save với tên file mong muốn.

 

Ví dụ minh họa : Xuất tọa độ PLINE ra file Excel.

(defun c:p2E(/ ent pt_lst ss); Polyline Vertex to Excel
 (vl-load-com)
 (defun poly-pts (pl / n p l)
   (setq n (fix (vlax-curve-getEndParam pl)))
   (or (vlax-curve-IsClosed pl) (setq n (1+ n)))
   (while (setq p (vlax-curve-getPointAtParam pl (setq n (1- n))))
     (setq l (cons p l))  ))

 (if (setq ss (ssget "+.:S:E" (list (cons 0 "*POLYLINE"))))
   (progn
     (setq ent (ssname ss 0)
    pt_lst (poly-pts ent))
     (if (vlax-get-or-create-object "Excel.Application")
(WriteToExcel pt_lst))))
 (princ))

(defun WriteToExcel (lst_data / col row x xlApp xlCells)
 (setq xlApp (vlax-get-or-create-object "Excel.Application")
xlCells (vlax-get-property
	  (vlax-get-property
	    (vlax-get-property
	      (vlax-invoke-method
		(vlax-get-property xlApp "Workbooks")
		"Add")
	      "Sheets")
	    "Item" 1)
	  "Cells"))
 (setq row 3)
 (foreach pt lst_data
   (setq col 3)
   (foreach coor pt
     (vlax-put-property xlCells 'Item row col coor)
     (setq col (1+ col)))
   (setq row (1+ row)) )
 (vla-put-visible xlApp :vlax-true)
 (mapcar
   (function (lambda (x)
	(vl-catch-all-apply
	  (function (lambda ()(if x (vlax-release-object x)))))))
   (list xlCells xlApp))
 (gc) (gc)    )    

  • Vote tăng 4

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!

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 không mở được file excel, lỗi khi giải nén.

Xem qua file dwg thấy việc tạo các đối tượng của bạn không có mối liên hệ gì với nhau giữa đoạn ống và ký hiệu hai đầu, tuy nhiên để điền được các số liệu dọc 2 bên tuyến ống ta có thể căn cứ vào vị trí của 2 thông số đầu mút, chỉ đẹp khi tuyến ống là không bị cong.

Vì chưa mở được file Excel nên chưa biết dữ liệu của bạn được tổ chức nthees nào do đó cũng chưa đưa ra được giải pháp cụ thể.

  • Vote tăng 1

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 không mở được file excel, lỗi khi giải nén.

Xem qua file dwg thấy việc tạo các đối tượng của bạn không có mối liên hệ gì với nhau giữa đoạn ống và ký hiệu hai đầu, tuy nhiên để điền được các số liệu dọc 2 bên tuyến ống ta có thể căn cứ vào vị trí của 2 thông số đầu mút, chỉ đẹp khi tuyến ống là không bị cong.

Vì chưa mở được file Excel nên chưa biết dữ liệu của bạn được tổ chức nthees nào do đó cũng chưa đưa ra được giải pháp cụ thể.

 

Cảm ơn anh/chị! Đây là link file excel.

Nhờ anh/chị xem giúp!

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 dùng thử xem có được không.

http://www.mediafire.com/file/enmgiojwiig/ThongSoOng.rar

  • Vote tăng 1

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
Bạn dùng thử xem có được không.

http://www.mediafire.com/file/enmgiojwiig/ThongSoOng.rar

 

Cảm ơn anh anhcos rất nhiều!

Em đã sử dụng với Phương án I - đúng như em mong muốn. Nhưng khi sang Phương án II thì lại không sử dụng được.

Sau khi chọn xong thông số ở bảng Excel, phần mềm chuyển sang cad và yêu cầu người sử dụng chọn tuyến ống, nhưng em chọn mãi mà phần mềm vẫn báo: Chưa có.

(Em đã sửa lại các polyline cho cắt qua các text)

Nhờ anh xem giùm! Em cảm ơn!

 

File mô tả

http://www.cadviet.com/upfiles/2/mltn.zip

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ưng khi sang Phương án II thì lại không sử dụng được.

Em cứ quét khối chọn khu vực chứa STT cùng các dữ liệu tuyến ống trong sheet LL-PA2, rồi chạy chương trình lại là dc.

  • Vote tăng 1

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

Bạn thử dùng code này xem, tôi viết bằng VBA nên cần phải khai báo thêm thư viện của Excel.

Khởi động Cad, nhấn Alt+F11, vào menu Insert>Module sau đo copy đoạn code này vào

Sub InsertText()
Dim Ex As Excel.Application
Set Ex = GetObject(, "Excel.Application")
Dim I As Long
Dim StaPoint(0 To 2) As Double
Dim EndPoint(0 To 2) As Double
Dim MidPoint As Variant
Dim AlgPoint As Variant
Dim Ang As Double
Dim Dis As Double
Dim SS As AcadSelectionSet
For Each SS In ThisDrawing.SelectionSets
	If SS.Name = "New_Selection" Then SS.Delete: Exit For
Next
Set SS = ThisDrawing.SelectionSets.Add("New_Selection")
Dim Code(1) As Integer
Dim Value(1) As Variant
Dim StrValue1$, StrValue2$
Dim Txt As AcadText
Dim TxtIns As AcadText
Code(0) = 0: Code(1) = 1: Value(0) = "TEXT"
I = 11
With Ex
	While .Cells(I, 18).Value <> ""
		StrValue1 = Split(.Cells(I, 18).Value, "-")(0)
		StrValue2 = Split(.Cells(I, 18).Value, "-")(1)
		Value(1) = StrValue1
		SS.Select acSelectionSetAll, , , Code, Value
		If SS.Count = 0 Then GoTo BoQua
		Set Txt = SS.Item(0)
		StaPoint(0) = Txt.insertionPoint(0)
		StaPoint(1) = Txt.insertionPoint(1)
		StaPoint(2) = Txt.insertionPoint(2)
		SS.Clear
		Value(1) = StrValue2
		SS.Select acSelectionSetAll, , , Code, Value
		If SS.Count = 0 Then GoTo BoQua
		Set Txt = SS.Item(0)
		EndPoint(0) = Txt.insertionPoint(0)
		EndPoint(1) = Txt.insertionPoint(1)
		EndPoint(2) = Txt.insertionPoint(2)
		SS.Clear
		Ang = ThisDrawing.Utility.AngleFromXAxis(StaPoint, EndPoint)
		Dis = Math.Sqr((StaPoint(0) - EndPoint(0)) ^ 2 + (StaPoint(1) - EndPoint(1)) ^ 2) / 2
		MidPoint = ThisDrawing.Utility.PolarPoint(StaPoint, Ang, Dis)
		MidPoint = ThisDrawing.Utility.PolarPoint(MidPoint, Ang + 1.57079633, 10)
		AlgPoint = MidPoint
		Set TxtIns = ThisDrawing.ModelSpace.AddText(.Cells(I, 19).Value & "-" & .Cells(I, 20).Text & "-" & .Cells(I, 21).Value, MidPoint, 20)
		TxtIns.Rotation = Ang
		TxtIns.Alignment = acAlignmentCenter
		TxtIns.TextAlignmentPoint = AlgPoint

		MidPoint = ThisDrawing.Utility.PolarPoint(MidPoint, Ang - 1.57079633, 52)
		AlgPoint = MidPoint
		Set TxtIns = ThisDrawing.ModelSpace.AddText(.Cells(I, 22).Value & "-" & .Cells(I, 23).Text & "-" & .Cells(I, 24).Value, MidPoint, 20)
		TxtIns.Rotation = Ang
		TxtIns.Alignment = acAlignmentCenter
		TxtIns.TextAlignmentPoint = AlgPoint
BoQua:
		I = I + 1
	Wend
End With
End Sub

Tiếp theo:

- Vào menu Tools>References tìm đến dòng Microsoft Excel.... Object Library đánh dấu vào nó và OK. (Mới động đến VBA Cad nên chưa biết cách tự bổ sung thư viện Excel, mong bạn thông cảm và chịu khó làm thủ công.)

- Mở file Excel chứa dữ liệu để VBA đọc.

- Trong cửa sổ của VBA nhấn F5 để chạy.

Ở đây tôi dùng phương pháp tìm vị trí các Text ghi ký hiệu tuyến ống sau đó viết thông số vào vị trí giữa của 2 điểm mút do đó vị trí text phụ thuộc vào vị trí của 2 đầu mút, với đoạn cong thì chịu.

  • Vote tăng 1

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
Bạn thử dùng code này xem, tôi viết bằng VBA nên cần phải khai báo thêm thư viện của Excel.

Khởi động Cad, nhấn Alt+F11, vào menu Insert>Module sau đo copy đoạn code này vào

Tiếp theo:

- Vào menu Tools>References tìm đến dòng Microsoft Excel.... Object Library đánh dấu vào nó và OK. (Mới động đến VBA Cad nên chưa biết cách tự bổ sung thư viện Excel, mong bạn thông cảm và chịu khó làm thủ công.)

- Mở file Excel chứa dữ liệu để VBA đọc.

- Trong cửa sổ của VBA nhấn F5 để chạy.

Ở đây tôi dùng phương pháp tìm vị trí các Text ghi ký hiệu tuyến ống sau đó viết thông số vào vị trí giữa của 2 điểm mút do đó vị trí text phụ thuộc vào vị trí của 2 đầu mút, với đoạn cong thì chịu.

 

Xin cảm ơn anh/chị đã giúp em!

Em không thực hiện được với lý do như sau:

 

cv_1.jpg

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 em svba

Code sau Tue_NV viết dưới sự trợ giúp của Elpanov Evgeny và sự chia sẻ của anh gia bach. Xin chân thành cảm ơn Elpanov Evgeny và cảm ơn anh gia bach đã chia sẻ

-> Khi chạy Lisp yêu cầu :

1. Các Pline đơn (độ rộng width=0) phải cắt qua nút ống

2. Tạo 1 Sheet tương ứng chứa các dữ liệu của Excel -> Có thể dùng hàm = để liên kết như Sheet1 trong file Excel dưới đây và Lisp lấy Sheet1 này làm cơ sở tính toán

Nếu muốn Lisp tính toán với Sheet khác thì hãy thay tên Sheet trong Code Lisp ở dòng :

(setq sheet "Sheet1"); ten sheet cua Excel

Thay "Sheet1" bởi tên Sheet của mình và chú ý viết đúng chữ Hoa và chữ thường trong Excel phải giống như trong Lisp nhé.

Đây là file Excel :

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

 

3. Tuyến ống phải tương ứng với điểm đầu và cuối

Đây là Code chạy với file Excel đã Link. svba chạy thử và cho ý kiến nhé.

 

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

  • Vote tăng 1

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 cảm ơn anh/chị đã giúp em!

Em không thực hiện được với lý do như sau:

Bạn đã bổ sung thư viện Excel cho VBA chưa?

"Vào menu Tools>References tìm đến dòng Microsoft Excel.... Object Library đánh dấu vào nó và OK"

Trước khi chạy nhớ mở file dữ liệu lên và chọn đúng Sheet chứa dữ liệu tương ứng.

Nếu số liệu của bạn lưu trong Acces hoặc tổ chức lại thì tôi có thể truy xuất trực tiếp không cần mở file Excel.

  • Vote tăng 1

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 em svba

Code sau Tue_NV viết dưới sự trợ giúp của Elpanov Evgeny và sự chia sẻ của anh gia bach. Xin chân thành cảm ơn Elpanov Evgeny và cảm ơn anh gia bach đã chia sẻ

-> Khi chạy Lisp yêu cầu :

1. Các Pline đơn (độ rộng width=0) phải cắt qua nút ống

2. Tạo 1 Sheet tương ứng chứa các dữ liệu của Excel -> Có thể dùng hàm = để liên kết như Sheet1 trong file Excel dưới đây và Lisp lấy Sheet1 này làm cơ sở tính toán

Nếu muốn Lisp tính toán với Sheet khác thì hãy thay tên Sheet trong Code Lisp ở dòng :

(setq sheet "Sheet1"); ten sheet cua Excel

Thay "Sheet1" bởi tên Sheet của mình và chú ý viết đúng chữ Hoa và chữ thường trong Excel phải giống như trong Lisp nhé.

Đây là file Excel :

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

 

3. Tuyến ống phải tương ứng với điểm đầu và cuối

Đây là Code chạy với file Excel đã Link. svba chạy thử và cho ý kiến nhé.

 

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

Hay quá, xem cái hàm GET_xl_sheet thấy cú pháp truy xuất y chang VB, nhưng có lẽ do không phải là con đẻ của lão Bill nên việc thiết lập các thủ tục code phức tạp thật.

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
Bạn thử dùng code này xem, tôi viết bằng VBA nên cần phải khai báo thêm thư viện của Excel.

Khởi động Cad, nhấn Alt+F11, vào menu Insert>Module sau đo copy đoạn code này vào

 

Tiếp theo:

- Vào menu Tools>References tìm đến dòng Microsoft Excel.... Object Library đánh dấu vào nó và OK. (Mới động đến VBA Cad nên chưa biết cách tự bổ sung thư viện Excel, mong bạn thông cảm và chịu khó làm thủ công.)

- Mở file Excel chứa dữ liệu để VBA đọc.

- Trong cửa sổ của VBA nhấn F5 để chạy.

Ở đây tôi dùng phương pháp tìm vị trí các Text ghi ký hiệu tuyến ống sau đó viết thông số vào vị trí giữa của 2 điểm mút do đó vị trí text phụ thuộc vào vị trí của 2 đầu mút, với đoạn cong thì chịu.

 

Cách này có tác dụng, nhưng phải chọn text STT rất nhiều lần, và có một số text STT SẼ PHẢI CHỌN 2 LẦN.

Ví du như: đoạn ống 106-107 và 100-107.

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ách này có tác dụng, nhưng phải chọn text STT rất nhiều lần, và có một số text STT SẼ PHẢI CHỌN 2 LẦN.

Ví du như: đoạn ống 106-107 và 100-107.

Nguyên lý làm việc như sau:

- Đọc số liệu trong file Excel để xác định ký hiệu điểm đầu, điểm cuối (106-107 và 100-107)

- Tìm trong bản vẽ text có giá trị như ký hiệu đã xác định được ở trên dồng thời xác định điểm chèn 2 ký hiệu đó

- Tính điểm giữa của 2 đầu

- Viết thông số vào vị trí tương ứng.

Tất cả đều làm tự động, bạn có cần phải chọn gì đâu.

Để tránh nhầm lẫn thì các ký hiệu trên bản vẽ phải là duy nhất, không được trùng.

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 có vài góp ý sau:

 

1) Nội dung cụ thể bạn làm mình không quan tâm vì nó chẳng phải chuyên ngành của mình. 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!

Chính vì thế, đã từ lâu mình không có hứng thú lập trình bằng VB nữa mà chuyển sang "chơi" với Lisp.

Nếu bạn có ý phát triển theo hướng này thì nên chú ý đến vấn đề Version và Libraries

 

2) Về hình thức, bạn đừng bố trí các cell lung tung như vậy mà tập trung nó lại theo một trật tự hợp lý. Trong đó, các cell dành cho nhập liệu gom vào 1 chỗ. Ví dụ như hình sau:

 

becoc.jpg

 

Trong đó:

- Các cells màu xanh lá cây là dành cho user nhập liệu

- Tất cả các cells khác, sau khi gán công thức và hoàn thiện thì lock chúng lại (dùng tính năng protection của Excel). User không thể sửa đổi bất cứ cái gì trong các cells này (nội dung, hình thức lẫn vị trí)

- Các cells ghi kết quả trung gian, ví dụ như kết quả toạ độ các điểm, cho chúng Hide luôn

- Sau khi nhập liệu, user bấm "Send to AutoCAD" là toàn bộ kết quả được export sang CAD. Họ không cần biết Macro hay Visual Basic là cái quỷ quái gì!

Như vậy, file Excel của bạn có dáng dấp của một Application hoàn chỉnh, sử dụng thân thiện và hiệu quả hơn, không bao giờ xảy ra tình trạng user thao tác sai làm mất các công thức đã được gán.

Mà cho dù bạn không có ý phổ biến, tự chế tự dùng đi nữa, chính bạn cũng cảm thấy thoải mái và hiệu quả hơn khi sử dụng.

......

Chào cả nhà

Đọc các bài viết của các bác trong topic này, mình thấy rất bổ ích, hữu dụng trong quá trình Nhập - xuất dữ liệu giữa EXCEL và ACAD. Và khi đọc bài viết của bác ssg trên đây, mình có chổ thắc mắc mà chưa biết làm cách nào để có thể làm được nó.

- Sau khi nhập liệu, user bấm "Send to AutoCAD" là toàn bộ kết quả được export sang CAD. Họ không cần biết Macro hay Visual Basic là cái quỷ quái gì!

Như vậy thì theo lời của bác ssg, cái button "Send to AutoCAD" được tạo như thế nào để có thể export sang CAD và như lời bác ssg ở trên thì không cần biết Macro hay Visual Basic vẫn có thể làm được cái này?

 

Tue_NV vẫn chưa ngộ ra được chổ này vì trình độ còn hạn chế. Mong bác ssg và các bác trên diễn đàn chỉ giúp cách tạo button "Send to AutoCAD" như trên.

Tue_NV xin chân thành cảm ơ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ả nhà

Đọc các bài viết của các bác trong topic này, mình thấy rất bổ ích, hữu dụng trong quá trình Nhập - xuất dữ liệu giữa EXCEL và ACAD. Và khi đọc bài viết của bác ssg trên đây, mình có chổ thắc mắc mà chưa biết làm cách nào để có thể làm được nó.

- Sau khi nhập liệu, user bấm "Send to AutoCAD" là toàn bộ kết quả được export sang CAD. Họ không cần biết Macro hay Visual Basic là cái quỷ quái gì!

Như vậy thì theo lời của bác ssg, cái button "Send to AutoCAD" được tạo như thế nào để có thể export sang CAD và như lời bác ssg ở trên thì không cần biết Macro hay Visual Basic vẫn có thể làm được cái này?

 

Tue_NV vẫn chưa ngộ ra được chổ này vì trình độ còn hạn chế. Mong bác ssg và các bác trên diễn đàn chỉ giúp cách tạo button "Send to AutoCAD" như trên.

Tue_NV xin chân thành cảm ơn.

Tue_NV hiểu nhầm ý của bác ssg rồi. Mong muốn của bác ssg trong bài viết trên tạm hiểu là : Với bất kỳ Application hoàn chỉnh (viết bằng LISP, VBA, VB ...) khi thực thi nó thì người sử dụng chỉ cần nhập số liệu đầu vào rồi bấm ENTER (ngồi uống cafe, ...) chờ kết quả.

- Người sử dụng không cần biết Macro hay Visual Basic là cái quỷ quái gì!.

- các việc khác là của Lập trình viên (khai báo Libraries ...)

- Application càng hoàn chỉnh thì mức độ can thiệp (setting) của người sử dụng càng ít. (User chỉ ngồi rung đùi, cafe-thuốc lá rùi phán ... ứng dụng này chuối quá!)

 

Tuy nhiên khi Nhập - xuất dữ liệu giữa EXCEL và ACAD bằng VBA chắc chắn phải sử dụng thư viện liên kết để truy xuất ứng dụng. Do đó việc khai báo Libraries là việc bắt buộc (phụ thuộc vào hệ thống có cài đặt các phiên bản Excel hay Acad tuơng ứng hay không).

Viết bằng LISP thì không cần khai báo Libraries, nhưng có hạn chế là phải khai báo địa chỉ truy xuất dữ liệu truớc. (tên Sheet, địa chỉ Cell ...)

 

Về cách tạo button "Send to AutoCAD" như trên, Tue_NV tham khảo bài viết của Phiphi : http://www.cadviet.com/forum/index.php?sho...ost&p=85887

+ Right click any ToolBar and choose Control ToolBox.

+ Click the CommandButton and click and drag in your worksheet to position and size it.

+ Right click the button and choose View Code.

+ Change the code.

+ Press Alt+F11 to return to your workbook.

+ Click the Design icon (top left) in the Control Toolbox to exit design mode, and close the ToolBox.

+ Make some selections and click the button.

 

Trong đó phần Change the code là quan trọng nhất. Đó là phần việc của Programer

  • Vote tăng 1

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 Phiphi

Sáng nay đọc bài của Phiphi rồi nhưng trên Cty không có Office nên đành chịu.

 

Đây là file Excel có 3 ô lệnh :

- Xuat sang ACAD : xuất sang Acad cel A3:A5

- Xuat sang ACAD B3:B50 : xuất sang Acad cel B3:B5

- Xuat sang ACAD C3:C50 : xuất sang Acad cel C3:C5

 

Chú ý : chỉ xuất 3 cell đầu tiên của cột sang CAD.

Bác có thể vào vào Visual Basic Editor sửa lại cho phù hợp với công việc, cũng đơn giản thôi.

"Option 4" tui để dành cho bác "ngâm cứu."

Nguyên tắc trong lập trình là hạn chế sử dụng lệnh "SendCommand".

 

Link file Excel

Chào anh gia_bach

Rất cảm ơn anh đã nhiệt tình giúp đỡ. Em đã chạy file EXCEL của anh gửi ở trên -> Kết quả rất tốt. Nhưng tại sao máy tính của em có cài CAD2004 và CAD2008 thì CAD2008 chạy được, nhưng CAD2004 lại chạy không được. Kết quả chạy với CAD2004 thì hiện ra hộp thoại Microsoft Visual Basic lại hiện ra và báo dòng lỗi

Run-time error '13' :

Type mismatch

Cách khắc phục làm sao thì thiệt tình em chưa được biết. Và những đoạn Code trong Visual Basic Editor có thể tham khảo ở đâu vậy anh? Em còn 1 vấn đề nữa là làm sao để khi quét data trong ExCel -> Nhấn button "Send to CAD" thì kết quả sẽ xuất qua CAD với dụng ý lập trình của User

Ví dụ : Một chương trình vẽ hình chữ nhật đơn giản :

hcn.jpg

-> Sau khi quét dữ liệu cạnh dài và cạnh ngắn của hình chữ nhật hoặc có thể là chương trình chọn dữ liệu cho mình luôn -> User nhấn nút Send to CAD -> thì lập tức chương trình cho mình qua CAD để chọn điểm góc trái, bên dưới để vẽ hình chữ nhật

 

Những điểm này là Tue_NV chưa biết, muốn tìm tài liệu để học tập thêm. Rất mong nhận được sự giúp đỡ của anh gia_bach cùng mọi người.

Tue_NV xin chân thành cảm ơ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 anh gia_bach

Rất cảm ơn anh đã nhiệt tình giúp đỡ. Em đã chạy file EXCEL của anh gửi ở trên -> Kết quả rất tốt. Nhưng tại sao máy tính của em có cài CAD2004 và CAD2008 thì CAD2008 chạy được, nhưng CAD2004 lại chạy không được. Kết quả chạy với CAD2004 thì hiện ra hộp thoại Microsoft Visual Basic lại hiện ra và báo dòng lỗi

Run-time error '13' :

Type mismatch

Cách khắc phục làm sao thì thiệt tình em chưa được biết. Và những đoạn Code trong Visual Basic Editor có thể tham khảo ở đâu vậy anh? Em còn 1 vấn đề nữa là làm sao để khi quét data trong ExCel -> Nhấn button "Send to CAD" thì kết quả sẽ xuất qua CAD với dụng ý lập trình của User

Ví dụ : Một chương trình vẽ hình chữ nhật đơn giản :

hcn.jpg

-> Sau khi quét dữ liệu cạnh dài và cạnh ngắn của hình chữ nhật hoặc có thể là chương trình chọn dữ liệu cho mình luôn -> User nhấn nút Send to CAD -> thì lập tức chương trình cho mình qua CAD để chọn điểm góc trái, bên dưới để vẽ hình chữ nhật

 

Những điểm này là Tue_NV chưa biết, muốn tìm tài liệu để học tập thêm. Rất mong nhận được sự giúp đỡ của anh gia_bach cùng mọi người.

Tue_NV xin chân thành cảm ơn

1.Microsoft Visual Basic lại hiện ra và báo dòng lỗi

- lỗi này SSG đã viết ở trên :

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!

trong file Excel, AutoCAD Type Library là CAD2008 nên chỉ chạy trên CAD2008, các phiên bản khác thì ...

 

2. làm sao để khi quét data trong ExCel -> Nhấn button "Send to CAD" thì kết quả sẽ xuất qua CAD

dùng method : Active.Selection

trong Sub CommandButton3_Click(), bạn thay đoạn dưới đây

For Each cell In Worksheets("Commands").Range("C3:C5").Cells

s = cell.Value & vbCr

doc.SendCommand (s)

Next

bằng

For Each cell In Selection.Cells

s = cell.Value & vbCr

doc.SendCommand (s)

Next

sẽ thấy sự khác biệt.

 

3. Code trong Visual Basic Editor có thể tham khảo ở đâu

ở đây : http://www.cadviet.com/forum/index.php?sho...ost&p=90541

  • Vote tăng 1

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

×