Notifications
Clear all

Planilha Travando com variável LONG e DOUBLE

11 Posts
2 Usuários
0 Reactions
1,566 Visualizações
(@fellipe_jm)
Posts: 0
New Member
Topic starter
 

Bom dia,

Estou com um código para armazenar as alterações que realizo em um planilha, porem quando vou ocultar uma linha ou coluna esta demorando muito para processar, a planilha chega até a travar. Abaixo o código que estou usando.

Sub Log(Pos As Long, NewValue, QualEnde, QualPlanilha As String)

    On Error Resume Next

    If GlbValorAntigo(Pos) = Empty Then
        GlbValorAntigo(Pos) = "VAZIO"
    End If

    If NewValue = Empty Then
        NewValue = "VAZIO"
    End If

    If NewValue = GlbValorAntigo(Pos) Then
        Exit Sub
    End If

   'Armazena nas Variáveis as alterações
    sQualPlanilha = QualPlanilha
    sQualEnde = QualEnde
    sGlbValorAntigo = GlbValorAntigo(Pos)
    sNewValue = NewValue

    Call lancarLog

    GlbValorAntigo(Pos) = Empty
    
End Sub

O que posso fazer para que a planilha não trave mais? Alguém pode me ajudar?

Obrigado

 
Postado : 19/06/2017 5:01 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Qual o tamanho, em MB do seu arquivo ?

 
Postado : 19/06/2017 7:55 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia Fellipe,

Como chegou a conclusão de que as variáveis LONG e DOUBLE estão causando essa lentidão?
Esse código puro e simples não é lento, mas ele depende de outros e outros vão depender dele.
Eu acredito que o problema não seja nesse pedaço do código.

Como você está ocultando as linhas ou colunas?
Você está selecionando a coluna/linha inteira e clicando com o botão direito do mouse e mandando ocultar.
Selecionando toda a coluna, ele já armazena todas as informações contidas no intervalo selecionado e criptografado.
Então a demora é para criptografar isso tudo e armazenar na variável.

No MENU "Início" do Excel mesmo, em "Formatar" da categoria "Células", basta uma célula selecionada, que você consegue ocultar tanto a linha quanto a coluna.
Ou tem como fazer uma gambiarra no evento "SelectionChange", mas poderia comprometer a segurança nesse LOG...

Faz o teste e vê se resolve ocultar as linhas dessa forma.

Qualquer coisa da o grito.
Abraço

 
Postado : 19/06/2017 8:09 am
(@fellipe_jm)
Posts: 0
New Member
Topic starter
 

Qual o tamanho, em MB do seu arquivo ?

893KB

 
Postado : 19/06/2017 10:10 am
(@fellipe_jm)
Posts: 0
New Member
Topic starter
 

Boa tarde Bernardo,

Primeiramente obrigado pela resposta. Seguindo...

Como você está ocultando as linhas ou colunas?
Você está selecionando a coluna/linha inteira e clicando com o botão direito do mouse e mandando ocultar. Sim, estou fazendo desta forma.

No MENU "Início" do Excel mesmo, em "Formatar" da categoria "Células", basta uma célula selecionada, que você consegue ocultar tanto a linha quanto a coluna. Desta forma não trava!

Porém precisaria fazer com que a planilha aceita-se... clicar com o botão direito e clicar em ocultar.... Estou enviando em anexo a planilha com o codigo que estou utilizando, se tiver como dar uma olhada.

Desde já muito obrigado.

 
Postado : 19/06/2017 10:22 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Dá pra simplificar ou fazer de outro jeito, mas tenta assim...
Troca isso:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal target As Range)

    Dim i As Long
    
    'Armazena o Valor anterior
    ReDim GlbValorAntigo(target.Count)

    For i = 1 To target.Count
        GlbValorAntigo(i) = target(i)
    Next i

End Sub

Por isso [ATUALIZADO]:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal target As Range)

    If CheckCol(Replace(target.Address(0, 0), ":", "")) = True Then Exit Sub
    If CheckLin(Replace(target.Address(0, 0), ":", "")) = True Then Exit Sub

    Dim i As Long
    
    'Armazena o Valor anterior
    ReDim GlbValorAntigo(target.Count)

    For i = 1 To target.Count
        GlbValorAntigo(i) = target(i)
    Next i

End Sub


Public Function CheckCol(target As String) As Boolean
Dim i   As Long
Dim n   As Long

    n = 0
    CheckCol = False
    For i = 1 To Len(target)
        If IsNumeric(Mid(target, i, 1)) Then n = n + 1
    Next i
    
    If n = 0 Then CheckCol = True
    
End Function

Public Function CheckLin(target As String) As Boolean
Dim i   As Long
Dim n   As Long

    n = 0
    For i = 1 To Len(target)
        If Not IsNumeric(Mid(target, i, 1)) Then n = n + 1
    Next i
    
    If n = 0 Then CheckLin = True
    
End Function

De imediato, o que ele está fazendo é ignorando a gravação das informações do intervalo selecionado na memória caso seja selecionado uma linha inteira ou coluna inteira.
Com isso não vai demorar e você poderá ocultar ou reexibir normalmente. Entretando, caso selecione a coluna inteira e pressione um "Delete", por exemplo, excluindo todas as informações contidas na coluna, não salvará esse log, como eu disse acima do comprometimento do LOG.

Qualquer coisa da o grito.
Abraço

 
Postado : 19/06/2017 11:06 am
(@fellipe_jm)
Posts: 0
New Member
Topic starter
 

Bernardo,

Deu certinho muito obrigado amigo me salvou aqui.

Outra coisa, teria como fazer corrigindo a questão do "DELETE", para registrarmos também o que apagasse da planilha?

Abraço.

 
Postado : 19/06/2017 11:26 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Cara, essa "ATUALIZAÇÃO" corrigetanto a questão do DELETE quanto ao preenchimento em massa (selecionar um intervalo de células, digitar e finalizar com Ctrl + Enter).

Só não funciona caso seja selecionado a coluna inteira.
Você precisa que delete informações da linha ou coluna inteira?

 
Postado : 19/06/2017 12:18 pm
(@fellipe_jm)
Posts: 0
New Member
Topic starter
 

Bernardo

Só não funciona caso seja selecionado a coluna inteira.
Você precisa que delete informações da linha ou coluna inteira?

Estou selecionando somente um célula e apertando DELETE, e não esta registrando no LOG

 
Postado : 19/06/2017 1:35 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Eu postei o código e depois eu atualizei ele na mesma postagem atualizando algumas coisas e corrigindo isso.
Você pegou o novo código?

Aqui está funcionando normalmente...
Tanto com uma única célula quanto em um intervalo de células.

Tem que ver o que está acontecendo aí para poder contornar isso.

 
Postado : 20/06/2017 5:40 am
(@fellipe_jm)
Posts: 0
New Member
Topic starter
 

Bom dia Bernardo, realmente vacilei aqui. Não tinha visto a atualização do código, agora funcionou perfeitamente, muito obrigado pela sua ajuda amigo.

Abraço.

 
Postado : 21/06/2017 4:13 am