Recuentos transpuestos para muchas columnas.

Recuentos transpuestos para muchas columnas.

La entrada:

Aporte

Tengo que contar el número de '1' y '0' en cada columna de esta manera:

Rendimiento esperado

¿Hay alguna forma en Excel/macro de hacer esto?

Respuesta1

Si decimos que las columnas comienzan en "D1"e imprimimos hasta "A3", podría verse así:

Sub countAndTranspose()
Dim section As Range, count As Range, entry As Range, sectionPrint As Range

Set section = Range("D1", Cells(1, Columns.count).End(xlToLeft)) 'All headers
For Each entry In section
    Set sectionPrint = Cells(Rows.count, 1).End(xlUp) 'Last row in "A"
    Set count = Range(Cells(entry.Row + 1, entry.Column), Cells(Rows.count, entry.Column).End(xlUp))
    sectionPrint.Offset(1).Value = entry.Value 'Print header below last row in A
    sectionPrint.Offset(1, 1).Value = WorksheetFunction.CountIf(count, 1) 'Print sum of 1
    sectionPrint.Offset(1, 2).Value = WorksheetFunction.CountIf(count, 0) 'Print sum of 0
Next entry

End Sub

Comenzamos definiendo nuestro rango de columnas, comenzando "D1"y yendo hacia la luz más alejada de la fila.
Luego recorremos este rango y elegimos dónde imprimir el nombre de la columna (A3 y abajo deben estar VACÍOS)

ingrese la descripción de la imagen aquí

Respuesta2

Solución de consulta de energía de Excel

Resultado:
ingrese la descripción de la imagen aquí


Para profesionales- procedimiento completo:

let
    Source = Excel.CurrentWorkbook(),
    #"Expanded Content" = Table.ExpandTableColumn(Source, "Content", {"OPERATION", "MEDIA", "IT"}, {"OPERATION", "MEDIA", "IT"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded Content",{"Name"}),
    #"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Removed Columns", {}, "Attribute", "Value"),
    #"Grouped Rows" = Table.Group(#"Unpivoted Columns", {"Attribute", "Value"}, {{"Count", each Table.RowCount(_), type number}}),
    #"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(#"Grouped Rows", {{"Value", type text}}, "en-US"), List.Distinct(Table.TransformColumnTypes(#"Grouped Rows", {{"Value", type text}}, "en-US")[Value]), "Value", "Count", List.Sum),
    #"Replaced Value" = Table.ReplaceValue(#"Pivoted Column",null,0,Replacer.ReplaceValue,{"Attribute", "1", "0"})
in
    #"Replaced Value"

Para otros- pasos detallados.

Seleccione su tabla de datos de entrada (incluidos los encabezados).
Insertar -> Tabla

ingrese la descripción de la imagen aquí

DE ACUERDO

ingrese la descripción de la imagen aquí

Haga clic en las flechas dobles junto a "Contenido"
DesmarqueUtilice el nombre de la columna original como prefijo

ingrese la descripción de la imagen aquí

DE ACUERDO

Haga clic derecho en la columna "Nombre" -> Eliminar

Seleccione toda la tabla
Transformar -> Desvincular columnas

ingrese la descripción de la imagen aquí

Inicio -> Agrupar por

ingrese la descripción de la imagen aquí

DE ACUERDO

Seleccione la columna "Valor"
Transformar -> Columna dinámica
como columna de valores seleccione "Contar"

ingrese la descripción de la imagen aquí

DE ACUERDO

ingrese la descripción de la imagen aquí

Seleccione toda la tabla
Transformar -> Reemplazar valores
Complete así:

ingrese la descripción de la imagen aquí

DE ACUERDO

Inicio -> Cerrar y cargar

Respuesta3

Debajo de las entradas de las columnas de OPERACIÓN, MEDIOS y TI, ingrese dos fórmulas:

COUNTIF ( A2:A10, 1 )por unos
COUNTIF ( A2:A10, 0 )por ceros.

Copie las fórmulas debajo de MEDIOS y TI.

Respuesta4

Para una solución que no sea VBA, puede aprovechar LET si tiene Excel 2016 o Microsoft 365. Esto también funcionará en Excel para Mac (a diferencia de Power BI).

=LET( array, A1:E4,
       hdr, INDEX( array, 1, ),
       rSeqBody, SEQUENCE( ROWS( array ) - 1 ),
       cSeq, SEQUENCE( 1, COLUMNS( array ) ),
       body, INDEX( array, rSeqBody + 1, cSeq ),
       onesCount, MMULT( TRANSPOSE( SIGN( rSeqBody ) ), body ),
       t1s, IFERROR( INDEX( TRANSPOSE( hdr ), TRANSPOSE( cSeq ), {1,2} ), TRANSPOSE( onesCount ) ),
       t10s, IFERROR( INDEX( t1s, TRANSPOSE( cSeq ), {1,2,3} ), ROWS( body ) - TRANSPOSE( onesCount ) ),
       t10s )

Esta es una aplicación de ejemplo: captura de pantalla

Donde la entrada es la matriz, incluida la fila del encabezado con los nombres de los campos y la salida es una matriz dinámica que se extiende a las celdas de abajo y una columna a la derecha.

Cómo funciona

Primero obtiene los nombres de los campos y los coloca en una matriz llamadahdr. Luego crea secuencias de filas y columnas para calcular y dar forma a los resultados. Luego crea una matriz que contiene los 1 y 0 llamadacuerpo. Luego suma los 1 por columna enunos cuentanusando una multiplicación de matrices.

Esto sin contar los 1. Es aprovechar que se pueden sumar. Si fuera un símbolo, como "x", no funcionaría. Del mismo modo, los ceros no se cuentan, sino que simplemente se calculan a partir de los unos.

Para entregar el resultado, une el hdr.(transpuesto)sobre los unosCuenta(transpuesto)sobreindexando las columnas del hdr transpuesto para forzar errores en la columna 2 de cada fila, luego usa IFERROR para reemplazar los errores !REF# con los onesCount transpuestos.

Esto se repite una vez más para agregar una columna de recuento de 0 que se calcula restando el recuento de 1 del número de filas en la columna.cuerpo.

Si desea el encabezado 1COUNT y 0COUNT, también puede coserlo, pero probablemente sea más fácil escribirlo en la hoja de trabajo con el texto que desee.

Esto también es posible sin LET, pero es complicado y difícil de depurar. LET brinda claridad y elimina la necesidad de células auxiliares.

información relacionada