Hola chicos,
Tavo77";p="24034 escribió:No se si hay alguna forma de diferenciar estos controles de otras autoformas.
Si se puede, pero no es muy obvio
1) Con los controles de la barra de herramientas Formularios todo es relativamente facil:
Activesheet.Buttons(1).Select
Activesheet.ListBoxes.Select
etc.
Ademas se puede usar la propiedad
Type del objeto Shape para crear una matriz con los nombres de los controles, p.ej:
- Código: Seleccionar todo
Sub SelectAllControlToolboxShapes()
With ActiveSheet.Shapes
numShapes = .Count
If numShapes > 1 Then
ReDim btnsArray(0)
For i = 1 To numShapes
If .Item(i).Type = 12 Then
btnsArray(UBound(btnsArray)) = .Item(i).Name
ReDim Preserve btnsArray(UBound(btnsArray) + 1)
End If
Next
If UBound(btnsArray) > 0 Then
ReDim Preserve btnsArray(UBound(btnsArray) - 1)
.Range(btnsArray).Select
End If
End If
End With
End Sub
2) Algo parecido con los ActiveX controles de la barra de herramientas Visual Basic for Applications se podria conseguir mediante el siguiente codigo:- Código: Seleccionar todo
Sub SelectActiveXButtons()
Dim OLEobj As Excel.OLEObject
ReDim btnsArray(0)
For Each OLEobj In ActiveSheet.OLEObjects
If TypeOf OLEobj.Object Is msforms.CommandButton Then
btnsArray(UBound(btnsArray)) = OLEobj.Name
ReDim Preserve btnsArray(UBound(btnsArray) + 1)
End If
Next OLEobj
If UBound(btnsArray) > 0 Then
ReDim Preserve btnsArray(UBound(btnsArray) - 1)
ActiveSheet.Shapes.Range(btnsArray).Select
End If
End Sub
Una vez obtenida la matriz de nombres, se podria usar unos indices numericos para referirse a los controles:
ActiveSheet.Shapes(btnsArray(i)).Select
Nota: Los procedimientos de arrioba los escribi hace varios años por lo que es posible que sean optimizables ' solo que no he tenido tiempo para revisarlos.