none
Melhorar um código Funcional RRS feed

  • 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!

    terça-feira, 22 de julho de 2014 21:08

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!


    terça-feira, 22 de julho de 2014 21:35
  • 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! 

    quarta-feira, 23 de julho de 2014 13:57

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!


    terça-feira, 22 de julho de 2014 21:35
  • 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! 

    quarta-feira, 23 de julho de 2014 13:57
  • Obrigado Kara,

    Na sua maneira ficou "mais" entendível....

    vlw


    quarta-feira, 23 de julho de 2014 14:27