Notifications
Clear all

Como tratar erro de compilação ?

11 Posts
5 Usuários
0 Reactions
2,376 Visualizações
(@luizhcosta)
Posts: 0
New Member
Topic starter
 

Olá,

Estou com uma situação em que, uma macro funciona na versão Office 2010 (excel) mas não na versão 2000. Trata-se de um intervalo de dados que será classificado. Esse código é do colega brunoxro e que foi postado solucionando meu post anterior "Ordenação via VBA em 5 colunas". Ocorre que, os testes foram feitos na versão Excel 2010, quando fui executar na versão 2000 ocorreu o erro "ERRO DE COMPILAÇÃO - Método ou membro de dados não encontrado". O destaque é para a parte do código,

WsDados.[b]Sort[/b].SortFields.Clear

Gostaria de contar com a ajuda de alguém para visualizar uma forma de contornar esse erro.

Tentando analisar o código, confirmei que que a variável "WsDados" foi declarada normalmente, por isso não sei como seria a solução.

Abaixo o código:

Sub ClassificarDados()
    
'Application.ScreenUpdating = False
    'Nesta pasta de trabalho
    ThisWorkbook.Activate
    
    'Parte que copia os valores
    Sheets("Situação Desejada").Cells.Clear
    
    Sheets("Situação Atual").Select
    Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
        
    Sheets("Situação Desejada").Select
    Range("A1").Select
    ActiveSheet.Paste
    
'---------------------------------------------------
    
    'Parque que organiza os dados
    Dim WsDados As Worksheet
    Dim UltLin As Double
    
    'Caso sua planilha seja de nome diferente apenas altere o nome _
    dentro de Sheets(" Nome da sua planilha aqui ")
    Set WsDados = Sheets("Situação Desejada")
    
    WsDados.Select
    
    'Pega o valor da última linha
    UltLin = Cells(1, 1).End(xlDown).Row
    
    Range("A1").Select
    
    'Código gerado por macro e adaptado.
    WsDados.[b]Sort[/b].SortFields.Clear
    WsDados.Sort.SortFields.Add Key:=Range( _
        "B2:B" & UltLin), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    WsDados.Sort.SortFields.Add Key:=Range( _
        "C2:C" & UltLin), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    WsDados.Sort.SortFields.Add Key:=Range( _
        "D2:D" & UltLin), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    WsDados.Sort.SortFields.Add Key:=Range( _
        "E2:E" & UltLin), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    WsDados.Sort.SortFields.Add Key:=Range( _
        "F2:F" & UltLin), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With WsDados.Sort
        .SetRange Range("A1:F" & UltLin)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    'Ajeita as colunas
    Columns("A:F").EntireColumn.AutoFit

'Application.ScreenUpdating = True
End Sub

Obrigado.

 
Postado : 11/07/2016 6:40 am
(@mprudencio)
Posts: 0
New Member
 

Depende se vc quer que o codigo continue apos encontrar o erro use isso no inicio do codigo

On Error Resume Next

Se quer que retorne uma mensagem

On Error GoTo Erro

Exit Sub

Erro:

Msgbox "Foi Encontrado um Erro no seu Codigo", VBCritical, "Atençao ao Erro"

End Sub

 
Postado : 11/07/2016 7:18 am
(@luizhcosta)
Posts: 0
New Member
Topic starter
 

Olá MPrudencio,

Obrigado pelas dicas.
Na verdade o erro é indesejado. Ele está impedindo a conclusão do código, mas apenas na versão antiga do excel. Preciso que o código seja executado normalmente na versão 2000. Não desejo tratar da existência do erro.

É possível?

 
Postado : 11/07/2016 8:23 am
(@mprudencio)
Posts: 0
New Member
 

Isso On Error Resume Next faz ignorar o erro e o codigo rodar

Faça o teste.

Se nao funcionar disponibilize o arquivo.

Coloque essa linha apos thisworkbook

 
Postado : 11/07/2016 8:39 am
(@luizhcosta)
Posts: 0
New Member
Topic starter
 

Olá MPrudencio,

Segui sua orientação mas não funcionou. Estou disponibilizando o arquivo. Em resumo, o código faz 2 operações. Classificação nas colunas B até F e copia esse intervalo classificado para a outra planilha.

Obrigado.

 
Postado : 11/07/2016 10:29 am
(@wagner-morel-vidal-nobre)
Posts: 4063
Famed Member
 

luizhcosta,

Boa tarde!

