Ir ao conteúdo
  • Cadastre-se

Excel Executar macro sem desbloquear botões em planilha protegida


Ir à solução Resolvido por Midori,

Posts recomendados

Midori, a macro gerou o PDF.

 

Citação

Entre alguns problemas encontrados nos PDF’s gerados, foram que os textos ficavam cortados pelas linhas, ou seja, os textos não ficavam integralmente visíveis dentro da linha.

 

Contudo, como havia falado anteriormente, em alguns trechos do PDF do manual, o texto não aparece até o fim. Fica faltando o restantes das informações.

 

No arquivo que segue em anexo, destaquei em amarelo somente dois trechos apenas a título exemplificativo. Se você comparar com texto contigo na planilha (Ajuda), verá que ele não está completo (falta o restante das informações).

 

Há alguma tempo, eu fiz vários ajustes na macro gerar Relatório (Sub RelAudRELATÓRIO_GerarPDF-macro 5), que você havia feito, e também deu esse mesmo problema.

 

Citação

Os textos desse manual foram dispostos nas linhas através do ícone “Quebrar Texto Automaticamente” (Página Inicial > Quebrar Texto Automaticamente).

 

Acredito que seja por causa da quebra de texto automática, que havia mencionado anteriormente. Ou talvez pelo excesso de informações contidas nas linhas.

 

Curiosamente, na aba Relatório, também consta quebra de texto automática, mas não temos esse problema, quando da geração do PDF do relatório (Sub RelAudRELATÓRIO_GerarPDF).

 

:tw_pensive: Certamente, nesse caso, esse problema (do corte de texto) não seja possível de resolver.

 

 

Manual.pdf

Link para o comentário
Compartilhar em outros sites

15 horas atrás, Midori disse:

Aqui gera o PDF corretamente sem corte. Quando você imprime e visualiza manualmente com Ctrl+P também fica assim?

 

Não. Não fica com cortes. Imprime perfeitamente.

 

Veja o arquivo abaixo apenas para conhecimento.

 

 

Relatório de Audiências-DEFINITIVO - FINALIZANDO - Copia 2_xlsm.pdf

Link para o comentário
Compartilhar em outros sites

Sub ManualPDF()
    
ActiveSheet.PageSetup.Zoom = False
ActiveSheet.PageSetup.FitToPagesWide = 1
    
    Range([B21], [B242].End(xlUp)).ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=ActiveWorkbook.Path & "\Manual.pdf", _
        Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, _
        IgnorePrintAreas:=False, _
        OpenAfterPublish:=False

End Sub

 

Midori, coloquei dessa forma. Acredito que era assim que você sugeriu.

 

Mas, continua cortando o texto.

 

O que eu acho curioso é que o pdf do relatório gerado (pela macro 5) felizmente não tem esse problema.

 

Eu verifiquei manualmente as configurações de impressão e aparentemente não há nada de errado. Inclusive, está do mesmo modo que a impressão do relatório.

 

Não dá para entender porque está cortando o texto. Imagino que seja excesso de informações contidas nas linhas desse manual.

 

Se colocar uma linha de código para ajustar automaticamente a dimensão da linha, será que não resolveria?

 

Tem um comando desse aplicado à tabela da aba Relatório (na macro 6). Vejamos:

 

Range("TabelaRelatório").EntireRow.AutoFit

 

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Nilton Cézar disse:

Midori, coloquei dessa forma. Acredito que era assim que você sugeriu.

 

É assim mesmo, com Zoom False devia funcionar. Você pode tentar imprimir manualmente o PDF com o gravador de macro ligado e depois copiar as configurações da impressão para usar na macro.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Pronto, Midori. Gravei manualmente a macro. Segue o código:

 

Sub ImprimirTeste()
'
' ImprimirTeste Macro
'
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
        IgnorePrintAreas:=False
End Sub

 

Após testes, com esse código, a impressão sai sem cortes.

 

Midori, por favor, teria como você adaptar o código acima na sua macro, a seguir descrita, para ele salvar o manual automaticamente na mesma pasta da planilha:

 

Sub ManualPDF()    
    
    Range([B21], [B242].End(xlUp)).ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=ActiveWorkbook.Path & "\Manual.pdf", _
        Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, _
        IgnorePrintAreas:=False, _
        OpenAfterPublish:=False

End Sub

 

Midori, se possível, teria também como você colocar um código de erro, para o caso de o PDF do Manual esteja aberto, após a eventual geração de outro manual em seguida

 

Você colocou um código desse na macro 5 (RelAudRELATÓRIO_GerarPDF). Veja o trecho dele:

 

'Mensagem de erro para o caso de o PDF do Relatório esteja aberto, após a geração de outro relatório.
    Else
        MsgBox "O Relatório de Audiência não foi salvo! Feche o Relatório que está aberto, antes de salvá-lo.", vbExclamation, "Atenção!"
    End If

 

