Notifications
Clear all

Tratamento de Erro

12 Posts
3 Usuários
0 Reactions
2,383 Visualizações
(@gilbertob)
Posts: 40
Eminent Member
Topic starter
 

Bom dia,

No código abaixo, ao selecionar o nome de um ou mais empregados na coluna B da aba "Empregados", a macro gera abas adicionais com o nome de cada um dos empregados selecionados, tendo como modelo uma aba nomeada TRCT. Ocorre que, se o usuário, inadvertidamente, selecionar um ou mais nomes cujos TRCT(s) já foram gerados, aparece uma mensagem de erro.

Sub IdentificarSelecionado()

'desativar atualização de tela
Application.ScreenUpdating = False
Worksheets("Empregados").Select

For Each C In Selection
linha = C.Row 'identificar linha da célula selecionada
coluna = C.Column 'identificar coluna da célula selecionada

Call criarTRCT
Next C
Application.ScreenUpdating = True
Application.StatusBar = False
MsgBox "Processamento concluído com sucesso.", , "Pronto!"

End Sub

Tentei corrigir o erro da seguinte forma:

Sub IdentificarSelecionado()
On Error GoTo Erro
'desativar atualização de tela
Application.ScreenUpdating = False
Worksheets("Empregados").Select

For Each C In Selection
linha = C.Row 'identificar linha da célula selecionada
coluna = C.Column 'identificar coluna da célula selecionada

Call criarTRCT
Next C
Application.ScreenUpdating = True
Application.StatusBar = False
MsgBox "Processamento concluído com sucesso.", , "Pronto!"
Exit Sub
Erro:
Msg Box "Já foi gerado o TRCT para este empregado. Selecione outro!", vbInformation, "ERRO"
End Sub

Apesar de aparecer a mensagem de erro, ainda assim é gerada uma aba TRCT(2), o que não deve acontecer.

Como resolver isso?

Atenciosamente,

Gilberto

 
Postado : 03/01/2017 5:34 am
DJunqueira
(@djunqueira)
Posts: 772
Prominent Member
 

Acrescente:

Public Function PlanExiste(NomePlan As String) As Boolean 
    Dim ws As Worksheet 
    PlanExiste = False 
    For Each ws In ActiveWorkbook.Worksheets 
        If UCase(ws.Name) = UCase(NomePlan) Then 
            PlanExiste = True 
            Exit For 
        End If 
    Next ws 
End Function

Se sua dúvida foi respondida marque o tópico como RESOLVIDO usando o botão com marca verde.

 
Postado : 03/01/2017 6:09 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Suponho que primeiro e criada a copia da planilha base e depois renomeada conforme a seleção, assim ao tentar renomear para um nome existente e gerado o erro.
Para contornar pode-se: Detectado o erro, excluir a planilha criada e retornar a mensagem
ou
Verificar; antes de excecutar a rotina "criarTRCT"; se o nome já existe.

Sub IdentificarSelecionado()
Dim nPlan As Integer
'desativar atualização de tela
Application.ScreenUpdating = False
Worksheets("Empregados").Select

For Each C In Selection

linha = C.Row 'identificar linha da célula selecionada
coluna = C.Column 'identificar coluna da célula selecionada
For nPlan = 3 To Worksheets.Count
  ' Teste condicional para verificar se a quantidade de planilha é igual a dois
  ' sinalizando que nenhuma planilha adicional foi incluída
  'Supondo uma planilha base e uma com dados/nomes - altere para sua realidade
  If Worksheets.Count = 2 Then GoTo Cria
  ' Teste concidional para verificar se a planilha' atual tem o nome selecionado,
  ' sinalizando que o nome escolhido já tem uma planilha no arquivo
  If Worksheets(planilha).Name = Cells(linha, coluna) Then
     MsgBox "Já foi gerado o TRCT para este nome: " & Cells(linha, coluna) & ". Selecione outro!", vbInformation, "ERRO"""
     GoTo avante
  End If
 Next planilha

Cria:
Call criarTRCT
avante:
Next C
Application.ScreenUpdating = True
Application.StatusBar = False
MsgBox "Processamento concluído com sucesso.", , "Pronto!"

End Sub

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 03/01/2017 6:13 am
(@gilbertob)
Posts: 40
Eminent Member
Topic starter
 

Obrigado DJunqueira e Reinaldo por atender ao meu pedido.

