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.