none
Acessar os registradores RRS feed

  • Discussão Geral

  • Boa tarde caros,

    Há possibilidade de declarar variáveis nos registrados da CPU? Alguém sabe se é possível?

    Att!

    segunda-feira, 19 de dezembro de 2016 18:42

Todas as Respostas

  • Poderia dar um exemplo? Não entendi muito bem, talvez por falta de conhecimento de registradores.

    http://www.ambienteoffice.com.br

    segunda-feira, 19 de dezembro de 2016 20:32
    Moderador
  • Os registradores são entre "" um tipo de memória da CPU, eles são mais rápidos, porém com menor espaço de armazenamento, pelo que eu pesquisei é preciso usar linguagem de máquina, e creio que o VBA não tenha biblioteca para isso.... pra saber mais dá uma lida nesse link: http://www.di.ufpb.br/raimundo/Hierarquia/Registradores.html

    terça-feira, 20 de dezembro de 2016 10:40
  • Ah, sim, sei do que está falando.

    Talvez seja possível sim, pois o VBA pode acessar as chamadas API do Windows, e essas chamadas são todas as que estão disponíveis também no C++.

    Você tem algum exemplo de código em VB.NET, C# ou C++ que faça o que quer? Poderia postar? Se sim, basta declarar as chamadas API de procedimentos que não existem no VBA e usá-los por lá.


    http://www.ambienteoffice.com.br - Participe do grupo de WhatsApp sobre Microsoft Office: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    terça-feira, 20 de dezembro de 2016 11:09
    Moderador
  • É a título de dúvida, estou acompanhando um analista que está com uma código que demora para consolidar e formatar um relatório, cerca de 2 minutos e até estouro de memória! Mas vou postar abaixo um código para a gente trabalhar!

    'COD DE FORMATAÇÃO DE TABELA

    Sub tratarZCO081(wrk)
    
    Dim l, c, lMax As Long
    
    c = 1
    l = 2
    
    Range(Rows(1), Rows(6)).Delete
    
    Do While c < 23
        If Cells(1, c) = "" Then
            Columns(c).Delete
            Else
                c = c + 1
        End If
    Loop
    
    lMax = Range("W1").End(xlToRight).End(xlDown).End(xlToLeft).End(xlUp).Offset(1).Row
    
    Do While l < lMax
        If Cells(l, 1) = "" Or Cells(l, 1) = "Material" Then
            Rows(l).Delete
            lMax = lMax - 1
            Else
                l = l + 1
        End If
    Loop
    
    Columns(1).Insert xlToRight
    Cells(1, 1) = "AnoMes"
    Range("A2", "A" & Range("B1").End(xlDown).Row) = Plan3.ano & "/" & Plan3.mes
    
    End Sub


    terça-feira, 20 de dezembro de 2016 11:41
  • Ao inserir um código no fórum, utilize blocos de código. Para utilizar essa ferramenta, clique no botão cuja legenda é “Inserir bloco de código” na barra do editor de mensagens do fórum. Uma janela aparecerá onde você deverá colar seu código cru na caixa de texto à esquerda. Então, selecione a opção Vb.Net na caixa de combinação que você verá em cima à esquerda e depois clique no botão Inserir.

    ---

    Não é necessário acessar a CPU no nível de máquina para resolver seu problema.

    Sua rotina está lenta porque está usando métodos lentos. Muita coisa pode ser alterada para ganhar mais desempenho.

    ---

        Dim l, c, lMax As Long
    Cuidado: Apenas lMax está declarado como Long. Mais informações em: http://ambienteoffice.com.br/blog/variaveis-e-constantes/#cuidado-ao-declarar-mais-de-uma-variavel-numa-instrucao

    ---

    Possivelmente a pequena mudança que fiz abaixo irá tornar seu código mais rápido:

    Sub tratarZCO081(wrk)
        Dim l, c, lMax As Long
        
        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual
        
        c = 1
        l = 2
        
        Range(Rows(1), Rows(6)).Delete
        
        Do While c < 23
            If Cells(1, c) = "" Then
                Columns(c).Delete
                Else
                    c = c + 1
            End If
        Loop
        
        lMax = Range("W1").End(xlToRight).End(xlDown).End(xlToLeft).End(xlUp).Offset(1).Row
        
        Do While l < lMax
            If Cells(l, 1) = "" Or Cells(l, 1) = "Material" Then
                Rows(l).Delete
                lMax = lMax - 1
                Else
                    l = l + 1
            End If
        Loop
        
        Columns(1).Insert xlToRight
        Cells(1, 1) = "AnoMes"
        Range("A2", "A" & Range("B1").End(xlDown).Row) = Plan3.Ano & "/" & Plan3.mes
    
        Application.Calculation = xlCalculationAutomatic
        Application.ScreenUpdating = True
    End Sub
    


    http://www.ambienteoffice.com.br - Participe do grupo de WhatsApp sobre Microsoft Office: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    terça-feira, 20 de dezembro de 2016 11:54
    Moderador
  • Eu compreendo oque você disse, também desabilito o Calculation e o ScreenUpdating, esse cod acima é apenas um exemplo para declararmos as variáveis nos registradores, não tenho acesso ao código do analista! A dúvida mesmo é se é possível utilizar os registradores em vba
    terça-feira, 20 de dezembro de 2016 11:58
  • "A dúvida mesmo é se é possível utilizar os registradores em vba"

    Provavelmente sim. No entanto, por nunca ter usado, não sei onde te indicar.

    Se você me apresentar um código de C++ ou C# que faz o que deseja, conseguirei te ajudar.

    Ou: se você postar um código que queira tornar mais rápido, também posso ajudar.


    http://www.ambienteoffice.com.br || Participe do grupo de WhatsApp sobre Microsoft Office: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    terça-feira, 20 de dezembro de 2016 13:22
    Moderador