Notifications
Clear all

Macro para ajustar área de impressão

16 Posts
1 Usuários
0 Reactions
5,204 Visualizações
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Prezados, boa noite.

Gostaria de saber se alguém pode me ajudar (mais uma vez). Criei uma planilha e apliquei a Estrutura de Tópicos. No normal cada item inclui 5 linhas e aplicando a estrutura ela oculta 3 das 5, ou seja, ficam apenas 2 para cada item. Daí tive a fabulosa ideia de gravar a macro pra facilitar a coisa - funcionou. O problema é que a planilha contempla 97 itens e, geralmente, não utilizarei os 97 itens. Traduzindo: se, por exemplo, eu excluir 10 itens (50 linhas) a macro retornará erro.

Basicamente, o que preciso é algum código de variável que, se a macro não encontrar as determinadas ranges prossiga para o próximo passo, até concluir.

Na realidade criei outra macro, que faz com que a estrutura de tópico volte ao normal (5 linhas por item).

Abaixo seguem as duas macros:

Sub Ocultar()
'
' Ocultar Macro
'
' Atalho do teclado: Ctrl+Shift+O
'
    ActiveSheet.Outline.ShowLevels RowLevels:=1
    ActiveWindow.View = xlPageBreakPreview
    ActiveWindow.SmallScroll Down:=18
    Set ActiveSheet.HPageBreaks(1).Location = Range("A59")
    ActiveWindow.SmallScroll Down:=21
    Set ActiveSheet.HPageBreaks(2).Location = Range("A122")
    ActiveWindow.SmallScroll Down:=18
    Set ActiveSheet.HPageBreaks(3).Location = Range("A182")
    ActiveWindow.SmallScroll Down:=27
    Set ActiveSheet.HPageBreaks(4).Location = Range("A239")
    ActiveWindow.SmallScroll Down:=12
    Set ActiveSheet.HPageBreaks(5).Location = Range("A299")
    ActiveWindow.SmallScroll Down:=21
    Set ActiveSheet.HPageBreaks(6).Location = Range("A362")
    ActiveWindow.SmallScroll Down:=24
    Set ActiveSheet.HPageBreaks(7).Location = Range("A422")
    ActiveWindow.SmallScroll Down:=9
    Set ActiveSheet.HPageBreaks(8).Location = Range("A482")
    ActiveWindow.SmallScroll Down:=18
    ActiveSheet.HPageBreaks(9).DragOff Direction:=xlDown, RegionIndex:=1
    With ActiveSheet.PageSetup
        .Zoom = 70
    End With
    With ActiveSheet
    ViewMode = ActiveWindow.View
    ActiveWindow.View = xlNormalView
    End With
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowFormattingRows:=True
End Sub
Sub Exibir()
'
' Exibir Macro
'
' Atalho do teclado: Ctrl+Shift+I
'
    ActiveSheet.Outline.ShowLevels RowLevels:=2
    ActiveWindow.View = xlPageBreakPreview
    ActiveWindow.SmallScroll Down:=45
    Set ActiveSheet.HPageBreaks(2).Location = Range("A77")
    ActiveWindow.SmallScroll Down:=33
    Set ActiveSheet.HPageBreaks(3).Location = Range("A112")
    ActiveWindow.SmallScroll Down:=15
    Set ActiveSheet.HPageBreaks(4).Location = Range("A147")
    ActiveWindow.SmallScroll Down:=66
    Set ActiveSheet.HPageBreaks(6).Location = Range("A217")
    ActiveWindow.SmallScroll Down:=27
    Set ActiveSheet.HPageBreaks(7).Location = Range("A252")
    ActiveWindow.SmallScroll Down:=36
    Set ActiveSheet.HPageBreaks(8).Location = Range("A287")
    ActiveWindow.SmallScroll Down:=15
    Set ActiveSheet.HPageBreaks(9).Location = Range("A322")
    ActiveWindow.SmallScroll Down:=42
    Set ActiveSheet.HPageBreaks(10).Location = Range("A357")
    ActiveWindow.SmallScroll Down:=12
    Set ActiveSheet.HPageBreaks(11).Location = Range("A392")
    ActiveWindow.SmallScroll Down:=33
    Set ActiveSheet.HPageBreaks(12).Location = Range("A427")
    ActiveWindow.SmallScroll Down:=36
    Set ActiveSheet.HPageBreaks(13).Location = Range("A462")
    ActiveWindow.SmallScroll Down:=24
    Set ActiveSheet.HPageBreaks(14).Location = Range("A497")
    ActiveWindow.SmallScroll Down:=12
    With ActiveSheet.PageSetup
        .Zoom = 70
       End With
    With ActiveSheet
    ViewMode = ActiveWindow.View
    ActiveWindow.View = xlNormalView
    End With
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowFormattingRows:=True
End Sub

