Notifications
Clear all

Editor VBA

16 Posts
3 Usuários
0 Reactions
2,225 Visualizações
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Existe algum Editor de código VBA fora o próprio?
achei para outras linguagens, mas não para vba.

Explico,
minha macro apesar de ser simples tem um fluxo lógico meio complicado "sem falar das variáveis malucas que eu criei"
um bloco da macro que vai passar por vários seguimentos até chegar no bloco final "mesma macro"
então eu sou obrigado a ficar percorrendo a folha para fazer a macro.

sei que tem o marcador de posição mas não me dei muito bem com aquilo.
Até

 
Postado : 22/04/2014 11:04 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

acabei de achar um, mas não sei se atende ao VBA
Snippet Editor
http://snippeteditor.codeplex.com/

bem pelo menos dá pra ter uma melhor visão do código, se alguém tiver alguma dica para editar macros grandes

 
Postado : 22/04/2014 11:53 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Não conheço esse editor, e utilizo basicamente o editor do VBA. Quanto a códigos "muito" grandes, li que há um limite de linhas em um único modulo (não me recordo onde li e qual é esse limite), porem é preciso ficar atento.
Quando o código tende a ficar extenso, e dificultar a leitura do mesmo, costumo "quebra-lo", dividindo em sub rotinas, chamadas da rotina principal.

 
Postado : 23/04/2014 6:29 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

esse editor que postei é muito bugado e bastante limitado "não tem nem como desfazer alguma edição feita" fora o fato de ser bem lento.

Eu tbm faço isso de quebrar, chamo de macros auxiliares "que são usadas por mais de uma macro", e sub macros "blocos das macros"
mas existe o inconveniente de ter que ter variáveis publicas, e eu já tenho um monte.
A macro nem é tão grande assim, ainda está com 300 linhas fora as sub macros e está num formulário.

Mesmo quebrando a macro ainda tem que se seguir uma linha de raciocínio linear, ainda mais em operações lógicas onde existem muitos fatores de comparação e de valores.