Executei sua macro aqui no meu Excel 2007 e não houve qualquer problema. Acredito que o erro comentado por você deve ser somente em relação a versão 2000 a que você se refere. Esta já é uma versão muito antiga e, muito provavelmente, não deve possuir ainda os métodos de classificação que as versões mais nova já possuem.

Minha sugestão é: com o gravador de macros da versão 2000, tente gravar uma macro que faça a classificação de ítens e depois veja no código quais são os métodos/funções que o VBA está utilizando, nessa versão antiga, para classificar corretamente.

Após isso, basta substituir no código do colega que o ajudou, o método "Sort.SortFields" pelo método que a versão do Excel 2000 utiliza.

 
Postado : 11/07/2016 11:25 am
(@edsonbr)
Posts: 0
New Member
 

Olá, LuizHCosta

Aqui também executei e não tive problemas (Excel 2016x64).

Faça um teste reduzindo o número de filtros de 5 atual para somente 3. Se não me engano, até o Office 2003 só eram permitidas 3 chaves de classificação.

 
Postado : 11/07/2016 8:24 pm
(@edsonbr)
Posts: 0
New Member
 

Luiz,

De fato essa versão do Excel que vc quer usar somente admite 3 chaves de classificação. Daria para contornar o problema ou classificando em sequencia - da menos importante para a mais importante - ou criando uma coluna auxiliar concatenada, como nessas sugestões:

https://support.microsoft.com/pt-br/kb/268007

http://www.mrexcel.com/forum/excel-questions/592420-visual-basic-applications-sort-limited-limited-3-a.html

 
Postado : 11/07/2016 9:04 pm
(@luizhcosta)
Posts: 0
New Member
Topic starter
 

Olá EdsonBr,

Obrigado pelos seus esclarecimentos, realmente fiquei surpreso por essa limitação. Dentre as opções que você sugeriu, acho que a mais viável seria a classificação das 3 colunas, sendo elas a C, D e F nessa sequência. Mas não tenho a menor idéia como fazer.

Obrigado.

 
Postado : 11/07/2016 10:30 pm
(@luizhcosta)
Posts: 0
New Member
Topic starter
 

Olá,

Agora há pouco gravei a macro para classificar as 3 colunas possíveis na versão 2000. Pediria a quem puder fazer os ajustes no código do arquivo postado, agradeço.

Sub classi()
'
' classi Macro
' Macro gravada em 12/07/2016 por Luiz Henrique Costa
'

'
    Columns("A:C").Select
    Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range("B2") _
        , Order2:=xlAscending, Key3:=Range("C2"), Order3:=xlAscending, Header:= _
        xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub
 
Postado : 12/07/2016 5:22 am
(@humbertops)
Posts: 0
New Member
 

Estou com um problema numa macro que recebi, para ser executada numa função específica no trabalho, sendo que quem desenvolveu não conseguiu resolver este problema na macro, está aparecendo o seguinte erro:
Erro de Compilação: O código desse projeto deve ser atualizado para uso em sistemas de 64 bits. analise e atualize as instruções Declare e, em seguida, marque-as com o atributo PtrSafe.

Segue o código com erro abaixo:

Option Explicit

Public Declare Function FindWindowA& Lib "user32" (ByVal lpClassName$, ByVal lpWindowName$)
Public Declare Function GetWindowLongA& Lib "user32" (ByVal hWnd&, ByVal nIndex&)
Public Declare Function SetWindowLongA& Lib "user32" (ByVal hWnd&, ByVal nIndex&, ByVal dwNewLong&)

' constantes

Public Const GWL_STYLE As Long = -16
Public Const WS_MINIMIZEBOX = &H20000
Public Const WS_MAXIMIZEBOX = &H10000
Public Const WS_FULLSIZING = &H70000

Public Sub InitMaxMin(mCaption As String, Optional Max As Boolean = True, Optional Min As Boolean = True _
, Optional Sizing As Boolean = True)
Dim hWnd As Long
hWnd = FindWindowA(vbNullString, mCaption)
If Min Then SetWindowLongA hWnd, GWL_STYLE, GetWindowLongA(hWnd, GWL_STYLE) Or WS_MINIMIZEBOX
If Max Then SetWindowLongA hWnd, GWL_STYLE, GetWindowLongA(hWnd, GWL_STYLE) Or WS_MAXIMIZEBOX
If Sizing Then SetWindowLongA hWnd, GWL_STYLE, GetWindowLongA(hWnd, GWL_STYLE) Or WS_FULLSIZING
End Sub

 
Postado : 09/11/2016 1:06 pm