Ejecutar botones en una hoja de excel desde un userform

tengo dos botones en Excel con los que recojo información que se genera en celdas, para llevarlos a una base de datos, esto lo hace con una macro (es un checador de entrada y salida) lo hace a la perfección pero deseo hacerlo desde un UserForm con dos botones similares, pero la macro que opera esta recolección de información tiene instrucciones que no se como manejar, la macro ya la asigne a los CommandButton del UserForm pero me manda un error en esta instrucción 

tipoMov = Application.Caller ' bEntrada o bSalida, según el botón pulsado

entiendo que la macro funciona porque tiene la orden de usar uno u otro botón dependiendo de la información que encuentre en la hoja de calculo, lo que no se, es como direccionarla al UserForm y utilice los CommandBotton que ahí tengo.

esta es la macro

Sub Add_Control()
    Dim miCelda As Range
    Dim FilaLibre As Long
    Dim tipoMov As String
    Set miCelda = [datos]
    FilaLibre = ActiveSheet.Cells(65536, miCelda.Column).End(xlUp).Row + 1

    tipoMov = Application.Caller ' bEntrada o bSalida, según el botón pulsado

    If tipoMov = "bEntrada" Then
        ' Buscar primera fila libre y rellenar
        FilaLibre = ActiveSheet.Cells(65536, miCelda.Column).End(xlUp).Row + 1
        ActiveSheet.Cells(FilaLibre, miCelda.Column).Value = [codemp]
        ActiveSheet.Cells(FilaLibre, miCelda.Column).Offset(0, 1).Value = [b6]
        ActiveSheet.Cells(FilaLibre, miCelda.Column).Offset(0, 2).Value = Now()
        ActiveSheet.Cells(FilaLibre, miCelda.Column).Offset(0, 4).Value = Now()
        ActiveSheet.Cells(FilaLibre, miCelda.Column).Offset(0, 5).Value = Now()
    Else
        ' Buscar la última entrada de este empleado que no tenga hora de salida y rellenar
        Do While FilaLibre > [datos].Row
            FilaLibre = FilaLibre - 1
            If ActiveSheet.Cells(FilaLibre, miCelda.Column).Value = [codemp] Then
                If ActiveSheet.Cells(FilaLibre, miCelda.Column).Offset(0, 3).Value = "" Then
                    ActiveSheet.Cells(FilaLibre, miCelda.Column).Offset(0, 3).Value = Now()
                    Exit Do
                End If
            End If
        Loop
    End If

End Sub


saludos y gracias.

1 respuesta

Respuesta
1

Raul Ceseña!

Estoy haciendo pruebas y no consigo salir de los errores en esa línea o si no los da me sale que TipoMov es Nothing.

¿Por qué no pruebas con algo más sencillo?

Defines estas funciones para el clic en los botones

Private Sub bEntrada_Click()
Call Add_control("bEntrada")
End Sub

Private Sub bSalida_Click()
Call Add_control("bSalida")
End Sub

-----------------

Y a esta le añades un parámetro de entrada y quitas la decalaración dim de la variable tipoMov y la línea donde se calcula.

Sub Add_control(tipoMov As String)

Dim miCelda As Range
    Dim FilaLibre As Long
    Set miCelda = [datos]
    FilaLibre = ActiveSheet.Cells(65536, miCelda.Column).End(xlUp).Row + 1

    If tipoMov = "bEntrada" Then
        ' Buscar primera fila libre y rellenar
        FilaLibre = ActiveSheet.Cells(65536, miCelda.Column).End(xlUp).Row + 1
        ActiveSheet.Cells(FilaLibre, miCelda.Column).Value = [codemp]
        ActiveSheet.Cells(FilaLibre, miCelda.Column).Offset(0, 1).Value = [b6]
        ActiveSheet.Cells(FilaLibre, miCelda.Column).Offset(0, 2).Value = Now()
        ActiveSheet.Cells(FilaLibre, miCelda.Column).Offset(0, 4).Value = Now()
        ActiveSheet.Cells(FilaLibre, miCelda.Column).Offset(0, 5).Value = Now()
    Else
        ' Buscar la última entrada de este empleado que no tenga hora de salida y rellenar
        Do While FilaLibre > [datos].Row
            FilaLibre = FilaLibre - 1
            If ActiveSheet.Cells(FilaLibre, miCelda.Column).Value = [codemp] Then
                If ActiveSheet.Cells(FilaLibre, miCelda.Column).Offset(0, 3).Value = "" Then
                    ActiveSheet.Cells(FilaLibre, miCelda.Column).Offset(0, 3).Value = Now()
                    Exit Do
                End If
            End If
        Loop
    End If

End Sub

·

Añade tu respuesta

Haz clic para o