Ir ao conteúdo

Excel Planilha Colunas Maiúsculas Módulo VBA


Ir à solução Resolvido por Midori,

Posts recomendados

Postado

Boa tde!

Peço ajuda para um código dentro do Módulo.

Tudo que digitar em minúsculas se converta em Maiúsculas quando teclar "Enter" 

As colunas são: B, C, G, H e K à partir da linha 5

Postado

https://www.clubedohardware.com.br/forums/topic/1700149-vba-digitar-em-k-e-resultado-esperado-em-z/#comment-8811692

 

Experimente o código abaixo.

 

Private Sub Worksheet_Change(ByVal Target As Range)
 If Intersect(Target, Range("B:C,G:H,K:K")) Is Nothing Or Target.Row < 5 Then Exit Sub
 If Target.Value = UCase(Target.Value) Then Exit Sub
 Target.Value = UCase(Target.Value)
End Sub

 

  • Curtir 1
Postado

Boa tde OreiaG!

Obrigado novamente pelo seu retorno...

Bem, eu não testei ainda este seu novo código ae... mas vou tentar explicar o que ocorrendo aqui no momento..

Eu já tenho o código abaixo no evento Change:

 

'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Maiúsculas
If Target.Cells.Count > 1 Then
        Exit Sub
    End If
    On Error GoTo ErrHandler:
    If Not Application.Intersect(Me.Range("K5:K5000"), Target) Is Nothing Then
        If IsNumeric(Target.Value) = False Then
            Application.EnableEvents = False
            'Target.Value = StrConv(Target.Text, vbLowerCase)
            Target.Value = StrConv(Target.Text, vbUpperCase)
            'Target.Value = StrConv(Target.Text, vbProperCase)
            Application.EnableEvents = True
        End If
    End If
'ErrHandler:
    Application.EnableEvents = True 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

E também logo abaixo tenho os seguintes:

 

'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

'Localiza conteudo da celula Coluna "B" Código_Por OreiaG
'Private Sub Worksheet_Change(ByVal Target As Range)

 

 Dim c As Range
  If Target.Address <> "$M$1" Then Exit Sub 'Localizar "M1"
  Set c = Range("B5:B" & Cells(Rows.Count, 2).End(3).Row).Find(Target.Value)
  If Not c Is Nothing Then c.Select Else: MsgBox "NÃO ENCONTRADO"

'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'digitar em K à partir da linha 5 "CANCELOU PEDIDO S/DVL" ou "CANCELOU PEDIDO C/DVL" _ Por OreiaG

'Private Sub Worksheet_Change(ByVal Target As Range)

 

 If Target.Row < 5 Or Target.Column <> 11 Then Exit Sub
 If Target.Value = "CANCELOU PEDIDO S/DVL" Then
  Cells(Target.Row, "AK") = "PDD CANCEL " & Format(Target.Offset(, -1).Value, "dd/mm/yy") & " S/DVL"
 ElseIf Target.Value = "CANCELOU PEDIDO C/DVL" Then
  Cells(Target.Row, "AK") = "PDD CANCEL " & Format(Target.Offset(, -1).Value, "dd/mm/yy") & " C/DVL"
 End If
 
'End Sub
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

E após acrescentar este último os problemas de conflitos começaram... As colunas que me refiro não mais ficando em Maiúsculas.

Porisso pensei na possibilidade de tirar os códigos de Maiúsculas do evento Change e coloca-los em um Módulo pra separa-los dos demais pra não ocorrer estes conflitos tdeu...

Não sei se o que pensei de fazer é o certo mas seria uma tentativa.

o que você me diz...?

Postado

Veja se o código abaixo faz TUDO o que você precisa.

 

 

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim c As Range
  If Target.Count > 1 Then Exit Sub
  
  'Localizar "M1" em B
  If Target.Address = "$M$1" Then
   Set c = Range("B5:B" & Cells(Rows.Count, 2).End(3).Row).Find(Target.Value)
   If Not c Is Nothing Then c.Select Else: MsgBox "NÃO ENCONTRADO"
   Exit Sub
  End If
   
   'Verifica se a entrada foi em B:C ou em G:H ou em K, a partir da linha 5
   If Intersect(Target, Range("B:C,G:H,K:K")) Is Nothing Or Target.Row < 5 Then Exit Sub
   
   'Se a entrada for um texto específico e em K
   If Target.Column = 11 And Target.Value = "CANCELOU PEDIDO S/DVL" Then
    Cells(Target.Row, "AK") = "PDD CANCEL " & Format(Target.Offset(, -1).Value, "dd/mm/yy") & " S/DVL"
   ElseIf Target.Column = 11 And Target.Value = "CANCELOU PEDIDO C/DVL" Then
    Cells(Target.Row, "AK") = "PDD CANCEL " & Format(Target.Offset(, -1).Value, "dd/mm/yy") & " C/DVL"
   End If
   
   'Converte o texto em maiúsculas
   If Target.Value = UCase(Target.Value) Then Exit Sub
   Target.Value = UCase(Target.Value)
End Sub

 

  • Curtir 1
Postado

Bom dia!! beleza, assim q tiver um tempinho vou testar sim..

Mas só pra tirar dúvida...

Seria mesmo possível como pensei, colocar códigos das maiúsculas dentro de um módulo..??Até porque ficariam até mais organizados né...!

Postado
3 horas atrás, jcgmcs disse:

Seria mesmo possível como pensei, colocar códigos das maiúsculas dentro de um módulo..??

Sim, é possível, mas não vejo qualquer vantagem nisso.
O uso do evento Change para converter em maiúsculas aproveita a ação de inserir dados na planilha e nenhuma outra ação do usuário é necessária. Ao passo que se utilizar outro código, da forma como você citou, você precisaria de uma segunda ação para a conversão, tal como clicar em um botão ou teclar um atalho. Ainda, para manter as maiúsculas conforme desejado, o usuário precisaria se lembrar de acionar o segundo código. Por essas razões, eu não vejo vantagem em utilizar um segundo código.

 

dica - todos os espaços específicos destinados a receber códigos em VBA são identificados com o nome Módulo. Assim, há um Módulo para cada Planilha (eventos de Planilha), há um Módulo para o Arquivo (eventos de Arquivo), para UserForm, de Classe, e há os Módulos comuns (Módulo1, Módulo2, ...)

 

Até porque ficariam até mais organizados né...!
A princípio não vejo lógica nesse seu comentário, mas gostaria de saber o que exatamente você quer dizer com "mais organizados".

 

  • Curtir 1
Postado

Eu quiz dizer ..mais organizados.. lá no evento Change, que ficaria mais enxuto... aqui, só postei as referidas colunas e esses 3 códigos ae.. mas minha planilha vae até "GY" e com muitos códigos dentro Change, tudo misturados tdeu... rsrs

Mas agradeço ae OreiaG pela sua explicação... logo testarei e dou retorno ae.. obrigado!

Postado
Em 23/10/2024 às 16:46, jcgmcs disse:

E após acrescentar este último os problemas de conflitos começaram... As colunas que me refiro não mais ficando em Maiúsculas.

Você quer fazer em 5 colunas, porém seu código verifica o range K5:K5000. Nesse caso não é questão de conflito. 

 

Acho que o código fica mais "organizado" aplicando indentação e espaços entre algumas linhas.

  • Curtir 1
Postado

Sim Midori... porisso meus códigos em separados por...  'xxxxxxxxxxxxxxxxxxxxxxxx

Fica um pouco poluído mas ajuda nas orientações... rsrs

 

Mas minha intenção era assim...

Se quero mexer nas Maiúsculas e Minúsculas, então vou lá no Módulo das referidas tdeu...

É coisa simples e acredito q dessa maneira resolveria meus problemas...

OreiaG...

Fiz os ajustes com seu código e alguns remanejos acrescentando mais algumas colunas...

Mas agora problemas surgindo por causa esse códigos abaixo:

 

'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'Excel VBA - Só permitir uma data, nada mais que isso na célula_Por OreiaG Data em "L"
'Forçar Data "dd/mm/aa"

'Private Sub Worksheet_Change(ByVal Target As Range)

 If Target.Address <> "L5:L" Then Exit Sub
 If Target.Value = "" Then Exit Sub
 If IsDate(Target.Value) = False Or Target.HasFormula Then Target.Value = "": MsgBox "COLOQUE UMA DATA VÁLIDA"
'End Sub
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

As maiúsculas param de funcionar se coloco eles acima ou abaixo do seu...

...If Intersect(Target, Range("B:C,G:H,K:N,O:R,T:U,W:X")) Is Nothing Or Target.Row < 5 Then Exit Sub...

 

A linha acima é só pra referenciar o seu ok...

 

E quando excluo o código "Forçar Data "dd/mm/aa", tudo volta à funcionar...

 

 

Postado
2 horas atrás, jcgmcs disse:

Fiz os ajustes com seu código e alguns remanejos acrescentando mais algumas colunas...

Mas agora problemas surgindo por causa esse códigos abaixo:

 

 

Desculpe, amigo. A cada postagem você traz uma novidade e um novo problema.

Desisto de te ajudar!

  • Curtir 1
Postado
3 horas atrás, jcgmcs disse:

Se quero mexer nas Maiúsculas e Minúsculas, então vou lá no Módulo das referidas tdeu...

 

 

Acredito que esteja se referindo a procedimento. Na programação a modularização (não confunda com o módulo/componente do VBA) é uma boa prática e significa dividir o código em pedaços menores para realizar uma tarefa de acordo com o contexto. O Worksheet_Change é um procedimento Sub, ativado no evento change, e no mesmo módulo você pode criar outros. Assim fica mais simples testar já que poderá apenas comentar a linha da chamada caso queira desativar algum, p.ex,

 

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo FIM
    
    If Target.Count = 1 Then
        If Target.Row >= 5 Then
            Call PedidoCancelado(Target)
            Call TodasMaiusculas(Target)
        End If
        
        If Target.Address = "$M$1" Then
            Dim Localiza As Range
            
            Set Localiza = LocalizaConteudo(Target)
        
            If Not Localiza Is Nothing Then
                Call Localiza.Select
            End If
        End If
    End If

FIM:
    If Err.Number <> 0 Then
        Application.EnableEvents = True
        MsgBox "Erro"
    End If
End Sub

Function PedidoCancelado(Celula As Range) As Boolean
    If Celula.Column = [K:K].Column Then
        Dim PedidoDia   As Range
        Dim Resultado   As Range
        
        Set PedidoDia = Cells(Celula.Row, [J:J].Column)
        Set Resultado = Cells(Celula.Row, [Z:Z].Column)
        
        If UCase(Celula.Value) = "CANCELOU PEDIDO S/DVL" Then
            Resultado.Value = "PDD CANCEL " & PedidoDia.Value & " S/DVL"
            PedidoCancelado = True
        ElseIf UCase(Celula.Value) = "CANCELOU PEDIDO C/DVL" Then
            Resultado.Value = "PDD CANCEL " & PedidoDia.Value & " C/DVL"
            PedidoCancelado = True
        End If
    End If
End Function
   
Function TodasMaiusculas(Celula As Range) As Boolean
    If Not Application.Intersect(Range("B:C,G:H,K:K"), Celula) Is Nothing Then
        Application.EnableEvents = False
            Celula.Value = UCase(Celula.Value)
        Application.EnableEvents = True
        TodasMaiusculas = True
    End If
End Function

Function LocalizaConteudo(Celula As Range) As Range
    If Trim(Celula.Value) <> "" Then
        Set LocalizaConteudo = Celula.Worksheet.[B:B].Find( _
            What:=Celula.Value, After:=Celula.Worksheet.[B5], _
            LookIn:=xlValues, LookAt:=xlWhole)
    End If
End Function

 

Escolhi retornar algum valor, por isso usei Function no lugar Sub. Isso é útil no projeto caso queira exibir uma mensagem se um valor for encontrado ao algum dado modificado.

  • Curtir 1
Postado

obrigado Midori por seu retorno...

Vou sim avaliar seus códigos e testar beleza...

 

quanto ao OreiaG,

Me desculpe se te fiz perder seu tempo...

O caso éq não se trata de à cada postagem, venho com um novo problema e sim que sua proposta sugerida até ajudou em partes mas, acabou q não solucionou o que venho tentando resolver aqui..

Expliquei tudo ae da forma mais clara possível mas, tudo bem, ninguém é obrigado a nada aqui no Fórum, contamos apenas com a boa vontade de vcs expert em Excel.

Mas obrigado assim mesmo OreiaG... valeu a tentativa...

  • Curtir 1
  • 2 semanas depois...
Postado

Midori boa tde!

Testei seus códigos e maiúsculas funcionando tudo certinho...

Já o Localizar de "M1" da coluna "B" não está...

Preciso tbém que quando digitado ou deletado em "K" algo diferente de CANCELOU PEDIDO S/DVL e CANCELOU PEDIDO C/DVL, na coluna "Z" seja tbém deletado conforme a linha...

Por favor, se puder me ajudar com esses dois impasses agradeço muito.

obrigado!

Postado
Em 04/11/2024 às 15:02, jcgmcs disse:

Já o Localizar de "M1" da coluna "B" não está...

Aqui funciona. Se entrar com um texto em M1 e esse existir na coluna B, a célula com o valor encontrado será selecionada. O que acontece aí nessa condição?

 

Em 04/11/2024 às 15:02, jcgmcs disse:

na coluna "Z" seja tbém deletado conforme a linha...

Para isso é só colocar este Else,

...
ElseIf UCase(Celula.Value) = "CANCELOU PEDIDO C/DVL" Then
    Resultado.Value = "PDD CANCEL " & PedidoDia.Value & " C/DVL"
    PedidoCancelado = True
Else
    Resultado.Value = ""
End If

 

  • Curtir 1
Postado

Midori,

M1 realmente funcionando mesmo mas só se digitar exatamente como estiver na B...

Minha B contém os códigos dos clientes iniciados com C tipo assim: C0727, C0850, C0100...

Queria q só digitando a parte numérica 850 ele já fizesse a localização tdeu...

 

Já na parte do Z q refere à "PedidoDia" ele tá trazendo a data dd/mm/aaaa como abaixo... 

PDD CANCEL 17/04/2018 S/DVL

Preciso q seja assim:  dd/mm/aa como abaixo...

PDD CANCEL 17/04/18 S/DVL

 

É só isso pra finalizar.. rsrs

Postado
16 horas atrás, jcgmcs disse:

Queria q só digitando a parte numérica 850 ele já fizesse a localização tdeu...

O parâmetro LookAt pode receber duas constantes: xlWhole e xlPart. Usei a primeira para testar o texto todo, mas a segunda serve para qualquer parte. Então é só editar essa parte.

 

16 horas atrás, jcgmcs disse:

Preciso q seja assim:  dd/mm/aa como abaixo...

PDD CANCEL 17/04/18 S/DVL

Para isso tem a função de formatação: Format(..., "DD/MM/YY")

  • Curtir 1
Postado

Midori não entendi a função... Como e onde coloco ela?

To copiando e colando.. dando erro:
Era esperado: Identificador ou Expressão entre colchetes

  • Solução
Postado

A sintaxe da função é: Format(Expression, [ Format ], [ FirstDayOfWeek ], [ FirstWeekOfYear ])

 

O primeiro parametro é obrigatório e deve receber a expressão que será formatada no retorno da função. No seu caso é a data. Você deve passar a data como argumento e aplicar o formato no segundo parametro, p.ex:

 

Resultado.Value = "PDD CANCEL " & Format(PedidoDia.Value, "DD/MM/YY") & " C/DVL 

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...