This might help you for a part of it. This was originally written to changeout an old title block for a new one.
The piece below creates the Selection set of block references. I'm using an array of block names as my list. This allows me to handle different blocks in different manners. Once I find a block I'm looking for, the insert point, scale, and rotation angle are stored in variables to use later. If there are attributes these are stored an an array so that the values are not destroyed when the block is deleted.
Set objAcadSSet = ThisDrawing.SelectionSets.Add("sSet2")
intTextCodes(0) = 0 'set code for entities
varCodeValues(0) = "INSERT" 'set entity type to filter
objAcadSSet.Select acSelectionSetAll, , , intTextCodes, varCodeValues 'create set
For Each objOldBlk In objAcadSSet
BName = UCase(objOldBlk.Name)
Select Case BName
Case arOldBlkNames(0) 'ctml0011
InsertPt(0) = objOldBlk.InsertionPoint(0)
InsertPt(1) = objOldBlk.InsertionPoint(1)
InsertPt(2) = objOldBlk.InsertionPoint(2)
xScale = objOldBlk.XScaleFactor
yScale = objOldBlk.YScaleFactor
zScale = objOldBlk.ZScaleFactor
Rot = objOldBlk.Rotation
If objOldBlk.HasAttributes Then
varOldAtt = objOldBlk.GetAttributes 'get block attributes
End If
For intOldCnt = LBound(varOldAtt) To UBound(varOldAtt)
Set objOldAttRef = varOldAtt(intOldCnt)
Next intOldCnt
NewBlkName = "CTML0013.dwg"
NewBlk
And this piece is the new block going back in with the attributes fed back in.
Case arOldBlkNames(0) 'CTMl0011
Set objNewBlk = ThisDrawing.ModelSpace.InsertBlock(InsertPt, NewBlkName, xScale, yScale, zScale, Rot) 'insert new tblock
varNewAtt = objNewBlk.GetAttributes 'get attributes
For intOldCnt = LBound(varOldAtt) To UBound(varOldAtt)
For intNewCnt = LBound(varNewAtt) To UBound(varNewAtt)
If varNewAtt(intNewCnt).TagString = varOldAtt(intOldCnt).TagString Then
varNewAtt(intNewCnt).TextString = varOldAtt(intOldCnt).TextString
End If
Next
Next