Alterna a função If () no Excel / OOCalc

6

Incontáveis vezes ao longo de anos, eu queria usar uma instrução If no Excel / OpenOffice Calc na forma de:

If(A (comparison operator) B, A, C)

ou, de forma equivalente, útil:

If(A (comparison operator) B, C, A)

onde A é uma expressão muito longa e complicada, e B e C são curtos e simples, frequentemente (mas nem sempre) apenas um valor literal. Eu queria uma maneira de fazer um desses que não envolvesse uma expressão A duplicada (que é pelo menos duas vezes mais feia, requer edições duplicadas e apresenta erros totalmente desnecessários que nem sequer se manifestam consistentemente), ou dar A uma célula dedicada, ou usando o VBA (que é proprietário da Microsoft, portanto icky e não no Calc).

Existem algumas soluções alternativas para casos especiais, como o Iferr () no Excel (isso não está no Calc) e a manipulação de números com funções do tipo 'condicional' como Abs (), arredondamento e Mod (). Mas estes são inadequados para fazer o que eu quero na maior parte do tempo (e a manipulação de números também é deselegante e pouco clara). Existe alguma chance de haver uma função ou simples série de funções que eu tenha perdido, o que pode fazer isso? Parece uma coisa grande deixar de fora.

    
por Aru 02.10.2015 / 18:37

3 respostas

2

Para uma solução LO Calc, vejo duas maneiras:

  1. coloque a função que produz o resultado para A em uma folha separada protegida . Dessa forma, é muito improvável que o usuário tente editar acidentalmente a célula que contém sua função. Tem algumas outras vantagens:

    • não há necessidade de codificação de macro,
    • capacidade de copiar a planilha "function" em outros arquivos ods ,
    • simples de editar.
  2. defina a função como função definida pelo usuário dentro de uma macro básica. O Star Basic usado pelo LO Calc não é o mesmo que o VBA, mas é bastante semelhante, pois ambos são dialetos básicos. Vantagens:

    • poder total da linguagem starbasic,
    • exporte-a como "biblioteca do sistema"
    • ou incorporar em ods templates.

Criar uma função definida pelo usuário no Calc é muito fácil. Supondo que você tenha que calcular o valor A pela multiplicação de três valores diferentes, basta criar uma macro como esta:

Function A(b, c, d)
A = b*c*d
End Function

Agora, você pode usar essa função dentro da expressão If :

If(A(4, 5, 6) > B, A(4, 5, 6), C)

Naturalmente, esse exemplo simples não faz muito sentido, mas é mais útil se o seu código para calcular A() ficar mais complexo. Se os três valores para multiplicar forem fixos, você pode reduzir o código para

Function A()
A = 4*5*6
End Function

e chamá-lo simpy usando

If(A() > B, A(), C)

Sei que esses exemplos são simples demais para ilustrar a solução. Basta pensar em adicionar definições de constantes ou criar uma biblioteca de funções completa dentro de uma macro, talvez com funções auxiliares "privadas" invisíveis para o usuário que apenas edita a folha ods .

    
por 02.10.2015 / 20:19
3

O usuário tohuwawohu postou uma resposta que me levou diretamente ao meu. Eu não acho que tohuwawohu entendeu o que eu queria, talvez por minha culpa, mas sua macro sugestão me ajudou a entender. Acabei de criar uma macro, que agora está carregada em todas as folhas e que definiu uma função que eu posso chamar com a mesma sintaxe de uma função interna.

Mas, para começar, estou usando o OpenOffice Calc, não o LibreOffice Calc, mas ambos usam uma linguagem BASIC muito semelhante ao VBA (Visual Basic for Applications, da Microsoft, como usado no Excel).

Você pode definir partes de instruções via Sub (como na sub-rotina) e Function. De acordo com esta página na documentação , carregar / executar uma macro com uma função nela faz exatamente isso permite chamá-lo como uma função em fórmulas de células comuns. Este é um fato que eu não conhecia antes, apesar de tentar encontrar uma maneira de fazer isso no passado.

Depois de navegar um pouco na Visão geral do OOCalc Basic , eu fiz uma função que funciona, embora não assim como eu gostaria, pois o operador e o segundo operando são passados como dois argumentos separados e o primeiro como uma string. Mas, lembro-me que houve uma vez pelo menos uma função interna do Excel que usou o mesmo, um argumento para um operador passado como uma seqüência de caracteres, pelo menos, há precedente.

Eu acho que o problema era que eu não sabia que era tão simples fazer uma "macro" que, em vez de executar algum código e sair, definia uma função que você poderia chamar em fórmulas de célula. A palavra "macro" meio que me jogou fora, já que normalmente isso só significa coisas do tipo processual, além de haver informações do "Manual do Usuário" sobre como chamar essas funções em macros, que estavam em uma parte diferente do site do que Visão geral básica.

Ferramentas > Macros > Organizar Macros > OpenOffice Basic > Botão "Organizador ..." > Guia Bibliotecas > Minhas Macros & Diálogos > Biblioteca "padrão" > Botão Editar

Eu colei isso no final, salvei e fechei o editor. Ele executa a segunda das duas funções na pergunta original, mas na forma IfAlt (A, operador, B, C), em que operator é uma string de um operador de comparação. Se A op B for true, retorna C, caso contrário, retorna A.

Function IfAlt(arg1, op, arg2, ifTrue)
    If (op="=" AND arg1=arg2) OR (op="<>" AND arg1<>arg2) OR _
        (op=">" AND arg1>arg2) OR (op=">=" AND arg1>=arg2) OR _
        (op="<" AND arg1<arg2) OR (op="<=" AND arg1<=arg2) Then
        IfAlt = ifTrue
    Else
        IfAlt = arg1
    End If
End Function
    
por 03.10.2015 / 00:25
0

Eu acho que você pode fazer isso, mas eu vou tentar ver se é isso que você quer dizer. Então eu vou usar o Excel como um exemplo, já que eu tenho e não tão familiarizado com o OpenOffice Calc.

No Excel, eu sei que você colocaria =if(condition, if true, if false) para a função if, e se eu entendi corretamente, você está apenas querendo consolidá-la em uma função menor para facilitar a leitura, certo?

A única maneira de fazer isso seria usar uma célula para cada um, porque, como o Excel funciona, não há como declarar uma variável sem usar uma célula. Você poderia usar o VBA, mas como você mencionou, você não pode usar isso no openoffice. O problema é que você tem que ser capaz de armazenar a fórmula / valor / etc. em algum lugar, e é por isso que tem que ser uma célula.

Não conheço sua situação, mas você teria que proteger a planilha e bloquear os campos, marcá-los como ocultos ou deixá-los em paz e esperar o melhor.

    
por 02.10.2015 / 20:09