Macro para auto selecionar validação com fórmula mediante condição

Olá pessoal
Tentei gravar uma macro que auto selecionasse o primeiro item de cada lista de validação da coluna C:F, porém o gravador de macros não escreveu o código completo, me retornando com erro:

rem ----------------------------------------------------------------------

rem dispatcher.executeDispatch(document, “.uno:DataSelect”, “”, 0, Array())

Mesmo retirando o “rem” do código no Basic, não sei como entro na lista para selecionar o primeiro valor é que gerado por uma fórmula condicional.

Indo um pouco além, gostaria que essa macro só fosse executada quando as células da coluna A tivessem seus valores selecionados ou <>"".
Como faria isso?

Desde já, agradeço!

Estas listas de Validação são fixas ? Poderia postar um arquivo modelo ?

Utilizei a validação do tipo INTERVALO DE CÉLULAS com uma fórmula condicional para me retornar o resultado mediante a seleção das demais células, ou seja tanto a coluna A, C:F são dependentes entre si.

Dei uma pesquisa aqui e não encontrei na internet nem sinal de argumentos para selecionar o item da lista via dispatcher. Também não encontrei nada parecido via API UNO. Mas usando a extensão Xray, cheguei a uma forma de buscar os valores de uma lista fixa ou mesmo um intervalo que estiver na validação. O problema é que o mesmo “método” não funciona para fórmulas.

No entanto, há um método alternativo, mas para construir o código preciso de um arquivo de exemplo, ou pelo menos dar uma olhada nas fórmulas usadas na validação das colunas C:F.

Oi @LeandroVieira, fica mais fácil vendo o arquivo, altere os dados sigilosos, se houver, e manda o arquivo…

Estive um pouco ausente, segue o arquivo:
Controle de gastos
A disposição dos meses pode ser mudada para ficarem um abaixo do outro se o código da macro ficar muito grande.

A fórmula está um pouco extensa, como fiz algumas alterações no “BD” irei atulualiza-la, só um momento.

“Controle de gastos” link quebrado…

Pronto, segue o arquivo, estava atualizando as fórmulas:
Controle de gastos

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

Perfeito, muito obrigado!

Posso lhe sugerir algo diferente? Por que não usar controles de formulários? ou a Função SE()?

Algo tipo isso:

Assim pode ter sempre um campo padrão, que você digitar, e ainda escolher células para validar.
Logicamente

Ou isto talvez, veja se esta outra minha resposta não contempla você tem um arquivo de exemplo lá:

Não sei como fazer isso nesta situação, e se seria viável a utilização de caixa de listagem, pois são muitas células, na verdade é um calendário de gastos de vários anos, todas as células dos meses possuem validação com a função se aninhada a outras.