Eu tenho uma planilha Excel parecida com esta:
É possível escrever uma fórmula que acesse os níveis de agrupamento (os números marcados em vermelho)?
O problema é que temos um software que exporta uma BOM (Bill Of Materials) descrevendo, de cima para baixo, os diferentes artigos contidos em um produto mecânico.O número de agrupamento é a única maneira de saber em que nível um determinado artigo está.
Responder1
por que não tentar o script VBA de macro?
Acho que isso vai ajudar: Worksheets("Sheet1").Rows(i).OutlineLevel
Percorra a planilha e escreva essa propriedade nas células.
Responder2
Tenho exatamente a mesma situação em que desejo obter um uso adequado do nível de estrutura de tópicos gerado pelo meu aplicativo. Então, você precisa fazer um script visual básico no Excel. O editor vb-script pode ser acessado através do editor Macro. Um código típico que insere uma segunda coluna adicional que conterá o nível e depois passa por um arquivo e preenche a coluna com o nível correto pode ter a seguinte aparência:
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
Isso também pode ser estendido com outras funcionalidades. Acompanhei o nível de contorno mais alto no loop acima e criei tantas colunas adicionais quantos fossem os níveis e, em seguida, fiz alguma lógica em cada uma dessas colunas para que a estrutura do nível pudesse ser visualizada.
A inserção de colunas ficou assim (incluía uma configuração de formatação condicional que tornava as células contendo um "X" preto):
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
E, finalmente, uma sequência de loop duplo que preencheu todas as células nas colunas adicionais com uma verificação na coluna Nível e colocou um "X" na célula correta. Este código ficou assim:
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
Vejo que o belo recuo do código acima está arruinado na postagem final, mas se você estiver familiarizado com alguma codificação, deverá conseguir resolver isso da melhor maneira.
Responder3
Sim é possivel. A função GET.CELL()
ajudará.
GETCELL
é uma função especial. De fato, uma função de macro do Excel 4 e, portanto, o arquivo deve ser salvo como .xlsm-File ao usá-lo. Mais informaçõesaqui
- Defina um intervalo nomeado (por exemplo,
OutlineLevel
) na célula superior da sua planilha (por exemplo, A1) com a seguinte fórmula:=GET.CELL(28,Sheet1!A1)
- em uma coluna vazia, consulte este intervalo nomeado (
=OutlineLevel
) e copie a fórmula.
Você obterá o nível de hierarquia da linha correspondente.
Parabéns à solução proposta bastante antiga de GlennUK noFórum Mr.Excel