Maybe something like this?
Code:
;;=======================[ ArrtMatch.lsp ]=======================
;;; Author: Copyright© 2006 Charles Alan Butler
;;; Version: 1.1 Mar. 27, 2006
;;; Purpose: To update attributes in a block, from a selected
;;; doner block
;;; Requirements: -None
;;; Returns: -None
;;;==============================================================
;;
(defun c:attrmatch (/ ss obj att attr_list parent)
(defun get_attr_lst (blk / lst)
(foreach att (vlax-invoke blk 'getattributes)
(setq lst (cons (cons (vla-get-tagstring att) (vla-get-textstring att)) lst))
)
)
(or *doc* (setq *doc* (vla-get-activedocument (vlax-get-acad-object))))
(prompt "\nSelect a block to copy attributes from.")
(if (setq ss (ssget "+.:E:S" '((0 . "INSERT") (66 . 1))))
(progn
(vla-startundomark *doc*)
(setq parent (vlax-ename->vla-object (ssname ss 0)))
(vla-highlight parent :vlax-true)
(setq attr_list (get_attr_lst parent))
(while
(progn (prompt "\nSelect a block to copy attributes from.")
(setq ss (ssget "+.:E:S" '((0 . "INSERT") (66 . 1))))
)
;; update matching attributes
(setq obj (vlax-ename->vla-object (ssname ss 0)))
(foreach att (vlax-invoke obj 'getattributes)
(if (assoc (setq tag (vla-get-tagstring att)) attr_list)
(vla-put-textstring att (cdr (assoc tag attr_list)))
)
)
)
(vla-highlight parent :vlax-false)
(vla-endundomark *doc*)
)
)
(princ)
)
(prompt "\nAttribute Match Loaded, Enter AttrMatch to run.")
(princ)