@DC-MWA hi,
i see you are very active lately and you are learning a lot and we all very happy to see that - so keep up the good work 
above the good help you got from @marko_ribar and @DannyNL i have one remark:
where user interaction involves e.g pausing to get some input, better to bring in consideration that wrong\unexpected value will enter plus this is the spot where the user will also want to exit (or escape)
good programming code must take care of these situations - agree?!
so when using (entsel) or (getXXXX) functions first check the value entered and only if it's positive value you expected continue your program otherwise you end up with autolisp error (not nice).
for example:
(if (and
(setq pick (entsel "\nSelect block: "))
(setq elist (entget (car pick))) ; get entity database
(eq (strcase (cdr (assoc 0 elist))) "INSERT") ; verifies it's a block
(eq (strcase (cdr (assoc 2 elist))) "BLOCKNAME") ; verifies it's name
(= (cdr (assoc 66 elist)) 1) ; has attributes?
)
(progn
; continue your code
; ...
; ..
; .
); progn
); if
as you can see if the user want's to exist he can just press enter (or even in this case pick on empty point)
if the entity selected is not an attribute block with the expected name the program is quiet exit 
enjoy
moshe