Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
nvson

Thuộc tính TagString của AcadAttributeReference trong VBA Excel khác VBA AutoCAD?

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

nvson    4

Chào các bác!

Tôi sử dụng AutoCAD 2008 và Excel 2010.

Trong VBA for AutoCAD, tôi Insert 1 file chứa các Block Attribute, dùng thuộc tính Tagstring để nhận biết và chỉnh sửa.

NHưng khi chuyển sang VBA for Excel, cũng sử dụng như vậy nhưng không nhận được giá trị của Tagstring nên không biết đường nào mà sửa.

Mong các bác giúp đỡ!

Xin cảm ơn nhiề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
anhcos    177

Các thuộc tính của Tảgting dễ dàng truy xuất thôi mà.

 

TagString Property

Specifies the tag string of the object.

See Also | Example

Signature 

object.TagString 

object

Attribute, AttributeReference, PopupMenu, PopupMenuItem, Toolbar, ToolbarItem
The object or objects this property applies to. 

TagString

String; [color="#FF0000"][b]read-write[/b][/color] (read-only for PopupMenu and Toolbar objects)
The tag string of the object. 

Remarks 

Attribute, AttributeReference: This string identifies each occurrence of the attribute. Enter any characters except spaces or exclamation points. AutoCAD changes lowercase letters to uppercase.

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
hoa35ktxd    38

Bạn nên nói rõ thêm bạn đã tạo cơ chế "bắt tay" giữa Excel và Cad chưa?

Khi đã "bắt tay" được nhau rồi thì rủ đi đâu chả đượ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
anhcos    177
Bạn nên nói rõ thêm bạn đã tạo cơ chế "bắt tay" giữa Excel và Cad chưa?

Khi đã "bắt tay" được nhau rồi thì rủ đi đâu chả được.

 

Bắt tay đây:

 

dim AcadApp as object

'Coi như ACAD đang chạy và rảnh rỗi

set AcadApp = GetObject(,"Acad.Application")

 

AcadApp lúc này là biến chứa đựng thông tin về chương trình AutoCAD đang chạy.

Sử dụng biến đó để truy xuất đến các thuộc tính và hàm.

 

Muốn biết chi tiết về nó, xem hướng dẫn VBA trong AutoCAD. (or mở file acad_dev.chm trong thư mục help của ACAD)

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
nvson    4

Cảm ơn các bác đã quan tâm.

 

To hoa35ktxd: Dĩ nhiên là trong Excel mình đã "bắt tay" với AutoCAD rồi.

Các bạn xem code nhé:

 

Đây là code chạy trong AutoCAD

Public Sub Block_Attribute()
Dim x As Integer
Dim i As Integer
Dim varAtts() As AcadAttributeReference
Dim blockRefObj As AcadBlockReference
Dim insertionPnt(0 To 2) As Double

For x = 1 To 5
insertionPnt(0) = insertionPnt(0) + 200#
insertionPnt(1) = 0#
insertionPnt(2) = 0

'Lenh trong AutoCAD
'Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "Block_Attibute", 1#, 1#, 1#, 0)

varAtts = blockRefObj.GetAttributes
For i = LBound(varAtts) To UBound(varAtts)
	MsgBox varAtts(i).TagString
	Select Case varAtts(i).TagString
		Case "DU_AN"
			varAtts(i).TextString = "1" & x
		Case "GIAI_DOAN"
			varAtts(i).TextString = "2" & x
	End Select
Next i
blockRefObj.Update
Next x
End Sub

 

Đây là code chạy trong Excel

Public Sub Block_Attribute()
Dim x As Integer
Dim i As Integer
Dim varAtts() As AcadAttributeReference
Dim blockRefObj As AcadBlockReference
Dim insertionPnt(0 To 2) As Double

For x = 1 To 5
insertionPnt(0) = insertionPnt(0) + 200#
insertionPnt(1) = 0#
insertionPnt(2) = 0
'Lenh trong Excel
Set blockRefObj = AcadApplication.ActiveDocument.ModelSpace.InsertBlock(insertionPnt, "Block_Attibute", 1#, 1#, 1#, 0)

varAtts = blockRefObj.GetAttributes
For i = LBound(varAtts) To UBound(varAtts)
	MsgBox varAtts(i).TagString
	Select Case varAtts(i).TagString
		Case "DU_AN"
			varAtts(i).TextString = "1" & x
		Case "GIAI_DOAN"
			varAtts(i).TextString = "2" & x
	End Select
Next i
blockRefObj.Update
Next x
End Sub

 

Còn đây là file có chứa các Block Attrtibute

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

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
phantuhuong    204

Mình lại không thạo về block thuộc tính nên không giúp được Sơn, nhưng theo mình đã thực hiện được = VBA AutoCad thì sao lại ko được trong Excel??? Nhiều người lập chương trình điều khiển AutoCad từ bên ngoài như Excel, VB6, C, Delphi,... Em thử hỏi anh Long LOGMAN 0437523740 xem sao.

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
anhcos    177

'Lenh trong Excel

Set blockRefObj = AcadApplication.ActiveDocument.ModelSpace.InsertBlock(insertionPnt, "Block_Attibute", 1#, 1#, 1#, 0)

 

Có lẽ bạn sai ở chỗ này, vì AcadApplication là một class, không dùng với cấu trúc như trên được.

 

Bạn phải khai báo như sau

Dim AcadApp as AcadApplication

Liên kết với bản AutoCAD dang chạy ở đây

 

sau đó lệnh trên fải sửa lại:

Set blockRefObj = AcadApp.ActiveDocument.ModelSpace.InsertBlock(insertionPnt, "Block_Attibute", 1#, 1#, 1#, 0)

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
nvson    4

Vấn đề không phải ở chỗ đó anh anhcos à.

Nó nhận không đúng cái TagString cơ.

Trong AutoCAD thì nó nhận đúng, còn trong Excel thì khô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
anhcos    177

Nó liên đới đến nhau đó. biến blockRefObj chưa được đặt giá trị (blockRefObj=nothing) thì làm sao có thể truy xuất đến các thuộc tính của nó được. Bạn thử debug phía sau lệnh set blockRefObj = ... xem nó có được set gía trị hay chưa là biết ngay thôi.

  • 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
nvson    4

Cảm ơn anh anhcos. Đúng là tôi chưa tạo block có tên là "ABC".

Tôi sử dụng ACad 2008.

Đây là code trong ACad

 

Public Sub UpdateAttribute()
Dim x As Integer
Dim i As Integer
Dim varAtts() As AcadAttributeReference
Dim blockRefObj As AcadBlockReference
Dim insertionPnt(0 To 2) As Double

For x = 1 To 1
insertionPnt(0) = insertionPnt(0) + 200#
insertionPnt(1) = 0#
insertionPnt(2) = 0

Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "ABC", 1#, 1#, 1#, 0)

varAtts = blockRefObj.GetAttributes
For i = LBound(varAtts) To UBound(varAtts)
	MsgBox varAtts(i).TagString
	Select Case varAtts(i).TagString
		Case "DU_AN"
			varAtts(i).TextString = "1" & x
		Case "GIAI_DOAN"
			varAtts(i).TextString = "2" & x
		Case "HANG_MUC"
			varAtts(i).TextString = "3" & x
	End Select
Next i
blockRefObj.Update
Next x
End Sub

Các bạn mở file Block_Attribute.dwg trong file đính kèm, thêm đoạn code trên, ĐẢM BẢO ĐOẠN CODE CHẠY ĐÚNG.

AutoCad nhận đúng TagString.

 

+ Bi giờ tôi mở file TagString_AutoCad2008.xls, rồi chạy Macro (đoạn Code trong VBA Excel giống đoạn code trong VBA AutoCad)

Excel nhận không đúng TagString.

(Khi chạy Excel chú ý file Block_Attribute.dwg đang được mở).

 

Mong các bạn giúp đỡ.

 

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

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
anhcos    177

Đã kiểm tra, bạn thay chỗ này là xong:

 

Dim varAtts() As AcadAttributeReference

thành

Dim varAtts As Variant

  • 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
nvson    4

Cảm ơn anh anhcos nhiều.

Nhờ anh mà biết được chỗ sai của chương trình.

Khai báo như anh: Dim varAtts As Variant cũng không hay lắm

mà phải là: Dim varAtts() As AcadBlockReference

 

:D

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
anhcos    177
varAtts() As AcadBlockReference

 

Khai báo thế này thì không đúng với cú pháp của hàm GetAttributes rồi.

Nhưng chtrình vẫn chạy được thì đúng là automation của CAD vẫn có vấ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ạ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

Đăng nhập để thực hiện theo  

×