Notifications
Clear all

Formatar como Texto após confirmação via VBA

10 Posts
2 Usuários
0 Reactions
1,379 Visualizações
(@luizhcosta)
Posts: 0
New Member
Topic starter
 

Olá, bom dia.

Tenho um projeto de planilha para controlar lançamentos e evitar exclusões acidentais. Já possuo um código que funciona perfeitamente, mas preciso de um outro código que irá complementar o primeiro. O código de utilizo não necessita de ajustes, e em se criando o segundo ele irá funcionar ainda melhor. O código que utilizo bloqueia através do evento CHANGE todas as células que possuem fórmulas. E como disse, funciona perfeitamente. Mas vamos ao segundo código.

Em anexo tem uma planilha com o formato que pretendo trabalhar. É provável que novas colunas sejam inseridas, mas acredito que a adaptação seja fácil. O usuário irá fazer lançamentos nas células do intervalo A2 até I2. Na célula J2 o usuário não fará lançamento, mas esta célula irá receber um texto inserido pelo código. A célula K2 é muito importante, pois ele irá disparar o código ao ser selecionada. Exatamente como disse, a célula K2 será o gatilho.

É possível ver na linha 4 da planilha anexa, como ficarão as informações digitadas após a execução do código. A idéia é que as informações não sofram qualquer alteração, apenas que, todas devem ser alteradas para um formato "texto" acrescentando-se aspas duplas. Note que assim as células serão transformadas em "fórmulas" e por consequência bloqueadas pelo segundo código automaticamente. Quanto a um eventual desbloqueio, isso não é um problema pois o segundo código já possui essa funcionalidade.

Os detalhes:

O código deve ser acionado com a seleção da célula correspondente a linha na coluna K, ou seja, no caso da linha 2, quando o usuário concluir a digitação ele deve selecionar a célula K2. Isso irá disparar um form com a pergunta "Confirma Lançamento ?", e os botões padrão "Sim" e "Não".

Ao confirmar com sim, ocorre a conversão dos valores em fórmulas e na célula "J" deve ser inserido o texto "Confirmado". Caso seja escolhida a opção "Não", nada deve ser convertido, porém deve ser inserido na célula "J" o texto "Não Confirmado".

Ao longo das inclusões, haverão células "J" com os textos "Confirmado" e "Não Confirmado", então o código somente deve ser executado para células "J" com o texto "Não Confirmado". Não executar o código caso já tenha sido confirmado anteriormente.

Não existe um intervalo de linhas, a planilha com a qual trabalho tem hoje cerca de 3.000.

Espero ter sido claro e conto com a ajuda de todos que dominam o VBA.

Obrigado

 
Postado : 09/05/2016 7:45 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Seu modelo não tem nenhuma rotina, e se entendi corretamente, você quer transformar os valores digitados em personalizados, veja se consegue ajustar a rotina abaixo, ela pega os valores já digitados em um determinado Range, neste caso deixei fixo de "A2 até I2", desconsiderei "J" por entender que será adicionado só depois da execução da rotina chamada pelo evento change e como desconheço a lógica da mesma deixei de fora.

Sub FormataPersonalizado()
    Dim srg As Range
    Dim sValor
    Dim sFormato As String

    Set srg = Range("A2:I2")

    For Each x In srg
        
        sValor = x
        
        'Formata da forma que indicou
        sFormato = "=" & Chr(34) & (sValor) & Chr(34)
        
        'Troca o valor anterior pelo novo formato
        x.Value = sFormato
    
    Next

End Sub

Acho que já ajuda.
Qq coisa retorne.

[]s

 
Postado : 09/05/2016 9:00 am
(@luizhcosta)
Posts: 0
New Member
Topic starter
 

Olá Mauro, boa tarde.

Obrigado pela sua ajuda. A ação principal foi perfeitamente atendida no seu código, acrescentei apenas no seu código uma linha:

Range("J2") = "Confirmado"

E pronto.

Mas o código não contempla tudo o que foi descrito.

"...Os detalhes:

