2010-10-04 17 views
8

He asignado macro a algunos botones.botón vba - buscar al que se hizo clic

¿Cómo puedo averiguar dentro de la macro en qué botón se hizo clic?

que estoy haciendo como formulario de usuario, donde puede pueblos de entrada de la familia:

nombre1:
apellido1:

nombre 2:
Apellido2:
| agregar siguiente miembro |

Deseo que el botón aparezca siempre en la última fila de la última persona agregada. Para simplificar, creo que es mejor tener como 100 formularios vacíos en la hoja , pero todo es invisible al principio.
Luego, cuando el usuario haga clic en Agregar siguiente miembro, simplemente haga visibles las siguientes filas, y mueva el botón a la siguiente persona. Pero para hacer eso necesito saber mi posición actual.

Similar con la eliminación Haría que las filas fueran invisibles cuando se haga clic en el botón Eliminar.

nombre1:
apellido1:
[eliminar]

nombre 2:
Apellido2:
[eliminar]

nombre3:
surname3:
| agregar próximo miembro |

Necesito saber en qué botón de eliminación se hizo clic.

EDIT: encontrado en la web - ¿qué te parece, parece ser mejor/manera

Dim r As Range 
Set r = ActiveSheet.Buttons(Application.Caller).TopLeftCell 
Range(Cells(r.Row, r.Column), Cells(r.Row, r.Column)).Select 
+0

Para aclarar su edición, parece que solo tiene un conjunto de botones, pero los sigue moviendo. Entonces, todo lo que necesitas saber es cómo colocar los botones en una fila. ¿Es asi? –

+0

Número de botones "eliminar", y en el mismo botón y "agregar". – Gadolin

+0

Bien, encontré cómo obtener el botón, pero parece que ya lo encontraste. Puede simplificar la instrucción Select, pero se ve bien. –

Respuesta

13

siempre escribo contenedores para cada botón que luego llamar a la macro en cuestión.

así:

Public Sub StoreButton_Click() 

    Call StoreTransValues(ActiveSheet) 

End Sub 

Si sólo tiene un botón para una sola página, que sólo puede obtener la propiedad ActiveSheet, y que será el botón en esa página.


Editar:

Aquí está el código para obtener y utilizar el nombre del botón de llamada:

Dim ButtonText As String 

ButtonText = Application.Caller 

ActiveSheet.Shapes(ButtonText).Delete 

Se podría utilizar el método .Llevar para mover el botón.

+0

No puedo simplemente adaptar su propuesta para mi caso. Todavía tengo que averiguar cuál es la posición del botón en el que se hace clic, luego ver qué fila es y finalmente eliminar todo, p. 2 filas arriba. – Gadolin

1

Como tiene una macro conectada a su botón (s), supongo que sabe en qué botón se hizo clic. Para obtener la ubicación del botón, utilice esto:

ActiveSheet.Shapes("ButtonName").TopLeftCell.Address 

Para mover un botón a una nueva ubicación, utilice esto:

Dim NewAddress as Range 
NewAddress = ActiveSheet.Cells(5, 5) 'Or where ever you need it to go 
ActiveSheet.Shapes("ButtonName").Left = NewAddress.Left 
ActiveSheet.Shapes("ButtonName").Top = NewAddress.Top 
+0

no si simplifica el código asignando la misma macro a cada botón, en cuyo caso el macro necesita ser más inteligente –

+0

Consiguió la posición con su respuesta y la colocó en http://stackoverflow.com/a/8303944/2932994 – simonides

6

fin encontré la solución para determinar qué botón en una hoja de trabajo era empujado. El crédito se debe a Derk al http://www.ozgrid.com/forum/showthread.php?t=33351.

mi último código de ejemplo:

Sub HereIAm() 
    Dim b As Object 
    Dim cs, rs As Integer 
    Dim ss, ssv As String 
    Set b = ActiveSheet.Buttons(Application.Caller) 
    With b.TopLeftCell 
     rs = .Row 
     cs = .Column 
    End With 
    ss = Left(Cells(1, cs).Address(False, False), 1 - (ColNumber > 26)) & rs 
    ssv = Range(ss).Value 
    MsgBox "Row Number " & rs & " Column Number " & cs & vbNewLine & _ 
     "Cell " & ss & " Content " & ssv 
End Sub 

Si usted no necesita la etiqueta de células, las células (RS, CS) .Value funciona tan bien.

-2
Dim button as a string: 

    button = ActiveSheet.Shapes(Application.Caller).Name 
Cuestiones relacionadas