Organizar información de una tabla a un formato de BD

Mi propósito en excel es pasar de una información organizadas en una tabla a un formato de base de datos, el caso particular es para realizar unos informes de capacitación en donde se conjugan los temas, las personas y las fechas. En la siguiente imagen muestro como deseo organizar la información y la idea es llenar la columna Fecha.

Gracias

2 respuestas

Respuesta
3

H o l a @mauuuuu5, aquí otra macro con otro enfoque para ti para considerar:

Sub Macro1()
  With Sheets("Hoja2").Range("C2:C" & Sheets("Hoja2").Range("A" & Rows.Count).End(3).Row)
    .Formula = "=IF(INDEX(Hoja1!$B$2:$EE$60000,MATCH(A2,Hoja1!$A$2:$A$60000,0),MATCH(B2,Hoja1!$B$1:$EE$1,0))=0,""""," & _
                   "INDEX(Hoja1!$B$2:$EE$60000,MATCH(A2,Hoja1!$A$2:$A$60000,0),MATCH(B2,Hoja1!$B$1:$EE$1,0)))"
    .Value = .Value
  End With
End Sub

¡Gracias! 

Hola Dante, gracias por la macro pero tengo una duda y es por que al ejecutar la macro me sale una ventana emergente que dice Actualizar Valores. 

Gracias

A mi no me aparece ese mensaje. Qué versión de excel tienes.

Hola Dante el problema era mio y era que el nombre de la hoja1 lo tenia como sheet1,.

¿Por otro lado te pregunto sobre el pedazo final del código de la línea dos ".End(3).Row)" hace referencia a la posición de la columna Fecha en la segunda hoja?

Gracias

With Sheets("Hoja2").Range("C2:C" & Sheets("Hoja2").Range("A" & Rows.Count).End(3).Row)

El código es para indicar el rango con el que se va a trabajar.

En este caso empieza en la celda C2 de la hoja2

Sheets("Hoja2"). Range("C2

Y termina en la celda C y la última fila con datos de la columna A de la hoja2

C" & Sheets("Hoja2").Range("A" & Rows.Count).End(3).Row)

Esta parte, se utiliza para regresar un número de fila de la columna A

Sheets("Hoja2").Range("A" & Rows.Count).End(3).Row

Y se podría leer de la siguiente manera:

De la hoja2, de la celda "A" y el total de filas de la hoja, es decir: desde la celda A1048576 muévete hasta el fin de la celdas hacia arriba: .End(3) y regresa el número de fila .Row

El 3 es una clave (xlUp) para indicar que se mueva hacia arriba.

Por ejemplo, si tienes datos en la celda A53, el rango a trabajar sería:

Range("C2:C" & 53).

Realiza el siguiente ejercicio en una hoja nueva. Escribe un dato en la celda A7 y presiona enter, ahora presiona la tecla Fin y flecha hacia abajo, el cursor se posiciones en la celda A1048576 . Si ahora presionas la tecla Fin y la flecha hacia arriba, el cursor se posiciona en la celda A7.

Eso es lo que hace esta instrucción:

Range("A" & Rows.Count).End(3).Row

Va hacia abajo y luego hacia arriba y regresa el número de fila, de esa manera podemos encontrar el número de fila de la última celda con datos de la columna A.

E s p e r o, te ayude.

¡Gracias! 

Un gusto ayudarte!

Respuesta
1

Veo que no es necesario transponer datos ya que está resuelta una parte.

Te dejo una macro que recorre la primer tabla (hoja activa, desde aquí se ejecutará la macro) y vuelca las fechas en otra tabla que en mi ejemplo está en Hoja2.

Ajusta nombres de hoja, y referencias de fila/col según tu modelo.

Sub transponeFechas()
'x Elsamatilde
'hoja destino
Set ho2 = Sheets("Hoja2")
'recorre hoja activa hasta el final de col A
[A2].Select
While ActiveCell <> ""
    'busca col con fecha
    For i = 2 To 5
        If Cells(ActiveCell.Row, i) <> "" Then
            Set busco = ho2.Range("A:A").Find(ActiveCell.Value, lookat:=xlWhole)
            If Not busco Is Nothing Then
                y = busco.Row + i - 2     '*
                ho2.Cells(y, 3) = Cells(ActiveCell.Row, i)
                Set busco = Nothing
                Exit For
            End If
        End If
    Next i
    'pasa a fila sgte.
    ActiveCell.Offset(1, 0).Select
Wend
End Sub

* Le resto 2 porque empieza en col 2 y fila 2.

Sdos y no olvides valorar las respuestas si el tema queda resuelto... sino comenta y deja mayores aclaraciones.

¡Gracias!  Voy a probar la macro te agradezco mucho Elsa

Hola Elsa gracias ya lo probe y quedo perfecto solo, quisiera hacerte unas preguntas para poderlo aplicar en el formato de la "vida real". 

Te pregunto si el comando "[A2].Select" comienza en la hoja1

Te pregunto si el comando "For i = 2 To 5" se refiere a cantidad de columnas que tienen fecha

La otra pregunta es si el comando "ho2.Cells(y, 3) = Cells(ActiveCell.Row, i)" corresponde a la columna 3 en donde esta la fecha. 

Gracias

Mauricio

La macro se ejecuta desde la hoja activa o sea, en tu caso Hoja1.

1- Te pregunto si el comando "[A2].Select" comienza en la hoja1  

Rpta = SI

2- Te pregunto si el comando "For i = 2 To 5" se refiere a cantidad de columnas que tienen fecha

Rpta = Cantidad de columnas con título (nombres) a partir de col B

3- "ho2.Cells(y, 3) = Cells(ActiveCell.Row, i)"   

Rpta: con CELLS se indica (fila, col) por lo tanto 3 es col C

En cambio Range indica (columna, fila). Por ejemplo: Range("C1") o Range("B" & i)

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas