After seeing this thread, I took a crack at having it emulate a no-frills version of ACAD's native Find And Replace Text. A few tweaks later and it's getting there, but it's still a WIP:
(defun c:FART (/ ss find replace);Find And Replace Text
(setq find (getstring "\nEnter the text to find: "))
(setq replace (getstring "\nEnter the replacement text: "))
(setq ss (ssget '((0 . "TEXT,MTEXT,DIMENSION,ACAD_TABLE"))))
(if ss
(progn
(vlax-for obj (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object)))
(princ "\n")
(princ (vla-get-ObjectName obj))
(cond
((= (vla-get-ObjectName obj) "AcDbText")
(while (vl-string-search find (vla-get-TextString obj))
(vla-put-TextString obj (vl-string-subst replace find (vla-get-TextString obj)))))
((= (vla-get-ObjectName obj) "AcDbMText")
(while (vl-string-search find (vla-get-TextString obj))
(vla-put-TextString obj (vl-string-subst replace find (vla-get-TextString obj)))))
((= (vla-get-ObjectName obj) "AcDbRotatedDimension")
;(if (vl-string-search find (vla-get-TextOverride obj))
(while (vl-string-search find (vla-get-TextOverride obj))
(vla-put-TextOverride obj (vl-string-subst replace find (vla-get-TextOverride obj)))))
((= (vla-get-ObjectName obj) "AcDbTable")
;(let ((rowCount (vla-get-Rows obj))
;(colCount (vla-get-Columns obj)))
(setq colCount (vlax-get-property obj 'Columns))
(setq rowCount (vlax-get-property obj 'rows))
(repeat rowCount
(setq row (1- rowCount))
(repeat colCount
(setq col (1- colCount))
(setq cellText (vla-gettext obj row col))
(while (vl-string-search find cellText)
(setq cellText (vl-string-subst replace find cellText))
(vla-SetText obj row col cellText))
(setq colCount (1- colCount)))
(setq rowCount (1- rowCount)))));)
)
(princ "\nText replacement completed.")
)
(princ "\nNo matching text found.")
)
(princ)
)
I had it add MLeaders, but that was full of made-up function definitions. I'll be trying a different approach.
AutoCad 2018 (full)
Win 11 Pro