Pasar datos mediante un botón de una hoja a otra dependiendo del valor del dato en una columna
Tengo una hoja de excel llamada CONTROL HV con datos de muchos empleados de una compañía desde la columna A15 hasta CH15 (Nombre, Apellido, Cédula, Fecha Nacimiento, Contrato..) una de estas columnas me dice si el empleado está o no ACTIVO (la columna F) en la compañía, lo que necesito es que si el empleado está activo me pase a la Hoja "ACTIVOS" toda su información tal cual se encuentra en la Hoja CONTROL HV, y si está INACTIVO me lo pase a la hoja "INACTIVOS". Puede ser mediante un botón o puede ser automático
1 Respuesta
Es difícil darte una respuesta de modo general. Lo mejor es que me pases el libro para poder ver cuales son los datos, dónde y como se deben pasar.
Si no quieres darme datos pon algunos falsos de ejemplo con su posición en CONTROL HV y la forma como deben quedar en ACTIVOS e INACTIVOS.
Mándamelo a
Pon como asunto el título de la pregunta y si es posible por este nombre al libro
PasarMedianteBoton.XLSM (o XLSX sino tiene macros todavía)
He recibido el libro.
Hacerlo automático no es buena solución, ya que ¿cuándo se pasa la información? Si lo hacemos cuando se escribe activo o inactivo puede ser que aun no estén escritos todos los datos.
Puede ponerse un botón o puede dejarse la macro sin botón para que se ejecute a través del menú macros o puede asignarse una secuencia de teclas. Eso lo haré como me digas en la respuesta
Lo que es más importante es saber si al pasar una fila a las hojas ACTIVOS o INACTIVOS desaparece de la hoja CONTROL HV. Si no desapareciese, se tendría que comprobar antes de pasar cada uno si ya existe ese dato en la hoja que le corresponde. Supongo que la mejor forma de consultarlo sería a través del número de cédula que será irrepetible.
Aunque ahora que lo pienso, tanto de desaparece como si no, creo que será conveniente siempre comprobar si ya está para no volver a repetirlo.
Buenas tardes,
Tienes toda la razón respecto de hacerlo automático, la mejor opción sería mediante un botón en la hoja INACTIVOS y ACTIVOS que diga algo como "Actualizar".
Respecto a si debe borrarse o no, la respuesta es NO debe borrarse de la hoja CONTROL HV, pero el punto es que no podría comprobarse mediante la cédula si ya existe este dato ya que puede estar ingresada varias veces la misma persona, me explico: puede ser que se le haya acabado un contrato, pero si reingresa se vuelve a crear un nuevo registro, no es raro que una sola persona tenga más de un registro, todo depende del número de contratos que tenga. Ahora, no se si una opción podría ser recorrer la tabla de arriba hacia abajo e ir tomando los "INACTIVOS" que vayan apareciendo.
Gracias por tu ayuda!
Pues si no se borran de CONTROL HV y pueden aparecer varias veces, la mejor forma de controlar si un registro ya se ha pasado o no es hacer una marca en la hoja CONTROL HV, por ejemplo una X en la columna K, o incluso darle nombre a la columna K como TRASPASADO y escribir valores SI o NO según hayan sido traspasados ya. Sobre el botón, el lugar más adecuado lo veo en la hoja CONTROL HV.
Espero tu opinión. Aunque ahora tengo que dejar un rato el ordenador.
Esta es la macro que se introduce en un módulo de VisualBasic
Sub Traspasar() Dim FilaActi, FilaInacti, FilaUltimaControl, i, Contador As Integer Worksheets("CONTROL HV").Select FilaActi = Worksheets("ACTIVOS").Range("B" & Rows.Count).End(xlUp).Row + 1 FilaInacti = Worksheets("INACTIVOS").Range("B" & Rows.Count).End(xlUp).Row + 1 FilaUltimaControl = Worksheets("CONTROL HV").Range("B" & Rows.Count).End(xlUp).Row Contador = 0 For i = 9 To FilaUltimaControl If Range("K" & i) = "" Then Contador = Contador + 1 If Range("F" & i) = "ACTIVO" Then Worksheets("ACTIVOS").Range("B" & FilaActi & ":J" & FilaActi).Value = Range("B" & i & ":J" & i).Value FilaActi = FilaActi + 1 Else Worksheets("INACTIVOS").Range("B" & FilaInacti & ":J" & FilaInacti).Value = Range("B" & i & ":J" & i).Value FilaInacti = FilaInacti + 1 End If Range("K" & i) = "X" End If Next MsgBox ("Se han traspasado " & Str(Contador) & " registros.") End Sub
Aparte, en la hoja CONTROL HV está la macro del botón:
Private Sub CommandButton1_Click() Call Traspasar End Sub
En la columna K aparecerá una X en los registros ya pasados, si los desmarcas se volverán a pasar la próxima vez.
Y esto es todo, aunque supongo que solo es el comienzo del programa.
Hola!
Funciona perfecto hasta un determinado número de columnas.... pero tengo información hasta la columna CZ y cuando le coloco hasta esa columna ahi me saca un error "Overflow". Eso se puede arreglar?
Gracias por todo lo que me has ayudado!
Mándame un fichero de esos que te da error. Seguramente habrá que cambiar el método rápido que he usado para traspasar datos por otro basado en copiar y pegar con cambios en las hojas seleccionadas, etc.
Yo te recomendaría este método allá donde funcione, pero mándame el fichero donde falla para ver qué se puede hacer. No hace falta que el fichero sea muy grande, con pocos registros me es suficiente para probar.
Acabo de ponerme a mirarlo.
Antes de abordar ese problema querría que me dijeses un par de cosas.
En las hojas ACTIVOS e INACTIVOS están ocultas las columnas F a CZ. ¿Como podría hacer para verlas par comprobar si el traspaso es correcto.
Luego veo que algunas filas no tienen el número de cédula. Esa es la columna que elegí yo para averiguar la fila final. Si van a faltar números de cedula tendré que calcular FilaActi, FilaInacti, FilaUltimaControl a través de otra columna, supongo que la de NOMBRES no faltará en ninguna fila.
Hola!
Primero muchas gracias por tu tiempo y tu interés.
Para mostrar las columnas F a CZ le das en el botón que dice TODOS, ahí se muestran.
Respecto a la columna # de cédula siempre va a estar ese dato, la tabla la están actualizando porque son muchos registros pero siempre siempre va a tener ese valor.
Quedo atenta.
Nuevamente gracias
Ya creo que lo tengo. Es un fallo en un dato de la página en la fila 616 en la columna BL, o sea en la celda BL616. Corresponde a Mendieta Uribe INACTIVO, donde debería ir una fecha va el número 13432386 que causa desbordamiento en la fecha. Y una vez hayas corregido ese dato creo que irá bien.
No obstante he mejorado la macro para que cuando suceda un error de información de la fila donde ocurríó. Asimismo he cambiado la columna de comprobar el fin de filas a la C que es la de apellidos.
Esta es la nueva macro.
Sub Button57_Click() Dim FilaActi, FilaInacti, FilaUltimaControl, i, Contador, Hueco, Respuesta As Integer Dim Hoja As String Dim HuboError as boolean Worksheets("CONTROL HV").Select FilaActi = Worksheets("ACTIVOS").Range("C" & Rows.Count).End(xlUp).Row + 1 FilaInacti = Worksheets("INACTIVOS").Range("C" & Rows.Count).End(xlUp).Row + 1 FilaUltimaControl = Worksheets("CONTROL HV").Range("C" & Rows.Count).End(xlUp).Row Contador = 0 HuboError = False On Error GoTo FilaErronea For i = 15 To FilaUltimaControl If Range("DA" & i) = "" Then Contador = Contador + 1 If Range("F" & i) = "ACTIVO" Then Worksheets("ACTIVOS").Range("B" & FilaActi & ":CZ" & FilaActi).Value = Range("B" & i & ":CZ" & i).Value FilaActi = FilaActi + 1 Else Worksheets("INACTIVOS").Range("B" & FilaInacti & ":CZ" & FilaInacti).Value = Range("B" & i & ":CZ" & i).Value FilaInacti = FilaInacti + 1 End If If Not HuboError Then Range("DA" & i) = "X" Else HuboError = False End If End If Next On Error GoTo 0 MsgBox ("Se han actualizado " & Str(Contador) & " registros.") Exit Sub FilaErronea: If Range("F" & i) = "ACTIVO" Then Hoja = "ACTIVOS" Hueco = FilaActi Else Hoja = "INACTIVOS" Hueco = FilaInacti End If Respuesta = MsgBox("Error al traspasar la fila " & i & vbCrLf & _ "Queda hueca la fila " & Hueco & " de la hoja " & Hoja & vbCrLf & _ "¿Quiere continuar?", vbYesNo + vbCritical, "Error de traspaso") If Respuesta = vbYes Then HuboError = True Resume Next Else Rows(i).Select On Error GoTo 0 Exit Sub End If End Sub
Y eso es todo.
- Compartir respuesta
Hola este articulo es buenísimo, he buscado por todas partes y esta macro es la única que se asemeja a lo que necesito. Quiero emitir un estado de cuenta de un cliente sobre las facturas que tiene pendiente, de todo un historial facturas y pagos acumulados - Hector melendez