@Anonymous,
here is the command c:test, you can change it to any name you like.
i know (DatabaseScan) is inefficient but it will work fast as long as your blocks are not so big or very deep.
look at the first line:
(setq *BNAME* (strcase "grille,other-block-name"))
you can include as much blocks name as you like by delimited their name with "," - ok? 
enjoy,
moshe
; Load ActivX Support
(vl-load-com)
;;; database object and containers
(setq *acad-object* nil) ; Initialize global variable
(defun acad-object ()
(cond (*acad-object*) ; Return the cached object
(t
(setq *acad-object* (vlax-get-acad-object))
)
)
)
(setq *active-document* nil) ; Initialize global variable
(defun active-document ()
(cond (*active-document*) ; Return the cached object
(t
(setq *active-document* (vla-get-activedocument (acad-object)))
)
)
)
(setq *blocks* nil) ; Initialize global variable
(defun blocks ()
(cond (*blocks*) ; Return the cached object
(t
(setq *blocks* (vla-get-blocks (active-document)))
)
)
)
(setq *activeSelectionSet* nil) ; Initialize global variable
(defun activeSelectionSet ()
(cond (*activeSelectionSet*) ; Return the cached object
(t
(setq *activeSelectionSet* (vla-get-ActiveSelectionSet (active-document)))
)
)
)
; select block references according nested 'grille' block name
; support dynamic block
(defun c:test (/ isXRef databaseScan ; local functions
*BNAME* ss0 ss1 lst0 lst1 bn bname bnames AcDbEntity)
(defun isXRef (blk / AcDbBlockTableRecord)
(and
(setq AcDbBlockTableRecord (vla-item (blocks) blk))
(eq (vla-get-isXRef AcDbBlockTableRecord) :vlax-true)
)
); isXRef
(defun DatabaseScan (bname / flag blk)
(cond
((wcmatch (strcase bname) *BNAME*)
(setq flag t)
)
( t
(vlax-for AcDbEntity (vla-item (blocks) bname)
(if (and
(eq (vla-get-objectName AcDbEntity) "AcDbBlockReference")
(wcmatch (strcase (setq blk (vla-get-effectivename AcDbEntity))) *BNAME*)
(not (isXRef blk)); deny xref
)
(setq flag t)
); if
(vlax-release-object AcDbEntity)
); vlax-for
); case
); cond
flag
); DatabaseScan
; here start command
(setq *BNAME* (strcase "grille,other-block-name"))
(if (setq ss0 (ssget '((0 . "insert"))))
(progn
(setq lst0 '())
(vlax-for AcDbEntity (activeSelectionSet)
(if (not (isXRef (setq bn (vla-get-effectivename AcDbEntity)))) ; deny xref
(setq lst0 (cons bn lst0))
)
(vlax-release-object AcDbEntity)
); vlax-for
; remove duplicate items
(setq lst1 '())
(foreach bn lst0
(if (not (member bn lst1))
(setq lst1 (cons bn lst1))
)
); foreach
(setq bnames "")
(foreach bn lst1
(if (DatabaseScan bn)
(setq bnames (strcat bnames bn ","))
)
); foreach
(if (/= bnames "")
(progn
(setq bnames (substr bnames 1 (1- (strlen bnames)))) ; remove last ","
(if (setq ss1 (ssget "x" (list '(0 . "insert") (cons '2 bnames))))
(sssetfirst ss1 ss1)
(prompt "\nNoting found.")
)
); progn
); if
); progn
); if
(princ)
); c:test