Boa tarde,
Depois de olhar o arquivo com as fórmulas na validação cheguei a uma solução alternativa.
A rotina pesquisa o “Código” da coluna “A”, “H” ou “O” da planilha que dispara o evento (Ex. “2014”) no intervalo “cód” na planilha “BD”. Então, retorna os valores (Grupo, Categoria, Subcategoria, Destinação) correspondentes nas colunas “dependentes”: “C:F”, “J:M” ou “Q:T”. Com isso, não há necessidade de colocar os meses um abaixo do outro.
Para funcionar, a macro deve ser associado ao evento de planilha “Conteúdo alterado”.
- Botão direito do mouse sobre a Aba da planilha >>> “Eventos de planilha…” >>> evento “Conteúdo alterado” >>> botão “Macro”.
Código:
REM >>> Evento de Planilha => Conteúdo Alterado <<<
Sub Conteudo_alterado( oCel )
Dim oCodigo As Object, oBD As Object, oPlan As Object
Dim nL As Long, nC As Long, nInicio As Long, nFim As Long, I As Long
Dim sColuna As String, sCod as String
' Sair se o Evento não for sobre uma célula individual
If oCel.ImplementationName <> "ScCellObj" Then Exit Sub
' Sair se não for a coluna A, H ou O
sColuna = oCel.Columns.ElementNames(0)
If sColuna <> "A" And sColuna <> "H" And sColuna <> "O" Then Exit Sub
' Sair se a célula estiver vazia
If oCel.String = "" Then Exit Sub
' Intervalo "cód" e sua planilha
oCodigo = ThisComponent.NamedRanges.getByName( "cód" ).ReferredCells
oBD = oCodigo.getSpreadSheet
' Planila do evento
oPlan = oCel.getSpreadSheet
' A linha e a coluna inicial que receberão os valores
nL = oCel.CellAddress.Row
nC = oCel.CellAddress.Column + 2
'Loop pelo intervalo "cód"
nInicio = oCodigo.RangeAddress.StartRow
nFim = oCodigo.RangeAddress.EndRow
For I = nInicio to nFim
sCod = oBD.getCellByPosition( 0,I ).String 'código
If sCod = oCel.String Then 'Preencher as colunas se encontrar o código
oPlan.getCellByPosition( nC,nL ).String = oBD.getCellByPosition( 1,I ).String 'Grupo
oPlan.getCellByPosition( nC+1,nL ).String = oBD.getCellByPosition( 3,I ).String 'Categoria
oPlan.getCellByPosition( nC+2,nL ).String = oBD.getCellByPosition( 5,I ).String 'Subcategoria
oPlan.getCellByPosition( nC+3,nL ).String = oBD.getCellByPosition( 7,I ).String 'Destinação
End If
Next
End Sub
Arquivo com o Código acima:
Atte,
Grafeno