Hola a todos, acudo al foro para solicitar su valioso apoyo en un problema que tengo; les explico:
Importo a Excel datos de un programa de nóminas que me arroja los datos de todos los trabajadores en forma vertical, como se muestra en la hoja “15-ABRIL-2014” del archivo “NÓMINA ACTUAL” que adjunto, lo que yo quiero es mediante una macro transponer esos datos como lo muestro en la hoja “RESULTADO” del mismo archivo.
Algunas consideraciones:
1.- El sistema de nómina exporta a Excel solo una hoja (la hoja con el nombre de la quincena) y mi deseo es crear una hoja nueva y ahí transponer los datos y dejar intactos los datos importados.
2.- El número de trabajadores es variable porque manejo varias nóminas que pueden ser hasta de 700 trabajadores.
3.- El número de percepciones y deducciones también es variable dependiendo de la empresa.
Lo que yo deseo es:
1.- Que la macro se encuentre en un archivo independiente para poder ejecutarlo al abrir cada archivo de cada quincena.
2.- Poder ejecutar esta macro en archivos con diferentes números de empleados así como diferentes números de percepciones y deducciones, esto mediante un Inputbox que me pida tanto el rango a transponer como el número de percepciones y deducciones que se repiten en cada archivo ya que como lo mencioné anteriormente son variables dependiendo de la empresa.
3.- Utilizo Excel 2007.
Anteriormente esto lo hacía con una macro que me encontré en internet, pero resulta que se actualizó el sistema de nóminas y ahora exporta los archivos de manera diferente y la macro ya no me arroja los resultados deseados.
Para que comprendan mejor lo que deseo, adjunto también como exportaba anteriormente el programa de nómina y la macro que ocupaba.
Aprecio su valiosa ayuda ya que soy principiante en esto de Excel, solo sé utilizar la macro.
Adjunto | Tamaño |
---|---|
nomina_actual.xlsx | 83.3 KB |
nomina_anterior.xlsx | 127.49 KB |
macro_anterior.xlsm | 14.32 KB |
¿los 30 conceptos que aparecen en cada trabajador, serán siempre los mismos? ¿siempre aparecen en el mismo orden para todos los trabajadores del listado?
------
Ya sé Excel, pero necesito más.
Hola Paco, gracias por responder....
Los conceptos no serán siempre los mismos, pueden ser distintos y no siempres son 30, pueden variar en número también y sí, siempre aparecen en el mismo orden para todos los trabajadores del listado.
Bueno, podrías tratar de hacer un bucle que recorriese las celdas.
El cambio de persona lo puedes detectar porque en la columna Concepto no está vacía, hay un guión, eso querría decir que tendrías que cambiar de fila.
Se me ocurre por ejemplo lo siguiente (tendrías que añadir la comprobación para situarte en la hoja con los datos, o podrías hacer algo parecido a tu macro anterior, preguntando al usuario)
'Defino unas constantes para decirle en qué columna está cada dato, así si vuelven a cambiar el formato será más sencillo adaptarlo
Const columnaconcepto = 1
Const columnatabajador = 2
Const columnaacumulado = 3
Const filaprimerdato = 2
'Defino también a partir de qué celda quiero empezar a poner los datos en la hoja de destino
Const celdaprimerdatotranspuesto = "A1"
'Definimos unas variables para las hojas de origen y destino:
Dim hojadatos As Worksheet, hojaresultado As Worksheet
'y unos contadores para colocar los datos en destino
Dim contadorfilas, contadorcolumnas
Set hojadatos = ActiveSheet
Set hojaresultado = ActiveWorkbook.Worksheets.Add 'creo una nueva hoja para poner los datos
hojadatos.Activate
Cells(filaprimerdato, columnaconcepto).Select
contadorfilas = 0
contadorcolumnas = 0
Do Until IsEmpty(ActiveCell.Offset(0, 1)) 'recorremos la hoja activa hasta que no haya nada en la columna de la derecha (la 2)
If Not IsEmpty(ActiveCell) Then
'si no está activa la celda activa (en la columna 1) es qeu tenemos un nuevo nombre de trabajador
' en este caso aumentamos el contador de filas en uno y ponemos a cero el contador de columnas
contadorfilas = contadorfilas + 1
contadorcolumnas = 0
' y copiamos el dato de la columna trabajador (el nombre del trabajador en la posición (contadorfilas,contadorcolumnas)
hojaresultado.Range(celdaprimerdatotranspuesto).Offset(contadorfilas, contadorcolumnas).Value = ActiveCell.Offset(0, columnatabajador - columnaconcepto).Value
Else 'si no, es un dato de detalle, copiamos el dato de la columna acumulado
hojaresultado.Range(celdaprimerdatotranspuesto).Offset(contadorfilas, contadorcolumnas).Value = ActiveCell.Offset(0, columnaacumulado - columnaconcepto).Value
If contadorfilas = 1 Then
'la primera vez, copiamos el encabezado
hojaresultado.Range(celdaprimerdatotranspuesto).Offset(contadorfilas - 1, contadorcolumnas).Value = ActiveCell.Offset(0, columnatabajador - columnaconcepto).Value
End If
End If
' aumentamos el contador de columnas para el siguiente dato
contadorcolumnas = contadorcolumnas + 1
' y ativamos la celda de abajo
ActiveCell.Offset(1, 0).Select
Loop
------
Ya sé Excel, pero necesito más.
Hola Paco, chequé el archivo adjunto y es exactamente lo que necesito, eres grande......muchas gracias por tomarte el tiempo para reponder y compartir tus conocimientos.
Por mi parte doy por cerrado el tema.
[comentario duplicado en tema http://www.necesitomas.com/transponer-celdas]
Hola en myexceltools.com hay producto llamado Spreadsheet image tools... instalarlo y prueba el botón transponer...sirve para varias filas y columnas como formula
Saludos