Here's something else you might try. I've been using a LISP program that I wrote approx. 10 years ago. We use it whenever we update title blocks or need to insert a new title block due to a different drawing size, etc. Our title blocks have about 2 dozen attributes which I copy and then update some attributes to current info. I've included a shortened version of it here - with only 8 attributes, and deleted the update section. Maybe this is something you can modify with your attribute tags or add others as needed.
;=========================================================================
; COPYTB.LSP ver. 1.0 by Darryl Filbrun 1-26-05
;
; PURPOSE: To copy the data from one title block to another.
;
;==========================================================================
(defun c:copydata (/ e1 ee1 a1 aa1 e2)
;=========================================
; Get data from first title block
;=========================================
(setq SSET (car (entsel "\nSelect Title Block to Copy Data FROM...")))
;------------ File Name
(setq E1 SSET
EE1 E1
AA1 "xxxx"
)
(while (/= "FILE-NAME" AA1)
(setq E2 (entnext EE1)
EE1 E2
)
(setq A1 (entget E2))
(setq AA1 (cdr (assoc 2 A1)))
)
(setq FROM-FILE-NAME (cdr (assoc 1 A1)))
;------------ Drawing Number
(setq E1 SSET
EE1 E1
AA1 "xxxx"
)
(while (/= "DWG-NO" AA1)
(setq E2 (entnext EE1)
EE1 E2
)
(setq A1 (entget E2))
(setq AA1 (cdr (assoc 2 A1)))
)
(setq FROM-DWG-NO (cdr (assoc 1 A1)))
;------------ Title
(setq E1 SSET
EE1 E1
AA1 "xxxx"
)
(while (/= "TITLE" AA1)
(setq E2 (entnext EE1)
EE1 E2
)
(setq A1 (entget E2))
(setq AA1 (cdr (assoc 2 A1)))
)
(setq FROM-TITLE (cdr (assoc 1 A1)))
;------------ Designed
(setq E1 SSET
EE1 E1
AA1 "xxxx"
)
(while (/= "DESIGNED" AA1)
(setq E2 (entnext EE1)
EE1 E2
)
(setq A1 (entget E2))
(setq AA1 (cdr (assoc 2 A1)))
)
(setq FROM-DESIGNED (cdr (assoc 1 A1)))
;------------ Drawn By
(setq E1 SSET
EE1 E1
AA1 "xxxx"
)
(while (/= "DRAWN" AA1)
(setq E2 (entnext EE1)
EE1 E2
)
(setq A1 (entget E2))
(setq AA1 (cdr (assoc 2 A1)))
)
(setq FROM-DRAWN (cdr (assoc 1 A1)))
;----------- Date Drawn
(setq E1 SSET
EE1 E1
AA1 "xxxx"
)
(while (/= "DRN-DATE" AA1)
(setq E2 (entnext EE1)
EE1 E2
)
(setq A1 (entget E2))
(setq AA1 (cdr (assoc 2 A1)))
)
(setq FROM-DRN-DATE (cdr (assoc 1 A1)))
;------------ Scale
(setq E1 SSET
EE1 E1
AA1 "xxxx"
)
(while (/= "SCALE" AA1)
(setq E2 (entnext EE1)
EE1 E2
)
(setq A1 (entget E2))
(setq AA1 (cdr (assoc 2 A1)))
)
(setq FROM-SCALE (cdr (assoc 1 A1)))
;------------ Checked
(setq E1 SSET
EE1 E1
AA1 "xxxx"
)
(while (/= "CHECKED" AA1)
(setq E2 (entnext EE1)
EE1 E2
)
(setq A1 (entget E2))
(setq AA1 (cdr (assoc 2 A1)))
)
(setq FROM-CHECKED (cdr (assoc 1 A1)))
;=========================================
; Copy data to second title block
;=========================================
(setq SSET (car (entsel "\nSelect Title Block to Copy Data TO...")))
;------------ File Name
(setq E1 SSET
EE1 E1
AA1 "xxxx"
)
(while (/= "FILE-NAME" AA1)
(setq E2 (entnext EE1)
EE1 E2
)
(setq A1 (entget E2))
(setq AA1 (cdr (assoc 2 A1)))
)
(setq A1 (subst (cons 1 FROM-FILE-NAME)
(assoc 1 A1)
A1
)
)
(entmod A1)
;------------ Drawing Number
(setq E1 SSET
EE1 E1
AA1 "xxxx"
)
(while (/= "DWG-NO" AA1)
(setq E2 (entnext EE1)
EE1 E2
)
(setq A1 (entget E2))
(setq AA1 (cdr (assoc 2 A1)))
)
(setq A1 (subst (cons 1 FROM-DWG-NO)
(assoc 1 A1)
A1
)
)
(entmod A1)
;------------ Title
(setq E1 SSET
EE1 E1
AA1 "xxxx"
)
(while (/= "TITLE" AA1)
(setq E2 (entnext EE1)
EE1 E2
)
(setq A1 (entget E2))
(setq AA1 (cdr (assoc 2 A1)))
)
(setq A1 (subst (cons 1 FROM-TITLE)
(assoc 1 A1)
A1
)
)
(entmod A1)
;------------ Designed
(setq E1 SSET
EE1 E1
AA1 "xxxx"
)
(while (/= "DESIGNED" AA1)
(setq E2 (entnext EE1)
EE1 E2
)
(setq A1 (entget E2))
(setq AA1 (cdr (assoc 2 A1)))
)
(setq A1 (subst (cons 1 FROM-DESIGNED)
(assoc 1 A1)
A1
)
)
(entmod A1)
;------------ Drawn By
(setq E1 SSET
EE1 E1
AA1 "xxxx"
)
(while (/= "DRAWN" AA1)
(setq E2 (entnext EE1)
EE1 E2
)
(setq A1 (entget E2))
(setq AA1 (cdr (assoc 2 A1)))
)
(setq A1 (subst (cons 1 FROM-DRAWN)
(assoc 1 A1)
A1
)
)
(entmod A1)
;------------ Date Drawn
(setq E1 SSET
EE1 E1
AA1 "xxxx"
)
(while (/= "DRN-DATE" AA1)
(setq E2 (entnext EE1)
EE1 E2
)
(setq A1 (entget E2))
(setq AA1 (cdr (assoc 2 A1)))
)
(setq A1 (subst (cons 1 FROM-DRN-DATE)
(assoc 1 A1)
A1
)
)
(entmod A1)
;------------ Scale
(setq E1 SSET
EE1 E1
AA1 "xxxx"
)
(while (/= "SCALE" AA1)
(setq E2 (entnext EE1)
EE1 E2
)
(setq A1 (entget E2))
(setq AA1 (cdr (assoc 2 A1)))
)
(setq A1 (subst (cons 1 FROM-SCALE)
(assoc 1 A1)
A1
)
)
(entmod A1)
;------------ Checked By
(setq E1 SSET
EE1 E1
AA1 "xxxx"
)
(while (/= "CHECKED" AA1)
(setq E2 (entnext EE1)
EE1 E2
)
(setq A1 (entget E2))
(setq AA1 (cdr (assoc 2 A1)))
)
(setq A1 (subst (cons 1 FROM-CHECKED)
(assoc 1 A1)
A1
)
)
(entmod A1)
;====================================================================
(entupd E1) ;Update screen to show new info.
) ;Close defun c:copydata
;====================================================================
(defun c:copytb (/ ER)
(setvar "cmdecho" 0)
(princ "\n CopyTB.LSP ver. 1.0 by Darryl Filbrun 1-26-05")
(setq ER *error*)
(defun *error* (msg)
(setq *error* er)
(princ msg)
(princ)
)
(c:copydata)
(prin1)
)
;====================================================================
If you would like my complete current LISP file, I'll be glad to e-mail it to you. Hope this helps.
P.S. Another useful program that I've also been wanting to write is one that would copy all like-named attributes from one block to another. It would make a list of the attributes in the "copy-from" block and another list of those in the "copy-to" block, then compare them and copy only those having the same attribute tag. But I'm not real good at writing LISP - often copying parts of other code and experimenting until I get it to work. I expect someone else could write it real quickly. Any ideas or suggestions? I notice that Mark Thomas wrote MST-attribute_list, which would probably be a good start, but I don't know anything about VBA.