A propósito, ainda serão necessárias estas linhas sugeridas anteriormente por você?

 

ActiveSheet.PageSetup.Zoom = False
ActiveSheet.PageSetup.FitToPagesWide = 1

 

😀 Acredito que agora a macro irá funcionar corretamente.

 

 

Link para o comentário
Compartilhar em outros sites

16 horas atrás, Nilton Cézar disse:

teria como você adaptar o código acima na sua macro, a seguir descrita, para ele salvar o manual automaticamente na mesma pasta da planilha:

Essa adaptação seria trocar ExportAsFixedFormat para PrintOut. O problema é que PrintOut usa a impressora configurada como padrão no momento da impressão. Até dá para tentar trocar para PDF, normalmente para "Microsoft Print to PDF", mas com Export é mais garantido que o arquivo será gerado no formato. Então acho que devia tentar encontrar uma forma de resolver o problema do corte, talvez aumentando a célula ou copiando a macro completa da impressão manual sem PrintOut.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Midori, obrigado pelas explicações.

 

Mas, confesso que não entendi muita coisa. Meu conhecimento é muito básico em macro. É, mais ou menos, no nível de montar uma imputbox ou msgbox.😬

 

Citação

Essa adaptação seria trocar ExportAsFixedFormat para PrintOut. O problema é que PrintOut usa a impressora configurada como padrão no momento da impressão. Até dá para tentar trocar para PDF, normalmente para "Microsoft Print to PDF" (...)

 

Como seria essa macro com a estrutura acima?

 

Citação

Então acho que devia tentar encontrar uma forma de resolver o problema do corte, (...) copiando a macro completa da impressão manual sem PrintOut.

 

Ou como ficaria da forma acima?

 

Enfim, não consigo fazer os ajustes que você sugeriu.

 

 

Link para o comentário
Compartilhar em outros sites

Midori, de última hora, decidi colocar uma macro para localizar/substituir palavra ou texto.

 

Esse comando será muito relevante em, pelo menos, uma situação importante.

 

Felizmente, consegui uma macro na internet que executa essa operação (https://pt.extendoffice.com/documents/excel/5239-excel-find-and-replace-macro-code.html). Veja:

 

Sub FindandReplaceText()
'Update by Extendoffice 2018/5/24
    Dim xFind As String
    Dim xRep As String
    Dim xRg As Range
    On Error Resume Next
    Set xRg =Cells
    xFind = Application.InputBox("word to search:", "Kutools for Excel", , , , , 2)
    xRep = Application.InputBox("word to replace:", "Kutools for Excel", , , , , 2)
    If xFind = "False" Or xRep = "False" Then Exit Sub
    xRg.Replace xFind, xRep, xlPart, xlByRows, False, False, False, False
End Sub

 

Mas, vou precisar fazer algumas alterações nela. E, por isso, me surgiram algumas dúvidas.

 

.
.
.

, , , , , 2

 

Assim, Midori, porque o criador dessa macro colocou esse fragmento na InputBox acima (, , , , , 2)? Para que ele serve? Eu posso deletá-lo ou colocar um texto no lugar dele sem prejuízo para o funcionamento dessa macro?

 

Ele tem alguma coisa a ver com "False, False, False, False" comando em questão, pois curiosamente a mesma quantidade de vírgulas corresponde ao mesmo número de False?

 

Desde já, agradeço as explicações.

 

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Nilton Cézar disse:

porque o criador dessa macro colocou esse fragmento na InputBox acima (, , , , , 2)?

InputBox é uma função com vários parâmetros, esta é a sintaxe:

 

InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type)

 

Prompt, Title, Default, etc são os parâmetros e quando você chama a função pode passar valores/argumentos para eles. Na sua macro p.ex você passou "word to search:" para o Prompt.

 

Alguns parâmetros são opcionais e podem assumir um valor como padrão, é o caso de Default que deixa a caixa de texto em branco se nada for passado como no seu código. Colocar apenas vírgula sem qualquer valor é o mesmo que não passar nada como argumento.

 

No caso desse InputBox foi preciso colocar esses parâmetros em branco porque no último tem o valor 2 e quando você não faz referência ao parâmetro no código é preciso seguir a ordem. Outra forma de atribuir esse último valor é fazendo referência ao parâmetro:

 

Application.InputBox(Prompt:="word to replace:", Title:="Kutools for Excel", Type:=2)

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

As explicações acima são uma verdadeira aula!😀

 

31 minutos atrás, Midori disse:

No caso desse InputBox foi preciso colocar esses parâmetros em branco porque no último tem o valor 2 e quando você não faz referência ao parâmetro no código é preciso seguir a ordem. Outra forma de atribuir esse último valor é fazendo referência ao parâmetro:

 

Entendi. Em outras palavras, o criador da macro colocou as vírgulas sem valor, para obedecer à ordem de disposição dos parâmetros na inputbox, já que o último tem o valor 2. 

 

Citação

No caso desse InputBox foi preciso colocar esses parâmetros em branco porque no último tem o valor 2 (...):

 

Application.InputBox(Prompt:="word to replace:", Title:="Kutools for Excel", Type:=2)

 

Midori, apenas por curiosidade: a que se refere o valor 2 (type: 2), na sintaxe da macro citada? Para que serve o type 2? Esse type realmente é necessário ou opcional?

 

A propósito, posso adaptar a sintaxe da inputbox em questão, para colocar, por exemplo: 

 

InputBox("word to search:", "Kutools for Excel", "Digite aqui")

 

Agradeço pelos esclarecimentos.

 

Link para o comentário
Compartilhar em outros sites

29 minutos atrás, Nilton Cézar disse:

Entendi. Em outras palavras, o criador da macro colocou as vírgulas sem valor, para obedecer à ordem de disposição dos parâmetros na inputbox, já que o último tem o valor 2. 

Isso.

 

29 minutos atrás, Nilton Cézar disse:

Midori, apenas por curiosidade: a que se refere o valor 2 (type: 2), na sintaxe da macro citada? Para que serve o type 2? Esse type realmente é necessário ou opcional?

O Type também é opcional, esta é a documentação da função,

 

https://docs.microsoft.com/en-us/office/vba/api/excel.application.inputbox

 

O valor 2 se refere ao tipo de retorno que no caso é uma String (texto). Na documentação mostra que 1 é número, 4 lógico, etc. String é o padrão.

 

29 minutos atrás, Nilton Cézar disse:

A propósito, posso adaptar a sintaxe da inputbox em questão, para colocar, por exemplo: 

 

Pode sim, mas tem dois InputBox. Sem Application só retorna String,

 

https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/inputbox-function

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Obrigado pelas explicações, Midori. Está muito bem explicado. :rolleyes:

 

Ah, obrigado também pelos links sobre a sintaxe da inputbox!

 

14 minutos atrás, Midori disse:

Pode sim, mas tem dois InputBox. Sem Application só retorna String,

 

Pois bem, como havia dito, pretendo fazer alguns ajustes na macro em comento, a fim de que ela substitua apenas palavras/textos na tabela (TabelaRelatório), constante da aba Relatório.

 

Eu analisei algumas macros que você criou para que o comando fique vinculado apenas a TabelaRelatório. Assim, a macro ficou com esta adaptação

 

 

Sub RelAudRELATÓRIO_FindandReplaceText()
'Este código só se aplica à "TabelaRelatório".


If MsgBox("A palavra escolhida poderá ser substituída em outros textos do Relatório. Deseja continuar?", vbExclamation + vbOKCancel, "Atenção!") = vbOK Then

 


'Update by Extendoffice 2018/5/24
    Dim xFind As String
    Dim xRep As String
    'Dim xRg As Range
    Dim Tabela As Range
    On Error Resume Next
    'Set xRg = Cells
    Set Tabela = Range("TabelaRelatório")    
    
    xFind = Application.InputBox("Localizar:", "Localizar/Substituir", "esposo(a)/companheiro(a)")
    
    xRep = Application.InputBox("Substituir por:", "Localizar/Substituir", "instituidor(a)") 
    
    If xFind = "False" Or xRep = "False" Then Exit Sub
    Tabela.Replace xFind, xRep, xlPart, xlByRows, False, False, False, False


End If

End Sub

 

 

Fiz as alterações em azul, para fazer referência a tabela do Relatório. 

 

Fiz os testes aqui e ela aparentemente está funcionando como pretendido. Mas, dizer que ela está executando as operações desejadas é o suficiente para afirmar que o comando está definitivamente correto?

 

Assim, Midori, as linhas de código da macro acima estão realmente corretas?

 

Link para o comentário
Compartilhar em outros sites

Midori, finalmente o Redator de Relatórios de Audiência está concluído.:aplausos:

 

Estou enviando o arquivo em anexo apenas para você ver como ficou.

 

A propósito, não posso deixar de agradecer a OreiaG por sua grande ajuda, já que suas macros, ao final, se ajustarem bem ao projeto.👍

 

Pois bem, Midori, também quero agradecer por sua imensa colaboração, que me acompanhou nesse projeto desde 25 de março de 2021. Se não fosse por seu auxílio, não teria finalizado o Redator.

 

Da mesma forma, não posso deixar de registrar sua atenção, paciência e prestatividade, sempre que precisei recorrer a seus conhecimentos em VBA.

 

Muito obrigado mesmo! 

 

 

 

Redator de Relatórios de Audiência (1).rar

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!