Pergunte aqui
1

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

perguntadas 2016-04-28 21:03:36 +0200

imagem do gravatar de Leandro Vieira

updated 2016-07-31 16:04:26 +0200

imagem do gravatar de Grafeno

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.Descrição da imagem

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!

editar alterar tag assinalar como ofensivo fechar mesclar Excluir

Comentários

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

imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2016-04-28 21:50:08 +0200 )editar

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.

imagem do gravatar de Leandro VieiraLeandro Vieira ( 2016-04-29 15:24:29 +0200 )editar

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.

imagem do gravatar de GrafenoGrafeno ( 2016-04-29 21:51:15 +0200 )editar

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.

imagem do gravatar de GrafenoGrafeno ( 2016-04-29 21:54:02 +0200 )editar

Oi @Leandro Vieira, fica mais fácil vendo o arquivo, altere os dados sigilosos, se houver, e manda o arquivo......

imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2016-05-01 18:33:54 +0200 )editar

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.

imagem do gravatar de Leandro VieiraLeandro Vieira ( 2016-05-02 16:00:39 +0200 )editar

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

imagem do gravatar de Leandro VieiraLeandro Vieira ( 2016-05-02 18:02:21 +0200 )editar

"Controle de gastos" link quebrado...................................

imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2016-05-03 01:42:06 +0200 )editar

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

imagem do gravatar de Leandro VieiraLeandro Vieira ( 2016-05-03 16:18:20 +0200 )editar

2 Respostas

1

respondidas 2016-05-04 18:27:23 +0200

imagem do gravatar de Grafeno

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

editar assinalar como ofensivo Excluir Link mais

Comentários

Perfeito, muito obrigado!

imagem do gravatar de Leandro VieiraLeandro Vieira ( 2016-05-05 15:28:02 +0200 )editar
0

respondidas 2016-04-29 15:18:34 +0200

imagem do gravatar de Beto

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 Descrição da imagem

Descrição da imagem

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

editar assinalar como ofensivo Excluir Link mais

Comentários

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.

imagem do gravatar de Leandro VieiraLeandro Vieira ( 2016-04-29 17:39:38 +0200 )editar
Login/Registrar para responder

Ferramentas de perguntas

1 seguidor

Estatísticas

Perguntadas: 2016-04-28 21:03:36 +0200

Lidas: 506 vezes

Última atualização: May 04 '16