Com relação a sugestão do DJunqueira, meu conhecimento de vba é muito limitado. Então não entendi onde devo acrescentar o código sugerido. É para mesclar esse código com o outro?

Com relação a sugestão do Reinaldo, substituí o código, mas dá erro na linha "If Worksheets(planilha).Name = Cells(linha, coluna) Then

Parece que tenho que substituir a palavra planilha nesta linha e também logo abaixo onde está escrito Next Planilha, mas não sei o que escrever no lugar.

No caso em questão, quando abro o arquivo eu tenho 4 abas - Empregados, Empregador, Verbas e TRCT. Ao selecionar os nomes na aba Empregados e clicar no botão para gerar planilhas, são criados os respectivos TRCTs adicionais, que recebem o nome dos empregados que foram selecionados. Então, se eu selecionar Andreia de Souza Araújo e Miguel Angelo Duarte será criado abas com os nomes "1 Andrea Araújo" e "2 Miguel Duarte". No código criarTRCT, está assim:

Sheets("TRCT").Select
Sheets("TRCT").Copy After:=Sheets(4)
'renomear a cópia com o nome do empregado
Sheets(5).Name = apelido
'colocar os dados na nova planilha
Sheets(5).Select

Atenciosamente,

Gilberto

 
Postado : 03/01/2017 8:56 am
DJunqueira
(@djunqueira)
Posts: 772
Prominent Member
 

Testa:

Dim ws As Worksheet 

Sheets("TRCT").Select
Sheets("TRCT").Copy After:=Sheets(4)
'renomear a cópia com o nome do empregado
For Each ws In ActiveWorkbook.Worksheets 
        If UCase(ws.Name) = UCase(apelido) Then 
               GoTo PulaRenomear
        End If 
Next ws 

Sheets(5).Name = apelido
'colocar os dados na nova planilha
PulaRenomear:
Sheets(5).Select

Se sua dúvida foi respondida marque o tópico como RESOLVIDO usando o botão com marca verde.

 
Postado : 03/01/2017 7:48 pm
(@gilbertob)
Posts: 40
Eminent Member
Topic starter
 

Boa noite DJunqueira,

Testei a tua sugestão. Não mais ocorre a mensagem de "Erro em Tempo de Execução 1004, mas ainda assim a planilha modelo TRCT é duplicada. Ao final do processamento tenho a TRCT(2).

Abraço,

Gilberto

 
Postado : 03/01/2017 9:38 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Substitua "Planilha" por "nPlan" e veja se funciona.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 04/01/2017 5:06 am
(@gilbertob)
Posts: 40
Eminent Member
Topic starter
 

Bom dia Reinado,

Fiz o que vc sugeriu. O resultado foi o seguinte: não aparece mais a mensagem Erro em tempo de execução 1004, o código é executado até o final, ou seja, até aparecer a mensagem "Processamento concluído com sucesso".

A outra mensagem "´Já foi gerado o TRCT...." não aparece. E no final, tenho a planilha modelo TRCT duplicada.

Abraços,

Gilberto

 
Postado : 04/01/2017 7:13 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Sem ver seu modelo, fica dificil. Não da para ter a planilha duplicada, já que o próprio sistema impede, Deveria se houver um nome ja no arquivo, passar para o proximo

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 04/01/2017 7:49 am
(@gilbertob)
Posts: 40
Eminent Member
Topic starter
 

Boa tarde, Reinaldo

Segue o arquivo. Aproveitando a oportunidade, no meu local de trabalho o excel é o 2003 e, em casa, o 2013. Não sei o motivo, mas sempre que abro o arquivo no trabalho, ao clicar no botão para selecionar os empregados aparece uma mensagem de erro ((#Ref!)).

Daí, tenho que clicar com o botão direito e novamente atribuir o nome correto para a macro. A que se deve este erro?

 
Postado : 04/01/2017 10:11 am
DJunqueira
(@djunqueira)
Posts: 772
Prominent Member
 

Planilha anexa funcionou como esperado com código adicionado.

Se sua dúvida foi respondida marque o tópico como RESOLVIDO usando o botão com marca verde.

 
Postado : 05/01/2017 1:12 am
(@gilbertob)
Posts: 40
Eminent Member
Topic starter
 

Boa tarde amigos,

Funcionou perfeitamente. Obrigado pela ajuda DJunqueira e também ao Reinaldo.

Abraços,

Gilberto.

 
Postado : 05/01/2017 2:25 pm