Usuário com melhor resposta
Melhorar um código Funcional

Pergunta
-
Boa noite Galera,
Mais uma pergunta, alguém tem alguma ideia de como melhorar este código de VBA e/ou deixá-lo mais rápido:
If lbxMotivo.List(0, 7) <> Empty And lbxMotivo.List(1, 7) <> Empty And lbxMotivo.List(2, 7) <> Empty Then GoTo 3 If lbxMotivo.List(0, 7) <> Empty And lbxMotivo.List(1, 7) <> Empty And lbxMotivo.List(2, 7) = Empty Then GoTo 4 If lbxMotivo.List(0, 7) <> Empty And lbxMotivo.List(1, 7) = Empty And lbxMotivo.List(2, 7) = Empty Then GoTo 5 If lbxMotivo.List(0, 7) = Empty And lbxMotivo.List(1, 7) <> Empty And lbxMotivo.List(2, 7) <> Empty Then GoTo 6 If lbxMotivo.List(0, 7) = Empty And lbxMotivo.List(1, 7) <> Empty And lbxMotivo.List(2, 7) = Empty Then GoTo 7 If lbxMotivo.List(0, 7) = Empty And lbxMotivo.List(1, 7) = Empty And lbxMotivo.List(2, 7) <> Empty Then GoTo 8 If lbxMotivo.List(0, 7) <> Empty And lbxMotivo.List(1, 7) = Empty And lbxMotivo.List(2, 7) <> Empty Then GoTo 9 If lbxMotivo.List(0, 7) = Empty And lbxMotivo.List(1, 7) = Empty And lbxMotivo.List(2, 7) = Empty Then GoTo 10 10: ActiveCell.Offset(0, 2).Select ActiveCell = lbxMotivo.List(0, 6) Exit Sub 9: ActiveCell = "Motivo 1 : " & lbxMotivo.List(0, 7) & Chr(10) & "Motivo 3 : " & lbxMotivo.List(2, 7) ActiveCell.Offset(0, 1).Select ActiveCell = lbxMotivo.List(0, 6) Exit Sub 8: ActiveCell = "Motivo 3 : " & lbxMotivo.List(2, 7) ActiveCell.Offset(0, 1).Select ActiveCell = lbxMotivo.List(0, 6) Exit Sub 7: ActiveCell = "Motivo 2 : " & lbxMotivo.List(1, 7) ActiveCell.Offset(0, 1).Select ActiveCell = lbxMotivo.List(0, 6) Exit Sub 6: ActiveCell = "Motivo 2 : " & lbxMotivo.List(1, 7) & Chr(10) & "Motivo 3 : " & lbxMotivo.List(2, 7) ActiveCell.Offset(0, 1).Select ActiveCell = lbxMotivo.List(0, 6) Exit Sub 5: ActiveCell = "Motivo 1 : " & lbxMotivo.List(0, 7) ActiveCell.Offset(0, 1).Select ActiveCell = lbxMotivo.List(0, 6) Exit Sub 4: ActiveCell = "Motivo 1 : " & lbxMotivo.List(0, 7) & Chr(10) & "Motivo 2 : " & lbxMotivo.List(1, 7) ActiveCell.Offset(0, 1).Select ActiveCell = lbxMotivo.List(0, 6) Exit Sub 3: ActiveCell = "Motivo 1 : " & lbxMotivo.List(0, 7) & Chr(10) & "Motivo 2 : " & lbxMotivo.List(1, 7) & Chr(10) & "Motivo 3 : " & lbxMotivo.List(2, 7) ActiveCell.Offset(0, 1).Select ActiveCell = lbxMotivo.List(0, 6)
Muito obrigado!
Respostas
-
Lucas,
Mais rápido não acho que vai ficar, mas segue uma sugestão:
Public Sub Macro1() Dim valor0_7 As String Dim valor1_7 As String Dim valor2_7 As String valor0_7 = Read(0, 7) valor1_7 = Read(1, 7) valor2_7 = Read(2, 7) If valor0_7 <> Empty And valor1_7 <> Empty And valor2_7 <> Empty Then Execute "Motivo 1 : " & valor0_7 & Chr(10) & "Motivo 2 : " & valor1_7 & Chr(10) & "Motivo 3 : " & valor2_7, 1 End If If valor0_7 <> Empty And valor1_7 <> Empty And valor2_7 = Empty Then Execute "Motivo 1 : " & valor0_7 & Chr(10) & "Motivo 2 : " & valor1_7, 1 End If If valor0_7 <> Empty And valor1_7 = Empty And valor2_7 = Empty Then Execute "Motivo 1 : " & valor0_7, 1 End If If valor0_7 = Empty And valor1_7 <> Empty And valor2_7 <> Empty Then Execute "Motivo 2 : " & valor1_7 & Chr(10) & "Motivo 3 : " & valor2_7, 1 End If If valor0_7 = Empty And valor1_7 <> Empty And valor2_7 = Empty Then Execute "Motivo 2 : " & valor1_7, 1 End If If valor0_7 = Empty And valor1_7 = Empty And valor2_7 <> Empty Then Execute "Motivo 3 : " & valor2_7, 1 End If If valor0_7 <> Empty And valor1_7 = Empty And valor2_7 <> Empty Then Execute "Motivo 1 : " & valor0_7 & Chr(10) & "Motivo 3 : " & valor2_7, 1 End If If valor0_7 = Empty And valor1_7 = Empty And valor2_7 = Empty Then Execute Empty, 2 End If End Sub Public Function Read(row As Integer, col As Integer) As String Return lbxMotivo.List(row, col) End Function Public Sub Execute(texto As String, colOffset As Integer) If (texto <> Empty) Then ActiveCell = texto ActiveCell.Offset(0, colOffset).Select ActiveCell = Read(0, 6) End Sub
O que eu fiz foi retirar os GoTo, que é uma má prática, e transformar os códigos que se repetiam em métodos ou variáveis.
Não testei porque sem a sua planilha não da pra ver se funciona. Verifique e nos avise!
Boa sorte!
- Editado dimascsoares terça-feira, 22 de julho de 2014 21:37 Melhoria
- Marcado como Resposta Lucas_Martins_Silva quarta-feira, 23 de julho de 2014 14:26
-
Lucas,
Só para justificar meu código e contribuir com algo além de um código pronto:
Remover Goto: o GoTo quebra a sequência do código, dificulta a leitura e entendimento na medida que a complexidade do código aumenta.
Remover repetições: um código repetido dificulta a manutenção, pois você precisa corrigir ou alterar em diversos lugares. Sempre que um código se repete, tente criar um método ou uma variável.
Por exemplo:
Public Function Read(row As Integer, col As Integer) As String Return lbxMotivo.List(row, col) End Function
Criando um método, a forma como você recupera esta informação pode ser facilmente alterada caso necessário (ler de outro ListBox, ComboBox, célula...)
Dim valor0_7 As String valor0_7 = Read(0, 7)
Criando estas variáveis, você pode facilmente alterar o local onde essa informação é armazenada, alterando em somente um local.
Outra sugestão: sugiro alterar o nome das variáveis para a informação que elas de fato representam, por exemplo, alterar 'valor0_7' para 'RazaoSocial'. Altere também o nome do método 'Read' para algo como 'ObterMovito'. Isso vai melhorar muito a facilidade de entender seu código!
Espero ter ajudado!
- Marcado como Resposta Lucas_Martins_Silva quarta-feira, 23 de julho de 2014 14:27
Todas as Respostas
-
Lucas,
Mais rápido não acho que vai ficar, mas segue uma sugestão:
Public Sub Macro1() Dim valor0_7 As String Dim valor1_7 As String Dim valor2_7 As String valor0_7 = Read(0, 7) valor1_7 = Read(1, 7) valor2_7 = Read(2, 7) If valor0_7 <> Empty And valor1_7 <> Empty And valor2_7 <> Empty Then Execute "Motivo 1 : " & valor0_7 & Chr(10) & "Motivo 2 : " & valor1_7 & Chr(10) & "Motivo 3 : " & valor2_7, 1 End If If valor0_7 <> Empty And valor1_7 <> Empty And valor2_7 = Empty Then Execute "Motivo 1 : " & valor0_7 & Chr(10) & "Motivo 2 : " & valor1_7, 1 End If If valor0_7 <> Empty And valor1_7 = Empty And valor2_7 = Empty Then Execute "Motivo 1 : " & valor0_7, 1 End If If valor0_7 = Empty And valor1_7 <> Empty And valor2_7 <> Empty Then Execute "Motivo 2 : " & valor1_7 & Chr(10) & "Motivo 3 : " & valor2_7, 1 End If If valor0_7 = Empty And valor1_7 <> Empty And valor2_7 = Empty Then Execute "Motivo 2 : " & valor1_7, 1 End If If valor0_7 = Empty And valor1_7 = Empty And valor2_7 <> Empty Then Execute "Motivo 3 : " & valor2_7, 1 End If If valor0_7 <> Empty And valor1_7 = Empty And valor2_7 <> Empty Then Execute "Motivo 1 : " & valor0_7 & Chr(10) & "Motivo 3 : " & valor2_7, 1 End If If valor0_7 = Empty And valor1_7 = Empty And valor2_7 = Empty Then Execute Empty, 2 End If End Sub Public Function Read(row As Integer, col As Integer) As String Return lbxMotivo.List(row, col) End Function Public Sub Execute(texto As String, colOffset As Integer) If (texto <> Empty) Then ActiveCell = texto ActiveCell.Offset(0, colOffset).Select ActiveCell = Read(0, 6) End Sub
O que eu fiz foi retirar os GoTo, que é uma má prática, e transformar os códigos que se repetiam em métodos ou variáveis.
Não testei porque sem a sua planilha não da pra ver se funciona. Verifique e nos avise!
Boa sorte!
- Editado dimascsoares terça-feira, 22 de julho de 2014 21:37 Melhoria
- Marcado como Resposta Lucas_Martins_Silva quarta-feira, 23 de julho de 2014 14:26
-
Lucas,
Só para justificar meu código e contribuir com algo além de um código pronto:
Remover Goto: o GoTo quebra a sequência do código, dificulta a leitura e entendimento na medida que a complexidade do código aumenta.
Remover repetições: um código repetido dificulta a manutenção, pois você precisa corrigir ou alterar em diversos lugares. Sempre que um código se repete, tente criar um método ou uma variável.
Por exemplo:
Public Function Read(row As Integer, col As Integer) As String Return lbxMotivo.List(row, col) End Function
Criando um método, a forma como você recupera esta informação pode ser facilmente alterada caso necessário (ler de outro ListBox, ComboBox, célula...)
Dim valor0_7 As String valor0_7 = Read(0, 7)
Criando estas variáveis, você pode facilmente alterar o local onde essa informação é armazenada, alterando em somente um local.
Outra sugestão: sugiro alterar o nome das variáveis para a informação que elas de fato representam, por exemplo, alterar 'valor0_7' para 'RazaoSocial'. Altere também o nome do método 'Read' para algo como 'ObterMovito'. Isso vai melhorar muito a facilidade de entender seu código!
Espero ter ajudado!
- Marcado como Resposta Lucas_Martins_Silva quarta-feira, 23 de julho de 2014 14:27
-
Obrigado Kara,
Na sua maneira ficou "mais" entendível....
vlw- Editado Lucas_Martins_Silva quarta-feira, 23 de julho de 2014 14:28