(Acabei de descobrir que em "FERRAMENTAS > OPÇÕES > FORMATO DO EDITOR " tem como mudar as cores das coisas (agora ficou mais fácil)

será que tem como trocar cor de trechos ou destacar valores específicos ???
Dividir a janela do modulo para rolagem individual tbm seria legal.

 
Postado : 23/04/2014 8:03 am
(@gtsalikis)
Posts: 2373
Noble Member
 

Edcronos, eu sei que a partir do Excel 2010 vc pode usar o Visual Studio, que, segundo meu professor, utiliza a linguagem C# (talvez dê pra usar VBA, não sei)

Como ambos são da Microsoft, a informação pode te ajudar.

Eu ainda não cheguei lá, mas talvez vc possa jogar no google e ver o que encontra.

 
Postado : 23/04/2014 8:12 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia!!

Até onde sei há um único Editor VB.

Att

 
Postado : 23/04/2014 8:20 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

eu ia baixar Visual Studio para testar mas parece que são 2 gb e numa internet de 800k fica inviável apenas para um teste.
sobre:

Eu ainda não cheguei lá

eu tbm não, mas é bom olhar para o horizonte antes de escolher um caminho.
as vezes o caminho é fácil no começo mas tortuoso na maior parte.

Sobre edito, é apenas para escrever e abalizar, tem editores que apenas ajudam a escrever os códigos mas os que achei são pagos.

Mas trocando as cores já deu uma boa melhorada, eu deixei o meu assim:
If Loi = OLfc Or Loi = OLic Then
Cqo = Oci: OLic = OLic - OcqL: OLfc = OLfc - OcqL: Lig = Lig * -1: Loi = Loi - OcqL + Lig:
End If

Se tivesse como marcar palavras inteiras ou expressões "como trocar a cor de fundo e dividir a janela para rolagem" já seria de muita ajuda

uma oisa que facilitaria desenvolvimento e a edição seria "Recolher" partes ou trechos da macro, adicionando um nome "marcador" para a tela não ficar tão poluída de textos.
uma macro para o word talvez se possa fazer isso
assim como assinalar os códigos dependentes, como o IF Then "End IF",
como quando se está escrevendo uma formula no excel, e se adiciona um ") "o excel assinala o seu oposto.

 
Postado : 23/04/2014 10:09 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Dentro de vários if ou mesmo um, uma boa pratica é indentar (não sei se o termo e o correto) as passagens, ou seja tentar listas começo e fim de cada Case Loop For If etc..
Julgo e é mais simples e fácil "ler um trecho/código assim:

Public Function QSIGNO(fData As Date) As String
'---------------------------------------------------------------------------------------
Dim iMes As Integer
Dim iDia As Integer
On Error GoTo Erro_QSIGNO

iMes = Month(fData)
iDia = Day(fData)
    
    Select Case iMes
        Case 1
            If iDia < 22 Then
                QSIGNO = "Capricórnio"
            Else
                QSIGNO = "Aquário"
            End If
        Case 2
            If iDia < 20 Then
                QSIGNO = "Aquário"
            Else
                QSIGNO = "Peixes"
            End If
        Case 3
            If iDia < 21 Then
                QSIGNO = "Peixes"
            Else
                QSIGNO = "Áries"
            End If
        Case 4
            If iDia < 21 Then
                QSIGNO = "Áries"
            Else
                QSIGNO = "Touro"
            End If
        Case 5
            If iDia < 21 Then
                QSIGNO = "Touro"
            Else
                QSIGNO = "Gêmeos"
            End If
        Case 6
            If iDia < 21 Then
                QSIGNO = "Gêmeos"
            Else
                QSIGNO = "Câncer"
            End If
        Case 7
            If iDia < 23 Then
                QSIGNO = "Cancer"
            Else
                QSIGNO = "Leão"
            End If
        Case 8
            If iDia < 24 Then
                QSIGNO = "Leão"
            Else
                QSIGNO = "Virgem"
            End If
        Case 9
            If iDia < 23 Then
                QSIGNO = "Virgem"
            Else
                QSIGNO = "Libra"
            End If
        Case 10
            If iDia < 24 Then
                QSIGNO = "Libra"
            Else
                QSIGNO = "Escorpião"
            End If
        Case 11
            If iDia < 23 Then
                QSIGNO = "Escorpião"
            Else
                QSIGNO = "Sagitário"
            End If
        Case 12
            If iDia < 22 Then
                QSIGNO = "Sagitário"
            Else
                QSIGNO = "Capricórnio"
            End If
    End Select
Saida:
   Exit Function
Erro_QSIGNO:
    MsgBox Err.Description & vbCrLf & vbCrLf & _
        "No módulo Módulo1, tipo Módulo, procedimento QSIGNO", _
        vbExclamation + vbOKOnly, "Erro: " & CStr(Err.Number)
#If DESENV Then
    Stop
    Resume
#End If
    Resume Saida
End Function

Do que assim:

Public Function QSIGNO(fData As Date) As String
'---------------------------------------------------------------------------------------
Dim iMes As Integer
Dim iDia As Integer
On Error GoTo Erro_QSIGNO

iMes = Month(fData)
iDia = Day(fData)
    
Select Case iMes
Case 1
If iDia < 22 Then
QSIGNO = "Capricórnio"
Else
QSIGNO = "Aquário"
End If
Case 2
If iDia < 20 Then
QSIGNO = "Aquário"
Else
QSIGNO = "Peixes"
End If
Case 3
If iDia < 21 Then
QSIGNO = "Peixes"
Else
QSIGNO = "Áries"
End If
Case 4
If iDia < 21 Then
QSIGNO = "Áries"
Else
QSIGNO = "Touro"
End If
Case 5
If iDia < 21 Then
QSIGNO = "Touro"
Else
QSIGNO = "Gêmeos"
End If
Case 6
If iDia < 21 Then
QSIGNO = "Gêmeos"
Else
QSIGNO = "Câncer"
End If
Case 7
If iDia < 23 Then
QSIGNO = "Cancer"
Else
QSIGNO = "Leão"
End If
Case 8
If iDia < 24 Then
QSIGNO = "Leão"
Else
QSIGNO = "Virgem"
End If
Case 9
If iDia < 23 Then
QSIGNO = "Virgem"
Else
QSIGNO = "Libra"
End If
Case 10
If iDia < 24 Then
QSIGNO = "Libra"
Else
QSIGNO = "Escorpião"
End If
Case 11
If iDia < 23 Then
QSIGNO = "Escorpião"
Else
QSIGNO = "Sagitário"
End If
Case 12
If iDia < 22 Then
QSIGNO = "Sagitário"
Else
QSIGNO = "Capricórnio"
End If
End Select
Saida:
Exit Function
Erro_QSIGNO:
MsgBox Err.Description & vbCrLf & vbCrLf & _
"No módulo Módulo1, tipo Módulo, procedimento QSIGNO", _
vbExclamation + vbOKOnly, "Erro: " & CStr(Err.Number)
#If DESENV Then
Stop
Resume
#End If
Resume Saida
End Function
 
Postado : 23/04/2014 10:21 am
(@gtsalikis)
Posts: 2373
Noble Member
 

uma oisa que facilitaria desenvolvimento e a edição seria "Recolher" partes ou trechos da macro, adicionando um nome "marcador" para a tela não ficar tão poluída de textos.

Isso vc pode fazer com blocos ou com subrotinas.

assim como assinalar os códigos dependentes, como o IF Then "End IF",
como quando se está escrevendo uma formula no excel, e se adiciona um ") "o excel assinala o seu oposto.

Para isso a gente utiliza a indentação, pois fica fácil de visualizar quais os passos de um comando.

 
Postado : 23/04/2014 10:22 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Isso vc pode fazer com blocos ou com subrotinas.

se for separar a macro em partes, a tela ainda fica poluída,
Se for algo diferente por favor me explique como faço.

Fica difícil quebrar a macro enquanto se esta desenvolvendo, ainda mais no meu caso em que eu imagino e adiciono, e é tudo por variáveis, como vc viu no pequeno trecho da macro lá em cima, então eu teria que tornar todas as variáveis em publicas e não apenas as de controle e transferência.

indentação, eu faço , mas como falei anteriormente "em outro post" me confundo um pouco então faço por blocos

esse é apenas um trecho da macro:

...
...........(um monte de testes, escolhas, verificações e cálculos)
....
If Vert_D = True Then

        Dim Lag As Long
                    If DLinesC <> "" Then DcqL = DLinesC Else DcqL = Cq_O
             If DcqL < 1 Or DcqL > TLio Then MsgBox "Valo de quadrante  entre " & "1 " & TLio: GoTo Saida
             
        Lag = 1: Zag = 1
        DLic = OLf - (DcqL - 1): DLfc = OLf
        Ldi = DLic - 1
        Cqd = Dci
        
        If Dinvert_Col = True Then Zag = -1: Dci = Dcf: Dcf = Cqd: Cqd = Dci '----( inverte ordem Escrita coluna )
        If Invert_D = True Then Lag = -1: DLic = OLf: DLfc = OLf - (DcqL - 1): Ldi = DLic + 1
        If Zagi = True Then DLfc = DLfc + Lag: DLic = DLic + (Lag * -1)

End If 'Vert_D

...................... *(  um monte de testes de valores  )* .......................

  If Tm1 = 1 Then
    
  If Vert_D = True Then
        If Zagi = False Then
            Ldi = Ldi + Lag
            If Ldi = DLfc + Lag Then Ldi = DLic: Cqd = Cqd + Zag
            If Ldi = DLic And Cqd = Dcf + Zag Then DLfc = DLfc - DcqL: DLic = DLic - DcqL: Ldi = DLic: Cqd = Dci
        End If 'ZAgi false

        If Zagi = True Then
        
            Ldi = Ldi + Lag
             If Cqd <> Dcf Then
                If Ldi = DLfc Or Ldi = DLic Then Cqd = Cqd + Zag: Lag = Lag * -1: Ldi = Ldi + Lag
            End If
                                 
          If Cqd = Dcf Then
            If Ldi = DLfc Or Ldi = DLic Then
                 Cqd = Dci: DLic = DLic - DcqL: DLfc = DLfc - DcqL: Lag = Lag * -1: Ldi = Ldi - DcqL + Lag
             End If
           End If
        End If 'ZAgi true      

End If 'Vert_D

If Vert_D = False Then
                    If Zagi = True Then
                          If Cqd = Dci And Zag = -1 Then Zag = 1: Ldi = Ldi - 1: Cqd = Cqd - 1
                          If Cqd = Dcf And Zag = 1 Then Zag = -1: Ldi = Ldi - 1: Cqd = Cqd + 1<<<<<<vou editar para excluir uma linha
                          Cqd = Cqd + Zag
                    End If
...(o mesmo trecho continua)
....(mais um monte de teste antes de voltar para o loop)
  Cells(Ldi, Cqd) = Ddo
Loop Until Loi = OLi - 1 Or Ldi < OLi - 1 '----<<<--------------<<<---( Loop até total de Linhas da Origem )---<<<--------

Copia_De_AuxB
If Latrea = True Then Lat
Saida:
        Application.Calculation = xlCalculationAutomatic
        Application.ScreenUpdating = True
End Sub

como pode ve apesar de serem comando simples, mas por serem Co-dependentes e terem que ficar em posições especificas da macro, e por serem parte de um Loop, fica difícil quebrar o codigo, não é impossível , mas teria que tornar todas as variáveis em publicas e tem muitas mais.

Mas só a troca de Cores já ajudou e muito acompanhar o código, "em alguns pontos atrapalha por ficar parecendo uma colcha de retalhos"

 
Postado : 23/04/2014 11:38 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Eu não tenho certeza, mas acho que ha muito tempo atras eu tinha um programinha parecido com este que mostrou, só estou na duvida se ele era separado ou vinha junto com o Visual Basic que tinha instalado, de qq forma vou dar uma olhada e se achar anexo o mesmo. Se fosse em relação as APIs eu até tenho um que orienta.

Agora quanto a questão do tamanho das rotinas, eu sou da opinião em dividi-las, manter rotinas com instruções gigantes fica mais dificil nos orientar e está mais suscetível a erro.
Uma outra coisa que devemos ter sempre em mente, é que o VBA é uma ferramenta poderosa igual ao excel, até se desenvolvem Virus em VBA.
Em muitos casos apos o desenvolvimento das rotinas, tudo funcionando, eu começo a analisar os pormenores que nos passam despercebidos, tipo : Declarações de Variáveis desnecessárias, Condições If else... Cases que poderiam ser transformado em Function ou permanecerem com Publicas, outra coisa que eu ja vi muito e apesar de não utilizar são os Modulos de Classe, vejo muito aplicativo feito por experts em que utilizam muito, simplificando a compilação.
Em uma olhada rápida nas instruções que colocou, lógicamente não sei o que são as Variáveis e diz ser somente uma parte, mas logo no inicio temos a condição :
If Vert_D = True Then
e depois algumas instruções, e apos o End If temos "If Tm1 = 1 Then" e novamente If Vert_D = True Then e apos o fechamento deste If temos If Vert_D = False Then.
Lógico que o ideal é alem de ter a Macro completa ter a aplicação para poder entender cada passo, mas o que citei acima seria o caso de utilizar o Else e eliminar uma verificação se True.

[]s

 
Postado : 23/04/2014 12:41 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Ainda não sei fazer funções
eu uso else, nesse caso que vc citou , a primeira parte é para redefinir as variáveis que serão usadas pela segunda

essa parte do codigo está funcionando bem, mas ainda estou editando para deixar mais limpo, antes de adicionar os outros fatores
antes de entrar nela tem um monte de testes de e ajuste na planilha como adicionar e excluir colunas localizar setores e definir as
variaveis.
precisa analisar não, e não reparem na bagunça,

If Dda <> "" Then ddai = Dda.Value Else ddai = 0
 Tm1 = 1 'teste de valor ok
 
Ldi = OLf: Cqd = Dci: Zag = 1

        Loi = OLf:
        Cqo = Oci - 1:
        Zig = 1
        'If Zigi = True Then Cqo = Oci - 1
If Zagi = True Then Cqd = Dci - 1


        If Invert_O = True Then
        Cqo = Ocf + 1
         If Zigi = True Then Loi = Loi + 1: Cqo = Ocf
         End If
         
        If Invert_D = True Then
        Cqd = Dcf
          If Zagi = True Then Ldi = Ldi + 1
        End If
  '**************************************************************************************************************
 '------------------------------------------( Quadrante Leitura )--------------------------------------------------------------------------------------
If Vert_O = True Then

        Dim Lig As Long
                    If OLinesC <> "" Then OcqL = OLinesC Else OcqL = Cq
             If OcqL < 1 Or OcqL > TLio Then MsgBox "Valo de quadrante  entre " & "1 " & TLio: GoTo Saida
             
        Lig = 1: Zig = 1
        OLic = OLf - (OcqL - 1): OLfc = OLf
        Loi = OLic - 1
        Cqo = Oci
        
        If Oinvert_Col = True Then Zig = -1: Oci = Ocf: Ocf = Cqo: Cqo = Oci '----( inverte ordem leitura coluna )
        If Invert_O = True Then Lig = -1: OLic = OLf: OLfc = OLf - (OcqL - 1): Loi = OLic + 1
        If Zigi = True Then OLfc = OLfc + Lig: OLic = OLic + (Lig * -1)

End If 'Vert_O
If Vert_D = True Then

        Dim Lag As Long
                    If DLinesC <> "" Then DcqL = DLinesC Else DcqL = Cq_O
             If DcqL < 1 Or DcqL > TLio Then MsgBox "Valor de quadrante  entre " & "1 " & TLio: GoTo Saida
             
        Lag = 1: Zag = 1
        DLic = OLf - (DcqL - 1): DLfc = OLf
        Ldi = DLic - 1
        Cqd = Dci
        
        If Dinvert_Col = True Then Zag = -1: Dci = Dcf: Dcf = Cqd: Cqd = Dci '----( inverte ordem Escrita coluna )
        If Invert_D = True Then Lag = -1: DLic = OLf: DLfc = OLf - (DcqL - 1): Ldi = DLic + 1
        If Zagi = True Then DLfc = DLfc + Lag: DLic = DLic + (Lag * -1)

End If 'Vert_D
 '---------------------------------------------( Quadrante )--------------------------------------------------------------------------------------
Do '---------------------------------Loi = OLi - 1 Or Ldi < OLi - 1  '----<<<--------------<<<---( Loop até total de Linhas da Origem)---<<<--------
If Vert_O = True Then
        If Zigi = False Then
                     Loi = Loi + Lig
            If Loi = OLfc + Lig Then Loi = OLic: Cqo = Cqo + Zig
            If Loi = OLic And Cqo = Ocf + Zig Then OLfc = OLfc - OcqL: OLic = OLic - OcqL: Loi = OLic: Cqo = Oci
        End If 'Zigi false

        If Zigi = True Then
            Loi = Loi + Lig
             If Cqo <> Ocf Then
                If Loi = OLfc Or Loi = OLic Then
                    Cqo = Cqo + Zig: Lig = Lig * -1: Loi = Loi + Lig:
                End If
            End If
                                 
          If Cqo = Ocf Then
            If Loi = OLfc Or Loi = OLic Then
                 Cqo = Oci: OLic = OLic - OcqL: OLfc = OLfc - OcqL: Lig = Lig * -1: Loi = Loi - OcqL + Lig:
             End If
           End If
        End If 'Zigi true
End If 'Vert_O
 '------------------------------------------( Quadrante )--------------------------------------------------------------------------------------
  '***************************************************************************************************************
  If Vert_O = False Then
                If Zigi = True Then
                    If Cqo = Oci And Zig = -1 Then Zig = 1: Loi = Loi - 1: Cqo = Cqo - 1
                    If Cqo = Ocf And Zig = 1 Then Zig = -1: Loi = Loi - 1: Cqo = Cqo + 1
                    Cqo = Cqo + Zig 'Coluna origem
                End If
If Zigi = False Then
               If Invert_O = False Then
                        Cqo = Cqo + Zig
                        If Cqo > Ocf Then Cqo = Oci: Loi = Loi - 1
                    End If
                    
                    If Invert_O = True Then
                    Cqo = Cqo - Zig
                      If Cqo < Oci Then Cqo = Ocf: Loi = Loi - 1
                    End If
           End If 'If Zigi = False Then
    End If ' If Vert_O = false Then
    
Ddo = Cells(Loi, Cqo).Value '-<<<----------------------------------<<<<----( Le Dados )---------------------
          
'--------------------------------------------------------------------------------( Testes de valores "adicionando" )-----------
                                If Dif = True Then
                                 Tm1 = 1
...chama macro
                                            If ...valor não corresponde Then Tm1 = 0
                                           ...
                                            ...
                                 End If  'Dif = True
'----------------------------------------------------------------- ( Setor de Destino )--------------
  If Tm1 = 1 Then
    
  If Vert_D = True Then
        If Zagi = False Then
            Ldi = Ldi + Lag
            If Ldi = DLfc + Lag Then Ldi = DLic: Cqd = Cqd + Zag
            If Ldi = DLic And Cqd = Dcf + Zag Then DLfc = DLfc - DcqL: DLic = DLic - DcqL: Ldi = DLic: Cqd = Dci
        End If 'ZAgi false

        If Zagi = True Then
        
            Ldi = Ldi + Lag
             If Cqd <> Dcf Then
                If Ldi = DLfc Or Ldi = DLic Then Cqd = Cqd + Zag: Lag = Lag * -1: Ldi = Ldi + Lag
            End If
                                 
          If Cqd = Dcf Then
            If Ldi = DLfc Or Ldi = DLic Then
                 Cqd = Dci: DLic = DLic - DcqL: DLfc = DLfc - DcqL: Lag = Lag * -1: Ldi = Ldi - DcqL + Lag:
             End If
           End If
        End If 'ZAgi true
        
        Cells(Ldi, Cqd) = Ddo
        
End If 'Vert_D

If Vert_D = False Then
                    If Zagi = True Then
                          If Cqd = Dci And Zag = -1 Then Zag = 1: Ldi = Ldi - 1: Cqd = Cqd - 1
                          If Cqd = Dcf And Zag = 1 Then Zag = -1: Ldi = Ldi - 1: Cqd = Cqd + 1
                          Cqd = Cqd + Zag
                    End If
                    
        Cells(Ldi, Cqd) = Ddo '---<<<----------------------------------<<<<----( Grava Dados )----------<<<<-----------
        
                If Zagi = False Then
                        If Invert_D = False Then
                              Cqd = Cqd + Zag
                              If Cqd = Dcf + 1 Or Cqd > Dcf Then Cqd = Dci: Ldi = Ldi - 1
                        End If
                       If Invert_D = True Then
                                Cqd = Cqd - Zag
                                If Cqd = Dci - 1 Or Cqd < Dci Then Cqd = Dcf: Ldi = Ldi - 1
                      End If
                End If 'zagi
                
       End If ' If Vert_d = false Then
End If 'Tm1

Loop Until Loi = OLi - 1 Or Ldi < OLi - 1 '----<<<--------------<<<---( Loop até total de Linhas Da Origem)---<<<--------
''---------------------------------------------------------------------------------------------------------------------------------------------( Fim do loop )----

'***************************************Fim
Copia_De_AuxB
If Latrea = True Then Lat
Saida:
        Application.Calculation = xlCalculationAutomatic
        Application.ScreenUpdating = True
End Sub
''--------------------------------------------------------------------------( Fim )----------------( Realocar )---------------

vai mudar pouca coisa nessa parte, apenas que pela inclusão de uma variavel vou poder reescrever algumas partes e diminuir algumas linhas creio que 8 apesar do codigo ficar mais dificil de ser definido,

mas como já está funcionando na perfeição, e oq estiver de errado ou precisar de adicionar vai ser antes de entrar nele.

pior que ainda vou ter que escrever uma parte mais chata ainda, bem maior e com cálculos matemáticos.
por isso que perguntei sobre um editor para facilitar o desenvolvimento.

 
Postado : 23/04/2014 2:05 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Edcronos,

Fica como já dito, fica difícil saber o que vc está fazendo no código, e vc mesmo disse que não é pra analisar. Porém, eu ainda acho que, quando se tem muitos IFs, existe uma possibilidade de simplificar. (Não me leve a mal, eu sei que os IFs são necessários, mas pra mim, é algo que procuro evitar ao máximo).

Essa linha, por exemplo:

If Cqd = Dcf + 1 Or Cqd > Dcf Then Cqd = Dci: Ldi = Ldi - 1

Creio que poderia ficar assim:

If Cqd > Dcf Then Cqd = Dci: Ldi = Ldi - 1

ou assim:

If Cqd >= Dcf + 1 Then Cqd = Dci: Ldi = Ldi - 1

Mas isso foi só numa olhada rápida.

Da mesma forma, como o Mauro sugeriu criar as funções, se vc vai implementar muitos cálculos, o ideal é ter funções que façam esses cálculos todos. (Fazer uma função e escrever uma sub é muito próximo, no link abaixo tem uma comparação bem básica:

viewtopic.php?f=10&t=10984

 
Postado : 23/04/2014 2:39 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

é,
mas como falei ainda estou limpando e redefinindo,
Essa é aquela macro que somente ficava legal na segunda vez que executava,Ja limpei e redefini muita coisa.

o codigo por ser de logica meio complicada,
eu executava, via o resultado, e ia mudando os valores,
e nos testes eu colocava -1 +1 para ver a variação do deslocamento.
Mudei muitas vezes "não tenho o raciocínio tão bom assim para fazer tudo de primeira.

mas nessas partes a maioria do +1 e -1 vai ser trocada por Lig e Lag que que tem seus valores entre -1 e +1 dependendo da direção da leitura e escrita.
então consequentemente tem que ser "="

repare nessa sequencia
If Cqd = Dcf Then
If Ldi = DLfc Or Ldi = DLic Then
Cqd = Dci: DLic = DLic - DcqL: DLfc = DLfc - DcqL: Lag = Lag * -1: Ldi = Ldi - DcqL + Lag:
End If
End If
Lag tem seu Valor "invertido" antes da próxima operação

If Ldi = DLic And Cqd = Dcf + Zag Then

Cqd = Dcf + Zag >>> "Cqd = Dcf + 1" "Cqd = Dcf + -1"
assim eu evito de fazer varias verificações seguidas

sobre os muitos if
If Cqd = Dcf Then
If Ldi = DLfc Or Ldi = DLic Then

só entra no segundo se a primeira for atendida

enquanto :
If Cqd = Dcf And Ldi = DLfc Or Cqd = Dcf And Ldi = DLic Then
esta além de ser mais complicada analisar,
Mesmo "Cqd = Dcf" sendo falso vai ser analisado 2 vezes fazendo portanto + 3 comparações desnecessárias." isso na minha teoria".
SE for correto meu ponto de vista, apesar do tempo adicional se pequeno num loop de verificação de mais de 6000 linhas X 40 colunas ou muito mais dependendo do caso, alguns milissegundos economizados vai se somar a outros na mesma perspectiva.

E Infelizmente não tenho a menor ideia de como fazer uma função, já li um monte de coisa a respeito mas não consegui aplicar.

mas nesse caso não sei se iria diminuir as linhas de comando, por estarem sem repetições e em cascata " só passa para a segunda se a primeira for aceita

Sobre a macro, ela le setor de origem que pode estar em outra planilha, le o setor de destino "pode ser o mesmo setor de origem", dependendo das escolha nas Combobox, textbox,e das caixas de seleções "é um conjunto, pode ser todas ou nenhuma" ,

copia da origem para o setor Auxa faz os ajustes necessários no setor de destino adicionando ou excluindo colunas,
verifica os parâmetros dos dois setores e define as variáveis
ela faz a leitura dos dados no setor auxa celula por celula
A sequencia de leitura é muito grande para especificar
e grava no setor auxB que tem as mesmas possibilidades

origem e destino podem ter tamanhos diferentes
dá para transformar um setor de "1000 linha X 40" colunas em "40 linhas X 1000 colunas" podendo escolher se os dados da direita vão estar em cima ou em baixo e os dados de cima vão estar na direita ou esquerda, ou fazer tudo em zig zag :P,é apenas um dos exemplos.

alem das filtragens de valores e mais algumas coisas

depois copia tudo no setor de destino
lendo assim parece até que é uma rotina complicada mas é até bem simples.

 
Postado : 23/04/2014 4:04 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

tanta coisa que baixo da internet que achei instalado no pc um tal de E.M.P.U. :P
ele faz até indentação automática "eu acho" mexi num troço aqui que mudou algo.
bem ainda estou aprendendo a usar, e ainda não sei se vai ser de utilidade.
lista um monte de linguagem, mas de vb só um tal de VBscrypt.

 
Postado : 25/04/2014 12:17 am
Página 1 / 2