Pregunta

Tengo una fila de datos de la siguiente manera:

            header1      header2      header3      header4      header5
row key     datavalue1   datavalue2   datavalue3   datavalue4   datavalue5....

así que, básicamente, tengo un conjunto de datos sin normalizar donde el datavalues puede o no puede estar vacío en una fila por fila.Necesito normalizar ellos.

es decir

12345678    NULL         10           3            NULL         14

sería:

12345678   header2   10
12345678   header3   3
12345678   header5   14

Yo podría hacer esto mediante el uso de una pasta especial transformar, pero tengo miles de filas y que iba a necesitar para asegurarse de que obtener el derecho de la fila de clave para cada uno.además, cada fila tiene un montón de descriptives asociados con él que necesito copiado con cada valor de datos.

¿Cuál es la forma más fácil de convertir cada fila de columnas que tengo varias filas de una sola columna con todos los no-vacío datavalues además de los asociados datavalue de referencia?Tengo que ser capaz de girar el conjunto de datos.

¿Fue útil?

Solución

Si usted tiene cinco columnas "cabecera", introducir estas fórmulas

H1: =OFFSET($A$1,INT((ROW()-1)/5)+1,0)
I1: =OFFSET($A$1,0,IF(MOD(ROW(),5)=0,5,MOD(ROW(),5)))
J1: =INDEX($A$1:$F$9,MATCH(H1,$A$1:$A$9,FALSE),MATCH(I1,$A$1:$F$1,FALSE))

Copiar H1: J ?? y pegar valores especiales sobre la parte superior. Ordenar en la columna J y nada de eliminación que es un cero. Si tiene ceros en el legitmate datos, entonces primero tiene que reemplazar las células en blanco con un poco de cadena única que luego se puede eliminar más tarde.

Si usted tiene más columnas, luego vuelva a colocar las '5' en todas las fórmulas anteriores con cualquier número que tiene.

Otros consejos

Me parece que parte de lo que usted está tratando de hacer es "de-pivote" una tabla dinámica. He encontrado este consejo para ser una gran ayuda cuando he tenido que hacer tareas similares: http://spreadsheetpage.com/index.php/tip/creating_a_database_table_from_a_summary_table/

Tenga en cuenta que en Excel 2007, se puede llegar a la vieja tabla dinámica de Excel 2003 utilizando el asistente de pulsaciones de teclas Alt + D, P.

Excel tiene una función de transposición que puede hacer frente a sus necesidades. Es bastante oculto y un poco torpe, pero probablemente más fácil que profundizar en VBA. He aquí un extracto de la Ayuda de Excel 2007:

  

cita en bloque   Switch (transposición) columnas y filas   Mostrar todoOcultar todo   Si se introducen los datos en columnas o filas, pero que desea reorganizar esos datos en filas o columnas en cambio, puede transponer rápidamente los datos de uno a otro.

Por ejemplo, los datos de ventas regionales que se organizan en columnas aparece en filas después de la transposición de los datos, como se muestra en los siguientes gráficos.

1.En la hoja de cálculo, haga lo siguiente: Para reorganizar los datos de columnas a filas, seleccione las celdas de las columnas que contienen los datos. Para reorganizar los datos de las filas de columnas, seleccione las celdas en las filas que contienen los datos. 2.En la ficha Inicio, en el grupo Portapapeles, haga clic en Copiar.

atajo de teclado para copiar los datos seleccionados, también puede pulsar CTRL + C.

Nota Sólo se puede utilizar el comando Copiar para reorganizar los datos. Para completar este procedimiento con éxito, no utilice el comando Cortar.

3.En la hoja de cálculo, seleccione la primera celda de las filas o columnas de destino en los que desea reordenar los datos copiados.  Nota La copia áreas (área de copia:.. Las células que se copian cuando se quiere pegar datos en otra ubicación Después de copiar las células, un movimiento aparece borde alrededor de ellos para indicar que han sido copiados) y pegar áreas (área de pegado: el punto de destino para los datos que se han cortado o copiado mediante el Portapapeles de Office.) no se pueden superponer. Asegúrese de que selecciona una celda en un área de pegado que se halle fuera de la zona desde la que copió los datos.

4.En la pestaña Inicio, en el grupo Portapapeles, haga clic en la flecha debajo de la goma y, a continuación, haga clic en la transposición. 5. Después de que los datos se incorporó con acierto, puede eliminar los datos en el área de la copia.  Consejo Si las celdas que contienen fórmulas transpuesta, las fórmulas se transponen y referencias de celda a datos en celdas transpuestas se ajustan automáticamente. Para asegurarse de que las fórmulas siguen haciendo referencia correctamente a los datos de las celdas nontransposed, utilizan referencias absolutas en las fórmulas antes de que los transponer.

Para más información, véase Cambiar entre referencias relativas, absolutas, y mixtas.

  

Blockquote

Echemos un vistazo a una posible solución en VBA. Creo que esto realmente va a ayudar. Aquí hay algunas cosas que usted debe saber acerca de mi código.

  • Usted tendrá que poner este código en un módulo de código en VBA (el mismo lugar donde van macros)
  • Mira lo que puse el nombre de las hojas: Original y normalizada. Ya sea que usted desea cambiar sus nombres de las hojas o el código
  • estoy comprobación de valores con un campo de cadena de NULL. Si la celda está vacía, usted querrá comprobar If IsEmpty(rngCurrent.Value) Then lugar.

'

Sub NormalizeSheet()
Dim wsOriginal As Worksheet
Dim wsNormalized As Worksheet
Dim strKey As String
Dim clnHeader As Collection
Dim lngColumnCounter As Long
Dim lngRowCounterOriginal As Long
Dim lngRowCounterNormalized As Long
Dim rngCurrent As Range
Dim varColumn As Variant

Set wsOriginal = ThisWorkbook.Worksheets("Original")     'This is the name of your original worksheet'
Set wsNormalized = ThisWorkbook.Worksheets("Normalized") 'This is the name of the new worksheet'
Set clnHeader = New Collection

wsNormalized.Cells.ClearContents        'This deletes the contents of the destination worksheet'

lngColumnCounter = 2
lngRowCounterOriginal = 1
Set rngCurrent = wsOriginal.Cells(lngRowCounterOriginal, lngColumnCounter)

' We'll loop through just the headers to get a collection of header names'
Do Until IsEmpty(rngCurrent.Value)
    clnHeader.Add rngCurrent.Value, CStr(lngColumnCounter)
    lngColumnCounter = lngColumnCounter + 1
    Set rngCurrent = wsOriginal.Cells(lngRowCounterOriginal, lngColumnCounter)
Loop

'Here we'll reset our Row Counter and loop through the entire data set'
lngRowCounterOriginal = 2
lngRowCounterNormalized = 1
lngColumnCounter = 1

Do While Not IsEmpty(wsOriginal.Cells(lngRowCounterOriginal, lngColumnCounter))

    Set rngCurrent = wsOriginal.Cells(lngRowCounterOriginal, lngColumnCounter)
    strKey = rngCurrent.Value ' Get the key value from the current cell'
    lngColumnCounter = 2

    'This next loop parses the denormalized values for each row'
    Do While Not IsEmpty(wsOriginal.Cells(lngRowCounterOriginal, lngColumnCounter))
        Set rngCurrent = wsOriginal.Cells(lngRowCounterOriginal, lngColumnCounter)

        'We're going to check to see if the current value'
        'is equal to NULL. If it is, we won't add it to'
        'the Normalized Table.'
        If rngCurrent.Value = "NULL" Then
            'Skip it'
        Else
            'Add this item to the normalized sheet'
            wsNormalized.Range("A" & lngRowCounterNormalized).Value = strKey
            wsNormalized.Range("B" & lngRowCounterNormalized).Value = clnHeader(CStr(lngColumnCounter))
            wsNormalized.Range("C" & lngRowCounterNormalized).Value = rngCurrent.Value
            lngRowCounterNormalized = lngRowCounterNormalized + 1
        End If

        lngColumnCounter = lngColumnCounter + 1
    Loop
    lngRowCounterOriginal = lngRowCounterOriginal + 1
    lngColumnCounter = 1    'We reset the column counter here because we're on a new row'
Loop



End Sub

Me gustaría crear una macro VBA que recorre cada fila y dar salida a los datos a otra página. Esto permitirá crear la tabla dinámica en la nueva página una vez que los datos han sido outputed.

No está seguro de cómo usted está familiarizado con VBA, pero esto podría ser muy fácilmente mediante la carga de los datos en una matriz (o colección de objetos si realmente quiere hacerlo correctamente) y escribirlo ir hacia atrás.

Aquí hay un enlace a un buen documento de VBA.

http: // sociales .msdn.microsoft.com / foros / en / isvvba / hilo / d712dbdd-c876-4fe2-86d2-7d6323b4262c

Editar

Tenga en cuenta que esto no pretende ser una solución completamente de trabajo, pero en realidad un marco genérico para ayudarle en la dirección correcta.

Como un ejemplo genérico que hace un montón de lo que tendría que hacer (no la mejor manera, pero probablemente el más fácil para un beginer), algo como esto debe empezar, aunque es difícil de decir sin ver más de la hoja de trabajo.

Sub RowsToColumns ()
  Application.ScreenUpdating = False
  Dim srcWrkSheet As Worksheet
  Dim destWrkSheet As Worksheet
  Dim excelData as pExcelData
  Dim srcRowNumber As Long
  Dim srcRolNumber As Long
  Dim destRowNumber As Long
  Dim destColNumber As Long

  SET srcWrkSheet = Sheets("YourSourceWorkSheetName")
  SET destWrkSheet = Sheets("YourDestinationWorkSheetName")

  srcRowNumber = 1
  srcColNumber = 1
  destRowNumber = 1
  destColNumber = 1

  'Loop until blank row is encountered in column 1
  Do
    destWrkSheet.Cells(destRowNumber ,1).Value = "Header 1 " & srcWrkSheet.Cells(srcRowNumber,srcColNumber )
    destWrkSheet.Cells(destRowNumber ,1).Value = "Header 2 " & srcWrkSheet.Cells(srcRowNumber ,srcColNumber)

    srcRowNumber = srcRowNumber + 1
    srcColNumber = srcColNumber + 1
    destRowNumber = destRowNumber  + 1
  Loop Until srcWrkSheet .Cells(rowNumber, 1).value = ""

End Sub
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top