Tengo una hoja de Excel que se parece a esta:
¿Es posible escribir una fórmula que acceda a los niveles de agrupación (los números marcados en rojo)?
El problema es que tenemos un software que exporta una BOM (Bill Of Materials) que describe, de arriba hacia abajo, los diferentes artículos contenidos en un producto mecánico.El número de agrupación es la única forma de saber en qué nivel se encuentra un determinado artículo.
Respuesta1
¿Por qué no probar el script VBA de macro?
Creo que esto ayudará: Hojas de trabajo ("Hoja1"). Filas (i). Nivel de contorno
Revise la hoja y escriba esta propiedad en las celdas.
Respuesta2
Tengo exactamente la misma situación en la que quiero obtener un uso adecuado del nivel de esquema que se generó desde mi aplicación. Luego, necesitas crear un script visual básico en Excel. Se puede acceder al editor vb-script a través del editor de macros. Un código típico que inserta una segunda columna adicional que contendrá el nivel y luego revisa un archivo y llena la columna con el nivel correcto puede verse así:
Sub GetOutlineLevel()
' Initiate where to start. With a header row, typical start is row 2
RowCount = 2
' Insert a new column B, write "Level" as the title in row 1,
' and define the width of the column
Columns("B:B").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Cells(1, 2).Value = "Level"
Columns("B:B").Select
Selection.ColumnWidth = 5
' Go to the first row you want to analyze
Cells(RowCount, 1).Activate
' Make a loop to go through all lines that contains data.
' This assumes that there is a continuous row of lines that all have data in the
' first column
Do
' Fill the cell in column 2 at the current row with the outline level
Cells(RowCount, 2).Value = ActiveCell.Rows.OutlineLevel
' Go to the next row
RowCount = RowCount + 1
Cells(RowCount, 1).Activate
' Continue and stop at the first empty row
Loop Until ActiveCell.Value = ""
End Sub
Esto también se puede ampliar con otras funciones. Seguí el nivel de esquema más alto en el bucle anterior, e hice tantas columnas adicionales como niveles había y luego hice algo de lógica en cada una de estas columnas para que se pudiera visualizar la estructura de niveles.
La inserción de columnas se veía así (esto incluía una configuración de formato condicional que hacía que las celdas que contenían una "X" fueran negras):
ColumnsInserted = 0
Do
Columns("C:C").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Cells(1, 3).Value = "L" & MaxLevel - ColumnsInserted
Columns("C:C").Select
Selection.ColumnWidth = 4
Columns("C:C").Select
Selection.FormatConditions.Add Type:=xlTextString, String:="X", _
TextOperator:=xlContains
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorLight1
.TintAndShade = 0
End With
Selection.FormatConditions(1).StopIfTrue = False
ColumnsInserted = ColumnsInserted + 1
Loop Until ColumnsInserted = MaxLevel
Y finalmente, una secuencia de doble bucle que llenó todas las celdas de las columnas adicionales con una verificación de la columna Nivel y puso una "X" en la celda correcta. Este código se veía así:
FIns = 1
Do
RowCount = 2
Do
Cells(RowCount, 2 + FIns).Select
ActiveCell.FormulaR1C1 = "=IF(RC[-" & FIns & "]=" & FIns & ",""X"","""")"
RowCount = RowCount + 1
Loop Until Cells(RowCount, 1).Value = ""
FormulaInsert = FormulaInsert + 1
Loop Until FormulaInsert > MaxLevel
Veo que la buena sangría del código anterior se arruinó en la publicación final, pero si está familiarizado con algo de codificación, debería poder solucionarlo de una buena manera.
Respuesta3
Si es posible. La función GET.CELL()
ayudará.
GETCELL
es una función especial. De hecho, es una función de macro de Excel 4 y, por lo tanto, el archivo debe guardarse como archivo .xlsm cuando se usa. Más informaciónaquí
- Defina un rango con nombre (por ejemplo,
OutlineLevel
) en la celda superior de su hoja (por ejemplo, A1) con la siguiente fórmula:=GET.CELL(28,Sheet1!A1)
- en una columna vacía, consulte este rango con nombre (
=OutlineLevel
) y copie la fórmula.
Obtendrá el nivel de jerarquía para la fila correspondiente.
Felicitaciones a la solución propuesta bastante antigua de GlennUK sobre elForo Mr.Excel