Saltar al contenido

Macro para trabajo repetitivo


Recommended Posts

publicado

Hola amigos.

Necesito asesoramiento con una macro para realizar un trabajo repetitivo.

Se trata de seleccionar la celda activa del cursor, que siempre será en la misma columna pero en distintas líneas cada vez, y realizar una serie de acciones (combinar celdas, aplicar referencia fija, insertar línea, borrar formato y agrupar líneas).

Saludos.

trabajo repetitivo.xlsx

publicado

Hola trate de seguir los puntos pero el resultado fue extraño, te dejo una sentencia que intenta hacer lo que dices aunque tengo dudas que desglosare por partes para ser lo más claro posible.

Inserta un módulo:

Sub Macro1()
    Dim fila As Integer
    fila = InputBox("Ingresa el número de fila")
    Range("A" & fila & ":B" & fila).Select
    With Selection
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = True
    End With
    Selection.Offset(1, 0).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    Range("A" & fila + 1 & ":D" & fila + 1).Select
    Selection.ClearFormats
    Range("A" & fila & ":B" & fila + 1).Select
    With Selection
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = True
    End With
End Sub

 

publicado

Primera duda:

Cita

1. Selecccionar la celda activa del cursor, siempre en la columna A pero en líneas variables. (p.e. A1 y después A5)

De que siempre sea en la columna A es posible, pero para saber la fila hay que "decirle" a la sentencia cuál, pudiera ser la que este seleccionada pero hay detalles ¿Cómo ejecutaras el VBA? Por botón, eso mueve el cursor. ¿Por combinación de teclas? Así que ante la duda puse un mensaje donde le indicas que fila es.

publicado

Segunda duda:

Cita

3. Aplicar a la celda resultante la función de la tecla F4 para quedar como referencia fija. (p.e. $A$1)

Aquí no entendí muy bien, yo entiendo como referencia absoluta cuando una celda "apunta" a otra, entiendo que en este caso a las que se acaban de agrupar ¿Pero cual es esa celda que apuntara? También le podemos dar un nombre, para que ante la incógnita se puede usar ese rango.

publicado

Gracias por tu aporte, Israel.

Lo primero que intenté fue grabar una macro paso a paso. Pero siempre actuaba sobre la misma celda. De ahí mi petición de ayuda y la referencia a "la celda activa del cursor".

Respecto a tus dudas:

1ª. La idea es que la macro se active mediante un botón.

2ª. La referencia ya estará indicada en la celda. Lo que falta es hacerla "referencia fija" añadiendo el símbolo "$".

Respecto a tu código, podría servir, pero...

Lo ideal sería que actuase sobre la celda marcada por el cursor, pero puede valer indicarle la celda como tu haces.  El problema es que creo que confundes dos pasos: 

Uno es COMBINAR celdas (A1+B1)

Otro es AGRUPAR líneas (A1+A2).

Lo que hace tu macro es COMBINAR el rango A1:B2 (A1, B1, A2, B2)

Gracias.

publicado

Espero haber entendido ahora:

Sub Macro1()
    Dim fila As Integer
    fila = ActiveCell.Row
    Range("A" & fila & ":B" & fila).Select
    With Selection
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = True
    End With
    Selection.Offset(1, 0).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    Range("A" & fila + 1 & ":D" & fila + 1).Select
    Selection.ClearFormats
    Range("A" & fila & ":B" & fila + 1).Select
    
    Rows(fila & ":" & fila + 2).Group
    
End Sub

Este lo puedes agregar a un botón.

publicado
hace 36 minutos , home can dijo:

2ª. La referencia ya estará indicada en la celda. Lo que falta es hacerla "referencia fija" añadiendo el símbolo "$".

De ese punto lo lamento, no termino de entenderlo. Puedo hacerla absoluta sí como bien dices con F4, pero eso es cuando la indico dentro de una función en otra celda que ese valor es fijo. No es que tenga seleccionada la celda y al darle F2 para editar la convierta en fija, ahí es donde me pierdo.

Saludines.

publicado

Israel,

