Utilizar macro para dos hojas distintas Excel vba

Estoy necesitando que una macro la pueda utilizar tanto en una hoja de "ENTRADAS" y otra de "SALIDAS" ambas tiene una columna oculta con el tipo de movimiento.

1 respuesta

Respuesta
2

Revisa lo siguiente y comentas

Sub Actualizar()
    Dim ultLinea As Long, u As Long, ultLineaDatos As Long
    Dim codigo As String, cantidad As Long, movimiento As String
    Dim posicion As String, ordenpicking As String
    Dim busquedaFilaDatos As Range
    Dim rangoBusqueda As String
    Dim filaRegistro As Long
    Dim x As Integer
    '
    Dim h1 As Object, h2 As Object
    'validar que los campos tengan la info necesaria
    Set h1 = Sheets("PICKING")
    'Set h2 = Sheets("Control de Stock")
    u = h1.Range("A" & Rows.Count).End(xlUp).Row
    For i = 5 To u
        codigo = h1.Cells(i, 1)
        cantidad = h1.Cells(i, 2)
        movimiento = h1.Cells(i, 3)
        posicion = h1.Cells(i, 4)
        ordenpicking = h1.Cells(i, 6)
        If movimiento = "Entradas" Then
            Set h2 = Sheets("Entradas")
        Else
            Set h2 = Sheets("Salidas")
        End If
        'Actualizar entrada de datos
        ultLineaDatos = h2.Range("B" & Rows.Count).End(xlUp).Row
        rangoBusqueda = "B11:B" & ultLineaDatos
        Set busquedaFilaDatos = h2.Range(rangoBusqueda).Find(posicion, lookat:=xlWhole)
        If busquedaFilaDatos Is Nothing Then
            'MsgBox "El posición ingresada no existe", vbCritical, "Resultado"
            'Exit Sub
        Else
            filaRegistro = busquedaFilaDatos.Row
            If movimiento = "Entradas" Then
                h2.Cells(filaRegistro, 3) = h2.Cells(filaRegistro, 3) + cantidad
            Else
                h2.Cells(filaRegistro, 3) = h2.Cells(filaRegistro, 3) - cantidad
            End If
        End If
    Next
    'Limpiar datos
    h1.Range("A5:C" & u).Value = ""
    MsgBox "Actualización Exitosa", vbInformation, "Resultado"
    Range("A5").Select
End Sub

.

.Sal u dos. Dante Amor. No olvides valorar la respuesta. G raci as

.

Gracias por la info Dante! Hay algo que hay que modificar en el código, las hojas activas que tengo en el libro son Control de Stock, ENTRADAS y la otra es SALIDAS. La de PICKING la reemplace por entradas y salidas, hay algo en el codigo que no me esta andando

Te envía un mensaje de error, ¿qué dice?

¿En qué línea se detiene la macro?

La estructura de la hojas "control de stock", ¿entradas y salidas son iguales?

Se detiene en esta línea:

¿Querés qué te la envíe por mail? Las hojas entradas y salidas son iguales, Control de Stock no

 Set h1 = Sheets("PICKING")

¿Y ahora cómo se llama tu hoja donde capturas?

Antes se llamaba "picking"

Solamente cambia "picking" por el nombre que tienes ahora.

Si las estructuras de las hojas son diferentes, entonces tienes que explicar, en dónde vas a capturar y en dónde vas poner el resultado

Antes sumas la cantidad para las entradas y restabas para las salidas, pero ahora qué quieres hacer.

Donde capturo datos se llama ENTRADAS y otra de las hojas se llama SALIDAS, las 2 tienen la misma estructura. Hay posibilidad de ejecutar la macro en una hoja cambiandole en el código donde dice PICKING por entradas, y en la otra hoja lo mismo pero por SALIDAS??

Me lo imaginé al revés, mejor envíame tu archivo para revisar si se puede con una macro o con dos.

Mi correo [email protected]

Gracias Dante!! Ya te lo acabo de enviar.

Saludos 

Dante pudiste ver algo?? Estoy bastante apretada con el tiempo, por eso mi insistencia.

Gracias

Te anexo la macro actualizada

Sub Actualizar()
    Dim ultLinea As Long, u As Long
    Dim ultLineaDatos As Long
    Dim codigo As String, cantidad As Long, movimiento As String
    Dim posicion As String, ordenpicking As String
    Dim busquedaFilaDatos As Range
    Dim rangoBusqueda As String
    Dim filaRegistro As Long
    Dim x As Integer
    Dim h1 As Object, h2 As Object
    '
    'validar que los campos tengan la info necesaria
    Set h1 = ActiveSheet
    Set h2 = Sheets("Control de Stock")
    u = h1.Range("A" & Rows.Count).End(xlUp).Row
    For i = 5 To u
        codigo = h1.Cells(i, "A")
        cantidad = h1.Cells(i, "B")
        'movimiento = h1.Cells(i, 3)
        posicion = h1.Cells(i, "C")
        ordenpicking = h1.Cells(i, "E")
        '
        'Actualizar datos
        ultLineaDatos = h2.Range("B" & Rows.Count).End(xlUp).Row
        rangoBusqueda = "B11:B" & ultLineaDatos
        Set busquedaFilaDatos = h2.Range(rangoBusqueda).Find(posicion, lookat:=xlWhole)
        If busquedaFilaDatos Is Nothing Then
            MsgBox "La posición ingresada no existe", vbCritical, "Resultado"
            Exit Sub
        Else
            filaRegistro = busquedaFilaDatos.Row
            If ActiveSheet.Name = "PICKING IN" Then
                h2.Cells(filaRegistro, 3) = h2.Cells(filaRegistro, 3) + cantidad
            Else
                h2.Cells(filaRegistro, 3) = h2.Cells(filaRegistro, 3) - cantidad
            End If
        End If
    Next
    'Limpiar datos
    h1.Range("A5:B" & u).Value = ""
    MsgBox "Actualización Exitosa", vbInformation, "Resultado"
    Range("A5").Select
End Sub

sal u dos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas