Notifications
Clear all

O MÉTODO PASTESPECIAL DA RANGE FALHOU

3 Posts
3 Usuários
0 Reactions
1,585 Visualizações
(@rogeriosg)
Posts: 0
New Member
Topic starter
 

Olá irmãos do fórum!
Existe uma explicação para isso?
Tenho uma pasta de trabalho com uma macro que limpa a planilha que uso como formulário e ao limpá-la, copia de outra planilha uma auto numeração e cola na célula "A3".
Para fazer um upgrade na pasta, copiei a mesma e comecei a editar, colocar mais algumas funções (macros). Uma dessas chama a macro com a dita colagem.
Resultado: quando chega na tal colagem trava tudo. Já li várias postagens aqui no fórum e fora dele, mas nada me ajudou. Já mudei de plan para sheet, de range para cell, de a3 para 3,3 e nada rola.
Gostaria de entender a lógica desse erro, se é que existe, pois pelo que vejo é muito frequente.

Sub limp()
'
' limp Macro
'limpa e cola o novo número na planilha 1, célula c3
Application.ScreenUpdating = False

ActiveSheet.Unprotect Password:=111
'
    Range("C5").Select
    Selection.ClearContents
    Range("C7").Select
    Selection.ClearContents
    Range("C9").Select
    Selection.ClearContents
    Range("C11").Select
    Selection.ClearContents
    Range("C13").Select
    Selection.ClearContents
    Range("C15").Select
    Selection.ClearContents
    Range("C17").Select
    Selection.ClearContents
    Range("C19").Select
    Selection.ClearContents
    Range("C21").Select
    Selection.ClearContents
    Range("C23").Select
    Selection.ClearContents
    Range("C29").Select
    Selection.ClearContents
    Range("C25").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(R[-2]C,'USUÁRIOS.BD'!R2C2:R26C4,2,0)"
    Range("C26").Select
    Sheets("RECIBOS.BD").Select
    Range("B1").Select
    Selection.Copy

    Sheets("CAD.CHEQUES").Select
    Range("C3").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False 'O PROBLEMA ACONTECE AQUI, DIZ QUE O MÉTODO PASTESPECIAL DESSA RANGE FALHOU. MAS NO ARQUIVO ORIGINAL NÃO FALHA.

    Range("l1:p148").Select
    Selection.ClearContents
     Range("c5").Select
    Application.CutCopyMode = False
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=111
Application.ScreenUpdating = True


End Sub

Aguardo socorro!

 
Postado : 13/06/2016 9:25 pm
(@mprudencio)
Posts: 0
New Member
 

Se isso nao funcionar disponibilize o arquivo com explicações do que pretende fazer, mostrando o resultado esperado


Sub limp()
'
' limp Macro
'limpa e cola o novo número na planilha 1, célula c3
Application.ScreenUpdating = False

ActiveSheet.Unprotect Password:=111
'
    Range("C5:C25") = ""
    Range("C25").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(R[-2]C,'USUÁRIOS.BD'!R2C2:R26C4,2,0)"
    Range("C26").Select
    Sheets("RECIBOS.BD").Select
    Range("B1").Select
    Selection.Copy
    Sheets("CAD.CHEQUES").Select
    Range("C3").Select
    Selection.PasteSpecial Paste:=xlPasteValues 'O PROBLEMA ACONTECE AQUI, DIZ QUE O MÉTODO PASTESPECIAL DESSA RANGE FALHOU. MAS NO ARQUIVO ORIGINAL NÃO FALHA.

    Range("l1:p148").Select
    Selection.ClearContents
     Range("c5").Select
    Application.CutCopyMode = False
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=111
Application.ScreenUpdating = True


End Sub

 
Postado : 14/06/2016 5:26 am
(@edsonbr)
Posts: 0
New Member
 

Olá, Rogério, boa tarde!

...
Existe uma explicação para isso?
...
Gostaria de entender a lógica desse erro, se é que existe, pois pelo que vejo é muito frequente.
...

A pergunta é: qual planilha estará ativa quando vc inicia a macro? Vc tem como garantir que ActiveSheet bem no início do código será sempre a mesma (por falar nisso, não está claro qual delas é: USUÁRIOS.BD, RECIBOS.BD, CAD.CHEQUES ou outra, suponho que seja CAD.CHEQUES)? Como não temos a pasta de trabalho em mãos, imagino que o problema possa estar aí. Eu fiz uma simulação aqui com seu código, criando planilhas com o mesmo nome e, mesmo tendo funcionado, penso que vale a pena vc fazer algumas modificações para melhorá-lo:

Percebe-se que ao criar a macro, vc inseriu partes que foram codificadas pelo Gravador de Macros. O problema é que o Gravador de Macros nunca qualifica os objetos e isso é sempre uma dor de cabeça na hora de depurar um código. São muitos ActiveIsso, ActiveAquilo, ThisObjeto, ThatObjeto, Select + Selection, etc. :P . Mas basta vc. manualmente pular para outra planilha ou "estar em" outro objeto quando for rodar a macro que os problemas começam a pipocar. E essa é uma causa muitíssimo comum de erros. Por isso prefira sempre qualificar os objetos antes de aplicar métodos ou modificar propriedades. Pode dar um pouco mais de trabalho braçal, de digitação, mas seu código fica muito mais confiável.

Por exemplo, ao invés de ActiveSheet.Unprotect Password:=111 prefira usar Worksheets("PlanilhaNomeX").Unprotect Password:=111
Além disso, quando um objeto é referenciado várias vezes, vale a pena atribuí-lo a uma variável e usá-la sempre que se referir a ele, assim vc não tem que ficar dando Select nem Activate para poder transformá-lo, o que poderia ser feito, por exemplo, para a planilha CAD.CHEQUES que é a que é mais trabalhada no código. Alternativamente pode-se qualificar uma vez e usá-lo sequencialmente dentro de um bloco With...End With, como sugiro abaixo.

Então uma das formas de reescrever o mesmo código seria:

Sub limp()
   Application.ScreenUpdating = False
   With Sheets("CAD.CHEQUES")
    .Unprotect Password:=111
    .Range("C5,C7,C9,C11,C13,C15,C17,C19,C21,C23,C29").ClearContents
    .Range("C25").FormulaR1C1 = "=VLOOKUP(R[-2]C,'USUÁRIOS.BD'!R2C2:R26C4,2,0)"
    Sheets("RECIBOS.BD").Range("B1").Copy
    .Range("C3").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
                              SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    .Range("l1:p148").ClearContents
    .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=111
   End With
   Application.ScreenUpdating = True
End Sub

Mas seria melhor mesmo analisarmos o todo de sua pasta como sugeriu o Marcelo para nos certificarmos do que mais poderia estar ocorrendo.

 
Postado : 14/06/2016 10:01 am