Una duda: ¿botonprods(i).index no es siempre igual a i?
 
Dim nProds As Integer
    For nProds = botonprods.LBound To botonprods.UBound
            Debug.Print "Valor nProds= " & CStr(nProds) & " Valor Index= " & CStr(botonprods(nProds).Index)
    Next nProds  
Devuelve:
Valor nProds= 0 Valor Index= 0
Valor nProds= 1 Valor Index= 1
Valor nProds= 2 Valor Index= 2
Valor nProds= 3 Valor Index= 3  
No entiendo que es lo que necesitas exactamente... 
 
 
Saludos.