Esto mejora. Cambiando un par de conceptos sin importancia en las instrucciones funciona mejor. Pero hay algo que no consigo.

Hace correctamente el borrado de formato en la línea insertada, pero también borra el formato de la "celda activa". ¿Se puede modificar esto? Con ello, dejando de lado el asunto de la referencia fija, haría el trabajo requerido.

Gracias.

 

publicado

Si. Conste que el error estaba en mi hoja. Tu código funciona a la perfección.

Gracias Israel.

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Current Donation Goals

    • Raised 0.00 EUR of 130.00 EUR target
  • Archivos

  • Estadísticas de descargas

    • Archivos
      188
    • Comentarios
      98
    • Revisiones
      29

    Más información sobre "Cambios en el Control Horario"
    Última descarga
    Por pegones1

    4    1

  • Crear macros Excel

  • Mensajes

    • Buenos días  @LeandroA espero estes bien Tengo un caso idéntico al planteado en la siguiente pregunta: Sin embargo, a diferencia de quien planteo originalmente la pregunta al correr el código no obtengo ningún resultado podrían ayudarme a resolver este inconveniente y que al hacer click en el Botón Guardar (CommandButton3) del Formulario RCS (frmrcs) el archivo pdf quede configurado con orientación vertical, márgenes superior, inferior, derecho e izquierdo = 1 y en página tamaño carta. Si acaso influye uso Microsoft Excel LTSC MSO (versión 2209 Compilación16.0.1.15629.20200) de 64 bits Mucho le sabre agradecer la ayuda que me pueda dar  RCS PRUEBA - copia.xlsm
    • @JSDJSDCon gusto mi estimado Para la opción 1: Sub Surtirhastadondealcanse() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 4 Dim filaFin As Integer: filaFin = 7 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Else solicitudes(i) = 0 End If surtido(i) = "POR FALTA STOCK" Next i ' Surtir de acuerdo al inventario disponible For i = 1 To numClientes If solicitudes(i) > 0 Then If inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) ElseIf inventario > 0 Then surtido(i) = inventario totalSurtido = totalSurtido + inventario inventario = 0 Else surtido(i) = "POR FALTA STOCK" End If End If Next i ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = "POR FALTA STOCK" Then .Value = surtido(i) .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Para la opción 2:   Sub surtirenpartesiguales() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 13 Dim filaFin As Integer: filaFin = 16 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 Dim totalPedido As Double: totalPedido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) totalPedido = totalPedido + solicitudes(i) Else solicitudes(i) = 0 End If surtido(i) = 0 Next i ' Si hay suficiente inventario, surtir lo que el cliente pide If inventario >= totalPedido Then For i = 1 To numClientes If solicitudes(i) > 0 And inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) End If Next i Else ' Reparto base igualitario Dim baseSurtido As Long baseSurtido = Int(inventario / numClientes) For i = 1 To numClientes If solicitudes(i) > 0 Then If solicitudes(i) <= baseSurtido Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) Else surtido(i) = baseSurtido inventario = inventario - baseSurtido totalSurtido = totalSurtido + baseSurtido End If End If Next i ' Repartir sobrante restante uno por uno, respetando lo pedido Do While inventario > 0 For i = 1 To numClientes If surtido(i) < solicitudes(i) Then surtido(i) = surtido(i) + 1 totalSurtido = totalSurtido + 1 inventario = inventario - 1 If inventario = 0 Then Exit For End If Next i Loop End If ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = 0 Then .Value = "POR FALTA STOCK" .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Saludos, Diego
    • Buenos dias.  Estoy trabajando en una hoja para poder llevar un control de un pequeño almacén.  Tengo un pedido con varias líneas y "lotes" y necesito sacar las ubicaciones que coincidan con la referencia y lote que pone en el pedido. El problema viene cuando tengo la misma referencia y mismo lote en ubicaciones diferentes y necesito sacar la información en columnas diferentes. No se si  me he explicado bien, pero creo que con el ejemplo adjunto se entiende mejor. Agradecería mucho si me pudieran ayudar  Libro1.xlsx
    • Exelente solución mil gracias 
    • Podrías compartir tu solucion
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.