O código deve ser acionado com a seleção da célula correspondente a linha na coluna K, ou seja, no caso da linha 2, quando o usuário concluir a digitação ele deve selecionar a célula K2. Isso irá disparar um form com a pergunta "Confirma Lançamento ?", e os botões padrão "Sim" e "Não".

Ao confirmar com sim, ocorre a conversão dos valores em fórmulas e na célula "J" deve ser inserido o texto "Confirmado". Caso seja escolhida a opção "Não", nada deve ser convertido, porém deve ser inserido na célula "J" o texto "Não Confirmado".

Ao longo das inclusões, haverão células "J" com os textos "Confirmado" e "Não Confirmado", então o código somente deve ser executado para células "J" com o texto "Não Confirmado". Não executar o código caso já tenha sido confirmado anteriormente.

Não existe um intervalo de linhas, a planilha com a qual trabalho tem hoje cerca de 3.000...."

O evento deve ser a seleção da célula na coluna correspondente na linha, daí esta rotina se aplica a todas as linhas a serem preenchidas.

Mas seu código já contempla boa parte.

O primeiro código que falei não consta da planilha modelo, realmente. Eles trabalharão independentemente.

Obrigado.

 
Postado : 09/05/2016 10:45 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

luiz, o ideal seria ver seu modelo para poder ajustar a rotina, eu crie com ranges fixos só para ilustrar, como não tenho suas rotinas e entendo ser um modelo simples, recriei adaptando pelo que entendi de sua necessidade, de uma olhada se seria isto.

 
Postado : 09/05/2016 12:45 pm
(@luizhcosta)
Posts: 0
New Member
Topic starter
 

Olá Mauro,

Vou ver seu anexo mais tarde, tenho uma limitação de versão do excel no momento. O primeiro código não deve influenciar neste caso. Ele age a partir do evento CHANGE, assim após a alteração proposta neste post, ele faz o bloqueio. A noite darei alguma resposta do seu anexo.

Obrigado.

 
Postado : 09/05/2016 1:27 pm
(@luizhcosta)
Posts: 0
New Member
Topic starter
 

Olá Mauro, boa noite.

Parabéns, você visualizou meu pensamento perfeitamente. Queria apenas pedir a atenção para 2 detalhes. O primeiro está dito na minha explicação, e diz respeito ao ato de seleção e execução do código, condicionando a sua execução ao caso de, não haver sido executado anteriormente. Seguinte, as informações serão informadas pelo usuário e logo em seguida tem que confirmá-las ou não. Ele, o usuário pode até não executar o código e se obrigar a escolher uma das opções, o que não deve ser possível é reverter a atitude de ter confirmado uma vez. Explico, após fornecer as informações e confirmar, o código não pode ser executado novamente para aquela linha. A alteração somente será possível através do desbloqueio por uma instância superior que detém uma senha. Então uma vez confirmada, não pode ser perguntado novamente se deseja confirmar ou não. O código só deve ser executado nos casos em que não haja confirmação anterior. Melhor explicando, executar para as linhas da coluna "J" que não tenham a palavra "confirmado".

O segundo ponto diz respeito a uma observação. É a formatação das informações. Por padrão os textos são alinhados a esquerda e isso dá um aspecto estranho após a conversão. Então poderia as células serem alinhadas ao cento, e apenas a célula que contém valor, coluna " I " permanecer com a formatação das casas decimais ?.

No mais, está perfeito.

Muito obrigado.

 
Postado : 09/05/2016 5:32 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

luiz, pelo que entendi, só não é possível reverter a linha cujo o Valor seja "Confirmado", se for "Não Confirmado" será possível reverter, se for isto, troque a rotina do modelo que disponibilizei no post anterior por esta, veja se é isto, acredito não ser dificil fazer algum ajuste se precisar, tipo adicionar outra verificação se não tiver nenhum dado digitado e selecionar a coluna "K".

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim srg As Range
    Dim srgFormato As Range
    Dim sCol
    Dim sRow
    Dim sValor
    Dim sFormato As String
    Dim sColStatus As Long
    Dim sLin As Long
    Dim resultado As VbMsgBoxResult
    Dim sValorJ As String
    
    sCol = Target.Column
    sRow = Target.Row
    
    'Verifica se a coluna "K" (11) foi a selecionada
    If sCol = 11 Then
        
        'Captura o Valor na Coluna J" em relação a linha selecionada
        sValorJ = Target.Offset(, -1).Value
        
        'Se valor igual a "Confirmado"
        If sValorJ = "Confirmado" Then
            MsgBox "Não é possível realizar alteração nesta linha." & vbCrLf & "Contate o administrador !!!", vbCritical, "Senha Obrigatória !!!"
            Exit Sub
        End If
        
            'Pergunta se quer continuar
            resultado = MsgBox("Confirma Lançamento ?", vbYesNo, "Tomando uma decisão ...")
                
            'Se resposta = SIM
            If resultado = vbYes Then
                
                Set srg = Range("A" & sRow & ":I" & sRow)
        
                For Each x In srg
                    sColStatus = x.Column
                    sValor = x
                        
                    'Formata da forma que indicou
                    sFormato = "=" & Chr(34) & (sValor) & Chr(34)
                        
                    'Troca o valor anterior pelo novo formato
                    x.Value = sFormato
                        'srg.Offset(, 1).Select
                        
                        If sColStatus = 9 Then
                            x.Offset(, 1).Value = "=" & Chr(34) & "Confirmado" & Chr(34)
                        End If
                    
                Next
                
                Set srgFormato = Range("A" & sRow & ":H" & sRow)
                'Formata centralizando o Range de "A ate H"
                srgFormato.HorizontalAlignment = xlCenter
        
        'Se NÃO
        Else
            
            sColStatus = 10
            Cells(sRow, sColStatus).Value = "Não Confirmado"
                    
            Exit Sub
            
        End If
            
    End If

End Sub

[]s

 
Postado : 09/05/2016 8:51 pm
(@luizhcosta)
Posts: 0
New Member
Topic starter
 

Bom dia Mauro,

Cara, eu já me considero atendido com seu novo código. E devo repetir que ficou muito bom. Mas eu vou me atrever a fazer apenas uma observação. É que além da ultima observação, quanto a não executar se o valor da coluna for igual a "Confirmado", tem apenas só mais um detalhe. Veja que, se a coluna K for selecionada em qualquer célula, este procedimento irá também acionar o código. Imagino que deveria haver também nesse sentido a exigência de executar o código somente para a linha que atender a uma condição. Imagino que essa condição seja o "Valor" da coluna " I ", ou seja, se não tiver valor nesta coluna, também não executa.

No mais, tudo perfeito.
E muito obrigado.

 
Postado : 10/05/2016 5:17 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Comentei sobre esta possibilidade ao final do meu post anterior, pois você não havia mencionado.
Procure acompanhar a lógica da rotina e analisar as condições na mesma atraves dos "IF" que verá que não é dificil acrescentar novas verificações, lógicamente dependendo das verificações da para ajustar em uma só linha com o uso do "and - Or".
Mas na condição que indicou, referente a coluna "I" - Valor Total da Nota, é só acrescentar as instruções abaixo logo apos a primeira Condição "IF" que é referente a coluna clicada "K" e a que captura o Valor da Coluna "J".

'Verifica se a coluna "K" (11) foi a selecionada
If sCol = 11 Then

           'Captura o Valor na Coluna "I" em relação a linha selecionada
            sValorI = Target.Offset(, -2).Value
            If sValorI = "" Then
                MsgBox "Não é possível realizar alteração nesta linha." & vbCrLf & "Valor Total da Nota em Branco", vbInformation, "Valor Total da Nota Obrigatório !!!"
                Exit Sub
            End If

'Captura o Valor na Coluna "J" em relação a linha selecionada
sValorJ = Target.Offset(, -1).Value

 
Postado : 10/05/2016 7:11 am
(@luizhcosta)
Posts: 0
New Member
Topic starter
 

Perfeito,

Estou analisando o código, já tinha tirado algumas conclusões. Seu código ficou muito bom mesmo.
Obrigado pela ajuda.

Um grande abraço.

 
Postado : 10/05/2016 6:47 pm