Mais uma coisa: preciso que o zoom fique em 70%, por isso incluí na macro. Conto mais uma vez com a ajuda e apoio de vocês.

Grato,

 
Postado : 02/02/2012 4:09 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa noite!!

Talvez eu tenha entendido a primeira parte errado.

Mas creio que da pra fazer com função.

É só definir a Área de impressão depois, criar um intervalo dinâmico.

Vai selecionar somente onde tem informação para imprimir.

Poste sua planilha
Att...

 
Postado : 02/02/2012 6:35 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Olá pessoal.

Anexei a planilha. Se não for pedir demais, gostaria que o botão "Reduzir" ficasse oculto quando as linhas forem ocultadas pela estrutura de tópicos e que o botão "Ampliar" ficasse oculto na situação inversa.

Grato.

 
Postado : 03/02/2012 1:41 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa noite!!!

Minha recomendação não te ajudaria??

att

 
Postado : 04/02/2012 6:13 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Bom dia, alexandrevba.

Infelizmente não sou bom em VBA e macros, posso me definir mais como curioso do que iniciante. Seria possível traduzir o que você disse em código?

 
Postado : 06/02/2012 6:39 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Uma opção:

Sub AjustarPrintArea()
    Dim qt As Integer
    
    qt = [A2].CurrentRegion.Rows.Count
    ActiveSheet.PageSetup.PrintArea = "$A$1:$C$" & qt
End Sub
 
Postado : 06/02/2012 8:32 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa tarde, joseA. Infelizmente não foi de grande ajuda esse código, mesmo editando-o pras colunas corretas.

 
Postado : 07/02/2012 11:34 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Não sei se entendi corretamente, então se não for isto, se possivel anexe um exemplo reduzido e compactado para podermos analizar melhor :

Sub AjustarPrintArea()
    Dim i
    
    i = 0
    
    Set r = ActiveSheet.UsedRange
    
    nLastRow = r.Rows.Count + r.Row - 1
    nFirstRow = r.Row
    
    For n = nFirstRow To nLastRow
        If Cells(n, "A").EntireRow.Hidden Then
        
        Else
            i = i + 1
        End If
        
    Next
    
    ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=Cells(n, "A")
 
 End Sub

[]s

 
Postado : 07/02/2012 7:28 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa tarde, Mauro.

Seu novo código resolveu em parte o problema. Segue um modelo (clique aqui) com a planilha. Note que na PlanA, quando clico em "Finalizar", ele exclui todas as linhas desnecessárias. Indo para PlanC, ao clicar em "Ocultar" ele oculta as linhas desnecessárias, mas ao visualizar a impressão a quebra dá errado. Se eu clicar em "Exibir" e visualizar estará exatamente do jeito que quero.

O que preciso é que ele defina a área de impressão de modo que a tela fique o mais completa de itens possível, contudo, com zoom 70% (para a impressão) e que não haja itens quebrados, isto é, parte do item numa página e parte em outra.

Se não for pedir de mais, gostaria que as PlanA e PlanB também ficassem assim.

Conto com a colaboração de todos.

 
Postado : 08/02/2012 10:04 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Habib, no serviço não temos acesso ao SendSpace, mais tarde dou uma olhada.

[]s

 
Postado : 08/02/2012 12:42 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Olá Mauro.

Esqueci que tem como adicionar par aqui mesmo. Segue o anexo.

 
Postado : 08/02/2012 1:36 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Habib, de uma olhada no exemplo se é o resultado experado, dei uma reduzida na qde de linhas da Aba PlanC para facilitar o manuseio e testes, e para que a rotina funcione a contento tive de fazer as seguintes alterações na aba PlanC :
As formulas da Coluna A na Aba PlanC alterei para as mesmas ficarem com valores em Branco,
alterei tambem a mesclagem das últimas celulas," Atenciosamente, representante", etc

