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

Respuesta
2

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

[email protected]

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.

Me parece muy bien ....

Quedo pendiente a tu respuesta

Gracias por tu ayuda!

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.

Hola, te envié el archivo!

Quedo pendiente...

Gracias!!!

Pues no me ha llegado el ni el fichero ni el e-mail. Mándalo de nuevo.

Hola!

Te lo acabo de reenviar...

Gracias!!!!!

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.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas