Tópicos relacionados a códigos VBA, gravação de macros, etc.
Por EudesMilitao 20 Fev 2020 às 10:20
Membro 1 Estrela
Mensagens: 14
Reputação: 1
#52447
Bom dia!

Pessoal,

Tenha uma planilha onde descrevo etapas de uma operação que pode ter três, seis ou até vinte e sete passos, sendo o mais comum ter seis. O trabalho consiste em seguir os passos e no retorno fazer a sequência inversa, ou seja, o último passo será o primeiro no retorno. Esses passos são numerados porque tenho que segui-los à risca. Coloquei umas fórmulas para facilitar o trabalho pois é muito repetitivo e também uma macro para gerar um sequencial e outra para o cursor saltar para a célula onde devo preencher. O problema é que como os passos variam muito não dá para definir a última célula e assim retornar do último ao primeiro. A fórmula já me dar esse retorno na sequência inversa correta, colocando o passo um, no vinte e sete, o dois no vinte e seis e assim, sucessivamente. Gostaria que alguém me desse uma macro que colocasse o passo um no retorno um, o dois no retorno dois e aí, segue e, que configurasse a página de impressão conforme o seu tamanho, ou seja, para até seis passos um folha A4 cabe em frente e verso, para oito ou dez por exemplo, teria duas ou mais folhas, etc. O modelo segue em anexo.

Desde já, agradeço.
Apenas usuários registrados podem ver ou baixar anexos.
Por EudesMilitao 23 Mar 2020 às 11:26
Membro 1 Estrela
Mensagens: 14
Reputação: 1
#53085
Bom dia!

Pessoal,
Eu estive tentando resolver e quase consegui, só que esbarrei na seguinte dificuldade:
Fiz uma macro que copia para duas colunas ao lado que ficarão ocultas. Daí, identifico a última linha e vou copiando de baixo para cima. O problema é que como são variáveis não sei como parar a macro. No exemplo em anexo coloquei uma saída na linha 07 com "If UltCel.Select = "" Then Exit Sub", porém precisa ser dinâmica. Alguém poderia me ajudar?
Desde já, agradeço.

Eudes Militão
Apenas usuários registrados podem ver ou baixar anexos.
Por osvaldomp 23 Mar 2020 às 16:02
Membro 5 Estrelas
Mensagens: 1591
Reputação: 786
#53092
Veja se ajuda.
Considerei o arquivo do seu primeiro post acima.

preparação
1. limpe a planilha Operações a partir da linha 153 para baixo
2. insira uma planilha vazia, nomeie de Retorno, acerte a largura das colunas A:Z = 3,5, coloque o cabeçalho em A1:Z7

Rode o código abaixo. O resultado será colocado na planilha Retorno.

Código: Selecionar todosSub Retorno()
 Dim LR As Long, k As Long, m As Long
  Application.ScreenUpdating = False
  If Sheets("Retorno").[A9] <> "" Then Sheets("Retorno").Range("A9:V" & Sheets("Retorno").Cells(Rows.Count, 1).End(3).Row).Clear
  LR = Sheets("Operações").Cells(Rows.Count, 6).End(3).Row
  For k = LR To 14 Step -5
   Sheets("Operações").Cells(k - 3, 1).Resize(4, 22).Copy
   Sheets("Retorno").Cells(Rows.Count, 1).End(3)(3).PasteSpecial xlValues
   Sheets("Retorno").Cells(Rows.Count, 1).End(3)(-2).NumberFormat = "@"
   Sheets("Retorno").Cells(Rows.Count, 1).End(3)(-2) = Format(m + 1, "00") & ".": m = m + 1
  Next k
  Application.ScreenUpdating = True
End Sub
Por EudesMilitao 24 Mar 2020 às 11:18
Membro 1 Estrela
Mensagens: 14
Reputação: 1
#53120
Bom dia, Oswaldomp!

Funcionou só que tem um detalhe, aparece a seguinte mensagem de erro:
"O método Activate da classe Range falhou". Outra coisa, eu preciso que onde for "abrir" em Operações, em Retorno seja "fechar" e vice-versa.
Por osvaldomp 24 Mar 2020 às 12:18
Membro 5 Estrelas
Mensagens: 1591
Reputação: 786
#53123
EudesMilitao escreveu: ... aparece a seguinte mensagem de erro:
"O método Activate da classe Range falhou".
Isso é estranho, pois no código que passei não existe o comando Activate. ;)

Outra coisa, eu preciso que onde for "abrir" em Operações, em Retorno seja "fechar" e vice-versa.
Substitua as linhas do código conforme indicado abaixo.


substitua estas linhas
Código: Selecionar todos   Sheets("Retorno").Cells(Rows.Count, 1).End(3)(3).PasteSpecial xlValues
   Sheets("Retorno").Cells(Rows.Count, 1).End(3)(-2).NumberFormat = "@"
   Sheets("Retorno").Cells(Rows.Count, 1).End(3)(-2) = Format(m + 1, "00") & ".": m = m + 1


por estas
Código: Selecionar todos   With Sheets("Retorno")
    .Cells(Rows.Count, 1).End(3)(3).PasteSpecial xlValues
    .Cells(Rows.Count, 6).End(3)(-1) = IIf(.Cells(Rows.Count, 6).End(3)(-1) = "ABRIR", "FECHAR", "ABRIR")
    .Cells(Rows.Count, 1).End(3)(-2).NumberFormat = "@"
    .Cells(Rows.Count, 1).End(3)(-2) = Format(m + 1, "00") & ".": m = m + 1
   End With


obs. se ocorrer algum erro então disponibilize o arquivo exatamente nas condições em que o erro ocorre, informe corretamente sobre a mensagem de erro e informe qual a linha do código que é destacada em amarelo
Por osvaldomp 25 Mar 2020 às 12:02
Membro 5 Estrelas
Mensagens: 1591
Reputação: 786
#53149
E não é isso que o código faz?

Disponibilize um novo arquivo e coloque na planilha o resultado que o código está gerando e ao lado coloque o resultado desejado.

Você não mais se manifestou sobre o erro ... ;) ... o que houve ?
Por osvaldomp 25 Mar 2020 às 22:01
Membro 5 Estrelas
Mensagens: 1591
Reputação: 786
#53193
EudesMilitao escreveu:Na Plan Retorno está o resultado gerado e ao lado em azul, está o esperado.
O resultado só aparece diferente do esperado se ao rodar o código a planilha Operações for a planilha ativa.
Essa diferença ocorre porque você removeu o ponto do início de uma das linhas de comando que coloquei no post #53123
A propósito, você colocou o código no módulo da planilha. Embora ali também funcione, é recomendável colocar o código em um módulo comum (Inserir / Módulo) deixando o módulo da planilha somente para receber eventos de planilha.


Não ocorreu mais o erro do início.
Que bom! Isso significa que o Duende foi zuar outro ... :)