4 votos

Sumar/Restar el botón de Excel VBA

He aquí un ejemplo de mi proyecto en esta imagen

enter image description here

Me gusta coleccionar, así que he hecho una hoja de inventario en Excel.

Quiero hacer de una manera que yo pueda hacer clic en un botón y que afecta a la siguiente o anterior de la célula

Por ejemplo:

La celda C3 tendría Agregar botón, la Celda D3 el número de copias que tengo de ese elemento, y la Celda E3 tendría una Restar botón. Haciendo clic en el botón en C3, agrega uno más que el número en la Celda D3. Si hace clic en el botón de C1, se restaría de la Celda D3. Parece bastante sencillo.

Heres las condiciones, sin embargo:

Tengo como 200 artículos por hoja como 20 hojas (no en el ejemplo). Me gustaría alguna manera de que yo pudiera agregar las macros a todos los botones sin tener que hacer un nuevo macro específico para cada botón. No quiero trabajar con la celda seleccionada. Debe afectar a la celda a la derecha para agregar el botón y la celda a la izquierda para el botón restar.

He buscado por todas partes por una respuesta, y me vinieron muy cerca de la solución.

El es lo más cercano que pude encontrar pero no es lo que yo no soy lo que yo soy para cocinar:

 Sub AddOne()
 ActiveCell.Value = ActiveCell.Value + 1
 End Sub

 Sub SubtractOne()
 ActiveCell.Value = ActiveCell.Value - 1
 End Sub

Espero que esto tiene sentido y gracias a todos por su tiempo.

4voto

Geoff Puntos 1670

La razón por la que su solución no funciona es que la hoja de cálculo del ActiveCell valor no cambia cuando un usuario hace clic en un botón que está haciendo clic en el botón, no el de la celda.

Hay un par de maneras de abordar este. Cualquiera puede crear un montón de botones y tiene un genérico sub para hacer el trabajo, o puede interceptar el cambio de celda de eventos y responder a ella. El primero será mucho más agradable experiencia de usuario, pero es más trabajo para configurar inicialmente.

Método 1: Botones

Este método utiliza el nombre del botón para realizar la acción apropiada, en la celda apropiada. Como una visión general, crear todos los botones, y cada llamada que el mismo genérico VBA sub, que en vez de averiguar que el botón de llamada, y hacer la operación correspondiente.

Supongamos que vas a llamar a tus botones cosas como ADD_D3 y SUB_D3, por ejemplo para aumentar/disminuir el valor de D3.


En primer lugar, crear una subrutina para hacer el trabajo en VBA:

Sub AdjustValue()
    Dim btnName As String
    Dim targetCell As String
    Dim addAmount As Integer

    btnName = Application.Caller
    targetCell = Mid(btnName, 5, Len(btnName))
    addAmount = IIf(Left(btnName, 3) = "ADD", 1, -1)

    ActiveSheet.Range(targetCell).Value = _
        ActiveSheet.Range(targetCell).Value + addAmount
End Sub

Rompiendo:

  1. Aplicación.Persona que llama le da el nombre de la persona que llama, en este caso, el nombre del botón
  2. Tomamos el nombre de la celda de destino fuera de la final, sin pasar por los cuatro primeros caracteres
  3. Podemos averiguar si estamos añadiendo o restando basados en los tres primeros caracteres
  4. Utilizamos la celda de destino nombre de la actualización de la celda de hoja de cálculo

A continuación, cree sus botones; agregar Formulario de Control de los botones de la hoja de cálculo para cada uno de los + y - los botones que usted necesita.

Para cada uno, asignar un nombre sistemático basado en la célula a la que se debe de destino, como se describe anteriormente. Por ejemplo en la imagen de arriba se podrían nombrar los dos primeros botones de la ADD_D3 y SUB_D3.
Para cambiar el nombre de un botón, haga clic en él para seleccionarlo y, a continuación, en el cuadro de dirección en la parte superior izquierda de la hoja de cálculo sobrescribir el nombre (por ejemplo, Botón 1) con su nuevo nombre:
enter image description here

Por último, el de arriba debe trabajar para varias hojas demasiado, ya que el sub usos ActiveSheet para acceder a la celda.


Método 2: Cambio En La Selección

Esto es mucho más sencillo de configurar, pero es un poco chapucero. En primer lugar, configure la hoja con más y menos símbolos en cada celda, para colorear ellos, sin embargo, desea darles un aspecto más de botón. Por ejemplo: enter image description here

Tenga en cuenta que usted tiene que utilizar una comilla simple (') para poner el símbolo en la celda como texto, por ejemplo '- y '+ (esto es visible en la barra de fórmulas en la parte superior del ejemplo).

A continuación, cree una rutina única para responder a una de esas celdas están seleccionadas:

Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim numCell As Range

    If Target.Count <> 1 Then Exit Sub

    If Target.Value = "+" Then
        Set numCell = Target.Offset(0, -1)
        numCell.Select
        numCell.Value = numCell.Value + 1
    ElseIf Target.Value = "-" Then
        Set numCell = Target.Offset(0, 1)
        numCell.Select
        numCell.Value = numCell.Value - 1
    End If
End Sub

Rompiendo:

  1. El nombre de la sub es importante - se indica a Excel para ejecutar el sub cuando el usuario hace clic en cualquier celda
  2. El Target parámetro es la celda que fue pulsado por el usuario, pero podría ser una de arrastrar la selección también. Primero comprobamos que el tamaño es de exactamente 1, y la salida si no lo es.
  3. A continuación podemos comprobar su valor para un + o - de su valor. Tenga en cuenta que no tenemos que comprobar la comilla de la marca.
  4. A continuación, utilizamos el Offset comando para encontrar la celda a la izquierda o la derecha, dependiendo de si estamos tratando con un + o - de células de partida
  5. Una vez que tenemos el número de células, la seleccionamos en primer lugar, a continuación, cambiar su valor hacia arriba o hacia abajo

La razón de que seleccione el número de células es que la selección se mueve fuera de la + o - de células, por lo que se puede hacer clic en él de nuevo. Si alguna vez quieren trabajar en esas células, deberá desactivar esta sub temporalmente, por ejemplo poniendo en un Exit Sub línea en la parte superior.

Pequeña nota: Worksheet_SelectionChange es lo que se usaría si estuviera trabajando en la hoja de la macro: enter image description here

Si usted está trabajando en la ThisWorkbook módulo, usted querrá usar el global de cambio en la selección sub:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    'Code goes in here
End Sub

El mismo código de trabajo - y en este caso va a trabajar en cada hoja en el libro.


Ejemplo de hoja de cálculo que muestra dos ejemplos aquí.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: