Ir ao conteúdo
  • Cadastre-se

VBA e caracteres especiais no Excel


Posts recomendados

Prezados e ilustríssimos amigos,

Bom dia.

Apesar de ter um conhecimento intermediário no excel, me considero extremamente iniciante, haja vista que este programa possibilita uma infinidade de funções.

Bom, primeiramente, gostaria de dizer que o código abaixo foi gerado e adaptado às minhas necessidades pelo @CasaDoHardware e @Patropi. Apesar de minha planilha conter células mescladas, em contrariedade à orientação do @CasaDoHardware - bom esclarecer que deixei assim, com células mescladas, porque a planilha já estava pronta, e porque sou perfeccionista -, consegui fazer com que a fórmula extraísse inúmeros dados que eram necessários. Criei diferentes macros e botões a fim de extrair as seguintes informações de cada PROCURADOR DE JUSTIÇA responsável por um processo: 1) Processos distribuídos; 2) Retornos; 3) Distribuições e retornos; 4) Recursos interpostos; 5) Manifestações em substituição; 6) Processos em tramitação no gabinete (ainda não devolvidos); 7) Julgamentos favoráveis ao parecer; 8) Julgamentos contrários ao parecer; 9) Julgamentos pendentes com acórdão;

A fórmula básica gerada é essa aqui:

----------------------------------------------------------------------------------------------------

Do While ActiveCell <> ""

If ActiveCell = Proc And ActiveCell.Offset(0, -6) <> "Não" Then

    Intersect(Selection.EntireRow, _
             Range("C:AU")).Select
                   Selection.Copy
    WP.Select
    Range("C1048576").End(xlUp).Select
    ActiveCell.Offset(1, 0).Select
       
    With Selection
.PasteSpecial
'        .PasteSpecial Paste:=xlPasteValues
'        .PasteSpecial Paste:=xlPasteFormats
    End With
    Application.CutCopyMode = False
    Cont = Cont + 1
    WP.Range("C75").Select
    WM.Select
    ActiveCell.Offset(1, 38).Select
Else
    ActiveCell.Offset(1, 0).Select

End If

Loop

----------------------------------------------------------------------------------------------------

Basicamente, de critério a critério, alterei apenas a segunda linha, fazendo a fórmula procurar por algo específico. Dos critérios acima listados, apenas 2 não consegui fazer: 

5) Manifestações em substituição; 9) Julgamentos pendentes com acórdão;

Agora vou dizer o que acredito que não esteja dando certo ou o que não soube dizer para o VBA:

 

### No primeiro caso, 5) Manifestações em substituição, tentei formatar a segunda linha destes dois jeito, tudo sem sucesso: "If ActiveCell = Proc And ActiveCell.Offset(0, 5) <> WC.Range("A2").Value Then" e "If ActiveCell = Proc And ActiveCell.Offset(0, 5) <> "–" Then"; Gostaria que a segunda parte do código verifcasse se naquela célula o valor é diferente de "–". Se fosse, que ele copiasse a linha inteira. Acho que o problema é que o excel não está conseguindo compreender o caractere entre aspas "–". Mesmo quando peço para o VBA se referir a uma célula contendo esse valor (WC.Range("A2").Value), acho que ele não entende esse caractere como tal, porque copia TODAS as linhas, sem exceção, tenham ou não tenham "–" na célula especificada.

 

### No segundo caso, 9) Julgamentos pendentes com acórdão, gostaria que o excel fizesse uma tripla verificação. Se o PROCURADOR é o tal (If ActiveCell = Proc) + a célula X é igual a "Pendente" (essa aqui eu sei fazer) e a CÉLULA Y contém a palavra "acórdão" (isso aqui que não sei), então (then) 

 

É isso, meus amigos, obrigado.

 

Link para o comentário
Compartilhar em outros sites

A primeira nao entendi direito o que você esta procurando, se entendi você quer pesquisar o procurardor que nao tem acordao, se for isso declare mais uma variavel algo mais ou menos assim 

 

Dim Alc as string

 

No teste if

 

if activecell.value = proc and activecell.offset(0,5)..value = alc then

 

Executa a macro

 

end if

 

 

A segunda e so adicionar mais um and a cada condição..

 

if condiçao 1 and condição 2 and condição 3 = "XYZ" then

 

executa o codigo 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@CasaDoHardware, seguinte, meu amigo. No primeiro caso, o VBA deveria procurar valores diversos ao caractere "–". Essa célula (#11 da imagem anexa) contém ou o nome de alguém ou o caractere "" (entre aspas), se ninguém estiver substituindo outra pessoa. Quando peço para o VBA procurar por algo diferente (<>) de "", ele não entende esse caractere corretamente e copia todas as linhas como se tudo fosse diferente de "–".

Já tentei fazer de duas formas, mas nenhuma deu certo:

#1 If ActiveCell = Proc And ActiveCell.Offset(0, 5) <> WC.Range("A2").Value Then

Nessa, coloquei o caractere em uma célula diferente e fiz referência a ela. O VBA, também, entendeu que tudo era diferente de "".

# If ActiveCell = Proc And ActiveCell.Offset(0, 5) <> "–" Then

O resultado foi o mesmo da anterior. Entendeu-se que tudo era diferente de "–".

 

No segundo caso, não sei se testei direito, mas é o seguinte: o VBA, na terceira condição, deveria procurar se a célula contém a palavra acórdão. Não expliquei direito, mas essa célula é livre de edição (#7 da imagem) e, então, é bem possível que escrevam, por exemplo, Ciência de acórdão. Assim, queria que o VBA procurasse a palavra acórdão, de qualquer jeito, maiúscula ou minúscula na célula.

Tentei assim, mas acho que não deu certo: If ActiveCell = Proc And ActiveCell.Offset(0, -3) = "Pendente" And ActiveCell.Offset(0, -12) = "*acórdão*" Then

 

Não sei se esclareci bem, mas, segue imagem da planilha para elucidar.

Chard.jpg

Link para o comentário
Compartilhar em outros sites

@Patropi e @CasaDoHardware, consegui fazer o primeiro problema. Achei melhor fazer o VBA pesquisar pelo nome mesmo, aí deu certinho. Agora, o segundo "problema" não foi de jeito nenhum. Como fazer o VBA pesquisar por um texto específico?

Tentei assim, mas não deu certo: If ActiveCell = Proc And ActiveCell.Offset(0, -3) = "Pendente" And ActiveCell.Offset(0, -12) = "*acórdão*" Then

ActiveCell.Offset(0, -12) conterá uma frase, como por exemplo, "Ciência de acórdão e contrarrazões". Queria que o VBA identificasse se a célula contém a palavra "acórdão", só isso.

Feito isso, minhas necessidades, até então, se esgotam.

Um abraço a todos e muito obrigado.

Link para o comentário
Compartilhar em outros sites

Perguntei a um amigo que é uma verdadeira enciclopedia em VBA e ele passou essa instrução

 

 

If VBA.InStr(1, ActiveCell.Offset(0, -12).Value, "acórdão") > 0 Then

'O que fazer em caso de verdadeiro

 

ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select

End If

 

Isso só é perigoso porque o VBA entende por exemplo acordão diferente de acórdão e diferente de ACÓRDÃO, em resumo, cada forma de escrever a palavra procurada é considerada diferente uma da outra, embora tenha o mesmo significado para o usuario.
 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@CasaDoHardware, meu grande amigo colaborador.. acho que a solução do seu amigo serve e muito, não? Poderia adicionar outros AND ou OR, não é verdade? Aí resolveria minúsculo, maiúsculo e sem acento. Se escreverem outra forma disso, aí também fica difícil. kkkk...

Muito obrigado pela empatia. Foi perguntar até pra um amigo.. Isso que é vontade de ajudar...

 

Com isso, terminei a planilha. Para não ter trabalho, só queria adicionar um ActiveCell.FormulaR1C1 para alterar o texto e fórmula de uma célula. Só não consegui fazer "chamar" no texto a variável Proc que você setou no comando. Alguma ideia?

 

 ActiveCell.FormulaR1C1 = _
        "=""PROCESSOS REDISTRIBUÍDOS DO EXCELENTÍSSIMO(A) SENHOR(A) PROCURADOR(A)-GERAL DE JUSTIÇA, DR(A) ""&UPPER(
Configurações!R3C1)"

 

Peguei esse comando utilizando o gravador de macros. O que deveria ser substituído pela variável Proc era o que está de vermelho.

Com isso, minha planilha está finalizada, com todas as funções que queria.

Link para o comentário
Compartilhar em outros sites

@CasaDoHardware, pesquisando aqui, descobri, em um fórum em inglês, que não precisa utilizar o FormulaR1C1 para esse caso, já que não vou me referir ao conteúdo de uma célula específica. Basta o Activecell.Value. Então, no final, ficou assim:

 

ActiveCell.Value = "PROCESSOS REDISTRIBUÍDOS DO(A) EXCELENTÍSSIMO(A) SENHOR(A) PROCURADOR(A) DE JUSTIÇA, DR(A) " & UCase(Proc)
 

Tudo certinho. Meu amigo, um super obrigado. Valeu.

Vou tentar aprender mais, mas, agora, sem qualquer pressão.

Um forte abraço.

Link para o comentário
Compartilhar em outros sites

  • 10 meses depois...

Amigos, bom dia. O @CasaDoHardware me encaminhou uma planilha, cuja cópia segue anexa, e eu queria aprender a fazer uma função que ela contém. Como não sei o nome, vou tentar explicar: Na aba Movimentações, existe uma validação de dados em lista que contém o nome dos procuradores lá da aba Configurações. Atualmente, os dados vão de "-" até "José Luis Datena", o que perfaz 5 itens. Conforme vou acrescentando mais nomes em Configurações, embaixo do último nome, automaticamente a lista da aba Movimentações é atualizada. Como faço isso? você sabe, @Patropi?

Clube do Hardware.zip

Link para o comentário
Compartilhar em outros sites

Ele usou um intervalo nomeado com a fórmula:

=DESLOC(Conf!$A$2;0;0;CONT.VALORES(Conf!$A:$A)-1;1)

 

Particularmente prefiro usar o conceito de tabelas nomeadas p/ indicar os dados da validação, como pode ser visto na tabela anexa.

Nesta tabela adaptada ao conceito de tabelas nomeadas reconhecidas pelo Excel você tb pode filtrar a aba Movimentações com segmentação de dados sem precisar de macro (.xlsx).

 

Procuradores.xlsx

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@DJunqueira, meu amigo, adorei o que você fez. Simplesmente maravilhoso! Achei super rápido aqui, muito mais que VBA, e, com essa ferramenta, poderia adaptá-la a centenas de coisas que deixariam minha planilha absolutamente completa. Adoraria aprender a como fazer isso. Você poderia me fornecer um link para aprender ou me dizer, em linhas gerais, como é? 

Link para o comentário
Compartilhar em outros sites

Explico com prazer @Nortonap

 

Primeiro transformei todas suas listas em tabelas nomeadas reconhecidas pelo Excel (botão Formatar como Tabela no menu Página Inicial), por conta disso pude inserir uma Segmentação de dados na aba Movimentações. 

 

Montei algumas validações de dados nesta tabela p/ facilitar a vida, desfiz a mesclagem do cabeçalho (o q impediria esta lista de se transformar em tabela nomeada) e desabilitei os botões de filtragem p/ q a tabela ficasse o mais parecida com a q você tinha inicialmente criado.

 

Com tabelas nomeadas suas fórmulas ficam mais fáceis de entender, o intervalo nomeada sempre se ajusta a entrada de novos dados evitando q você tenha q alterar as fórmulas e fórmulas inseridas na tabela são automaticamente incluídas ao acrescentar novas linhas.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...