Tambem tive de remover o Vinculo, mas só por causa que não tenho a origem

Faça os testes e veja se é isto.

[]s

 
Postado : 08/02/2012 9:35 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa tarde, Mauro.

Desculpe a demora em responder, mas os dias foram corridos e estou analisando com maior atenção as macros.

No modelo que você postou, fiquei em dúvida no seguinte:

nas linhas abaixo

   For i = 11 To 497 Step 5
        On Error Resume Next
        If Sheets("Proposta").Range("A" & i).Value = "" Then
            UltimaLinhaProposta = i
        Else
            Primeira = i + 5
        End If
    Next

O que precisa ser alterado pra que, além das células "" (sem resultado) em A, as células que derem "#REF!" também sejam excluídas? Se observar direito, verá que, se eu pular uma linha em PlanA ele dará o erro "#REF!" em PlanC. Exemplo:

PlanA
Linha 10 - contem dados
Linha 11 - não contem dados
Linha 12 - contem dados
Linha 13 - não contem dados

Quando clicar no botão "Finalizar", em PlanC a Linha 11 retornará "#REF!".

Grato,

 
Postado : 24/02/2012 10:04 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa tarde, Pessoal.

Desculpem o double post, mas este visa atualizar a informação acima.

Inseri a planilha com algumas das alterações que fiz. Permanece a dúvida acima, a saber:

Se eu pular uma linha em "PlanA" e executar o botão "Finalizar", lá em "PlanC" a linha correspondente dará "#REF!". Acredito que o trecho a sofrer alteração seja o abaixo:

For i = 11 To 497 Step 5
        On Error Resume Next
        If Sheets("PlanC").Range("A" & i).Value = "" Then
            UltimaLinhaPlanC = i
        Else
            Primeira = i + 5
        End If
    Next

Daí pensei em fazer a seguinte alteração:

For i = 11 To 497 Step 5
        On Error Resume Next
        If Sheets("PlanC").Range("A" & i).Value = "" Or "#REF!" Then
            UltimaLinhaPlanC = i
        Else
            Primeira = i + 5
        End If
    Next

Mas aí não deu em nada...

Outra dúvida, e essa me intriga muito: se eu inserir apenas 2 itens na planilha ela dará um erro de configuração em PlanC, o que não ocorre se eu inserir qualquer outra quantia de itens nela.

Grato.

 
Postado : 28/02/2012 3:12 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Habib, vamos por parte, quando criei a rotina Sub PrintSetup () me basiei em seu primeiro post que é Ajustar a Area de Impressão, no caso a PlanC que contem estrutura de tópicos.
Sendo assim, nem cheguei a analizar esta rotina que está falando, que a principio não tem a ver com o assunto em questão, que é "ajustar a area de impressão".
Conforme citei anteriormente :
"Reduzi a qde de linhas da Aba PlanC para facilitar o manuseio e testes, e para que a rotina funcione a contento tive de fazer as seguintes alterações na aba PlanC :
As formulas da Coluna A na Aba PlanC alterei para as mesmas ficarem com valores em Branco,
alterei tambem a mesclagem das últimas celulas," Atenciosamente, representante", etc
Tambem tive de remover o Vinculo, mas só por causa que não tenho a origem
"

Mas se utilizar a rotina que está citando agora, veja que a mesma está DELETANDO as LINHAS nas Abas PlanA e PlanB o que irá gerar o erro na aba PlanC porque a mesma tem formulas que estão buscando informações nas abas A e B.

Então se a intensão é deletar as linhas, não podemos ter as formulas na aba "PlanC" referenciando as Celulas nas outras abas (=PlanA!D10) que irá gerar erro.

Esta rotina Sub DelLine() está bem poluida e confusa, porque você deleta as, "linhas em Branco na PlanA, e depois filtra a PlanC pelo criterio : erro Criteria1:="#REF!" e deleta as linhas, e não achei nenhumvinculo ou formula se referindo a PlanB na PlanC, se seguir a logica verá que não faz sentido.

Apesar de não ser o meu forte, acredito que este tipo de relatório, o ideal seria utilizar Tabela Dinamica.

[]s

 
Postado : 28/02/2012 4:47 pm
Página 1 / 2