2011-06-05 28 views
11

Estoy intentando hacer un botón en Excel que copie un cierto rango de celdas del libro activo a otro libro. La copia de esta gama funciona perfectamente cuando especifico un rango fijo, pero no sé cómo resolver la fila del botón que se está haciendo clic.Excel VBA: obtener la fila del botón presionado

Cada fila contiene 7 o más celdas, y la 8va celda contiene una forma con una macro adjunta (el botón). Cuando el usuario presiona este botón, las 7 celdas en la misma fila que la fila que contiene el botón presionado deben ser copiadas.

El uso de ActiveCell no sirve de nada, ya que presionar el botón en realidad no establece esa celda como activa. Busqué mucho, pero parece que no puedo encontrar cómo obtener este valor. Una vez que tengo el número de fila del botón en el que hago clic, puedo resolver el resto por mi cuenta.

Respuesta

18

Cada Shape tiene TopLeftCell la propiedad. Contiene una celda dentro de la cual reside la esquina superior izquierda de la forma.

+1

Ya veo, gracias por la respuesta. También me preguntaba cómo obtener el nombre de la forma en la que se hizo clic, pero después de buscar un poco encontré esto: ActiveSheet.Shapes (Application.Caller) .Name. Trataré de trabajar con la propiedad TopLeftCell de la forma y te haré saber cuándo está funcionando. ¡Gracias de nuevo por señalarme en la dirección correcta! – Jort

+10

Lo tengo en pleno funcionamiento: MsgBox ("Fila del botón presionado:" y ActiveSheet.Shapes (Application.Caller) .TopLeftCell.Row). ¡Gracias de nuevo! – Jort

14

Hay una gran solución mencionado aquí: http://www.ozgrid.com/forum/showthread.php?t=33351&p=167317#post167317

código de Oro copiado del post anterior:

Sub Mainscoresheet() 
    ' Mainlineup Macro 
    Dim b As Object, cs As Integer 
    Set b = ActiveSheet.Buttons(Application.Caller) 
    With b.TopLeftCell 
     cs = .Column 
    End With 
    MsgBox "Column Number " & cs 
End Sub 
+0

Muy útil con botones generados dinámicamente. –

4

excelente respuesta. Por cierto, ¡también funciona para Rownumber!

'Same for rownumbers! 
Sub Mainscoresheet() 
    ' Mainlineup Macro 
    Dim b As Object, RowNumber As Integer 
    Set b = ActiveSheet.Buttons(Application.Caller) 
    With b.TopLeftCell 
     RowNumber = .Row 
    End With 
    MsgBox "Row Number " & RowNumber 
End Sub 
Cuestiones relacionadas