Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
  • Avatar do usuário
#55830
Boa noite, não entendo nada de VBA porém peguei um arquivo pra ajudar um amigo que entende menos ainda, minha área é outra...

o arquivo em questão é uma planilha com várias linhas contendo dados de salário de quase 200 funcionários, cada linha uma pessoa. nessa planilha tem um botão que quando eu clico gera um relatório onde cada página gera um relatório de um funcionário, porém de repente parou de funcionar exibindo o erro acima. Pesquisei bastante, encontrei topicos falando pra declarar uma variável, tópico pra habilitar uma biblioteca no excel, atualizar vb, nada funcionou. Então como os tópicos relacionados são antigos decidi abrir outro pois nada do que vi funcionou para este arquivo em questão, não posso enviar a planilha por conter dados pessoais de funcionários porém vou enviar como a planilha está, e o código completo da geração do relatório.
Na tentativa de declarar a variável em questão que aparece na depuração, independente do tipo que informo, o erro muda para 91 e continua sem funcionar, e neste ponto não sei mais como prosseguir, ou mesmo sei se é por ai a solução. Espero que possam ajudar, é um documento importante para as atividades realizadas na empresa. Desde já agradeço a compreensão.

A planilha tem o seguinte formato:

Informações Banco de horas Comissão Bônus Extras Descontos
Nome Frente Taxa Produtividade BH Valor Valor Valor Acréscimos Valor a Pagar
1 fulano Operação R$ 64,48 160,00 160,00 0 R$ - R$ - R$ - R$ - R$ -
2 Ciclano Operação R$ 2.000 0,75 0,75 0 R$ - R$ - R$ - R$ - R$ -

A imagem mostra a página do relatorio

Imagem


abaixo o codigo vba. O erro se da na função Sub GeraRelatorio(), ao que parece na variavel relatorio, na linha Set wsPdf = relatorio
Código: Selecionar todos
Option Explicit
'Option Private Module

Sub QuebraDeLinha(irow As Integer)
    ActiveSheet.Rows(irow).PageBreak = xlPageBreakManual
End Sub

Sub testeImprimir()
Dim i As Integer
For i = 5 To 25 Step 5
    QuebraDeLinha (i)
Next
ImprimeRelatorio ("Relatorio")
End Sub

Private Sub ImprimeRelatorio(aba As String)
Dim vbSimNao As Integer
Dim ultLin As Integer
Dim myMesExp As String
Dim myAnoExp As String
Dim myDataExp As String
Dim acompanhamentoPDF As String

vbSimNao = 4
vbSimNao = MsgBox("Deseja exportar o 'Relatório de Acompanhamento'?", vbYesNo, "Exportar Relatório")
'se resposta for sim, ele exclui, sai e desmarca
If vbSimNao = 6 Then
        'Call MyDesbloqueio
        Sheets(aba).Visible = True
                ultLin = Sheets(aba).Range("B65000").End(xlUp).Row + 1 'Application.WorksheetFunction.CountA(Sheets(aba).Range("B:B"))
                
                myMesExp = Format(Month(Date), "0") 'STRING
                myAnoExp = Format(Year(Date), "0000") 'STRING
                myDataExp = myMesExp & "_" & myAnoExp 'STRING
                
                acompanhamentoPDF = ThisWorkbook.Path & "\Relatorio de Acompanhamento_" & myDataExp & ".pdf"

                Sheets(aba).Range("A1:F" & ultLin).ExportAsFixedFormat Type:=xlTypePDF, _
                Filename:=acompanhamentoPDF
                
                Sheets(aba).Visible = xlSheetVeryHidden
        
                ActiveWorkbook.Save
                MsgBox ("O 'Relatório de Acompanhamento' foi exportado para a pasta (" & ThisWorkbook.Path & ")."), _
                vbInformation, "Status da Exportação"
                
                openFolder (ThisWorkbook.Path)
                
        'Call MyBloqueio
Else
    MsgBox "Impressão cancelada pelo usuário!!", vbInformation
    Exit Sub
End If

End Sub

Sub openFolder(folder As String)
Dim Foldername As String
Foldername = folder

Shell "C:\WINDOWS\explorer.exe """ & Foldername & "", vbMaximizedFocus 'vbNormalFocus
End Sub

Sub GeraRelatorio()
Dim lista As Range
Dim ws As Worksheet
Dim wsReport As Worksheet
Dim wsPdf As Worksheet
Dim uLin  As Integer
Dim i As Integer
Dim c As Integer
Dim lMerge1 As Integer
Dim lMerge2 As Integer
Dim lMerge3 As Integer
Dim lMerge4 As Integer
Dim lImagem As Integer
Dim shape As shape
lMerge1 = 13
lMerge2 = 15
lMerge3 = 37
lMerge4 = 27
lImagem = 2

Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationAutomatic

'Atribui a ws a planilha resumo
Set ws = resumo
'Atribui a wsReport a planilha resumo
Set wsReport = report
'Atribui a wsReport a planilha resumo
Set wsPdf = relatorio

wsPdf.Visible = xlSheetVisible

'Ultima Linha (Nomes)
uLin = ws.Range("b65000").End(xlUp).Row

Set lista = ws.Range("B10:B" & uLin)

'limpa wsPdf
wsPdf.Activate
wsPdf.Cells.ClearContents
wsPdf.Cells.ClearFormats

' Remove as logos do arquivo de relatório
For Each shape In wsPdf.Shapes
    shape.Delete
Next

'unmerge - desmesclar
wsReport.Range("B13:E13").UnMerge
wsReport.Range("B15:E15").UnMerge
wsReport.Range("B37:E37").UnMerge
wsReport.Range("D27:E27").UnMerge

'Largura da Coluna
wsPdf.Range("A1:F65000").Rows.AutoFit
c = 1
wsPdf.Columns(c).ColumnWidth = 1.57: c = c + 1
wsPdf.Columns(c).ColumnWidth = 20.29: c = c + 1
wsPdf.Columns(c).ColumnWidth = 20.29: c = c + 1
wsPdf.Columns(c).ColumnWidth = 20.29: c = c + 1
wsPdf.Columns(c).ColumnWidth = 20.29: c = c + 1
wsPdf.Columns(c).ColumnWidth = 1.57: c = c + 1

wsPdf.Cells.PageBreak = xlPageBreakNone

For i = 1 To lista.Count
    'Debug.Print lista(i).Value
    If lista(i).Value <> "" Then
        
            wsReport.Cells(8, 3) = lista(i).Value
        If wsReport.Range("D27").Value2 > 0 Then
            wsReport.Range("A1:F44").Copy
            wsPdf.Select
            uLin = wsPdf.Range("B65000").End(xlUp).Row + 1
            If uLin = 2 Then uLin = 1
            wsPdf.Range("A" & uLin).PasteSpecial xlPasteFormats
            wsPdf.Range("A" & uLin).PasteSpecial xlPasteValues
            'wsPdf.Range("A" & uLin).PasteSpecial xlPasteAll
            
            'Copia a Logo da ITSS
            wsReport.Shapes("logo").Copy
            ' Posiciona a logo
            wsPdf.Paste wsPdf.Range("E" & lImagem): lImagem = lImagem + 37
                            
            'Mesclar
            wsPdf.Range("B" & lMerge1 & ":E" & lMerge1).Merge '13
            wsPdf.Range("B" & lMerge2 & ":E" & lMerge2).Merge '15
            wsPdf.Range("B" & lMerge3 & ":E" & lMerge3).Merge '37
            wsPdf.Range("D" & lMerge4 & ":E" & lMerge4).Merge '27
            
            wsPdf.Range("D" & lMerge4 & ":E" & lMerge4).HorizontalAlignment = xlCenter
                    
            wsPdf.Rows(lMerge1).RowHeight = 52.5: wsPdf.Rows(lMerge2).AutoFit: wsPdf.Rows(lMerge3).RowHeight = 70.5
                    
            lMerge1 = lMerge1 + 37:    lMerge2 = lMerge2 + 37: lMerge3 = lMerge3 + 37: lMerge4 = lMerge4 + 37
            
            uLin = wsPdf.Range("B65000").End(xlUp).Row + 1
                    
            QuebraDeLinha (uLin)
        End If
       
    End If
    'copiar para a aba nova
Next

'Mesclar
    wsReport.Range("B13:E13").Merge
    wsReport.Range("B15:E15").Merge
    wsReport.Range("B37:E37").Merge
    wsReport.Range("D27:E27").Merge
ImprimeRelatorio ("Relatorio")

uLin = wsPdf.Range("B65000").End(xlUp).Row + 1
wsPdf.PageSetup.PrintArea = "$A$1:$F$" & uLin

wsReport.Activate
wsPdf.Visible = xlSheetVeryHidden

Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

PS: Enviei o arquivo porem retirei o nome e logo da empresa, bem como os nomes dos funcionários, então talvez tenha perdido alguma referencia na tabela dinamica

https://transferxl.com/06bp7wGgc4hM
#55839
wsPdf é uma variável do tipo Worksheet, ou seja, é uma planilha (aba). Foi definida nesta linha de código:
Código: Selecionar todos
Dim wsPdf As Worksheet
A planilha cujo codename se chama relatório deveria ser atribuída a este variável por causa desta linha de código:
Código: Selecionar todos
Set wsPdf = relatorio
Porém, observe que temos duas planilhas, uma cujo codename é report e outra cujo codename é resumo. Logo, não há uma planilha com codename relatório, por isso o erro.
#55993
Esta linha de código deverá ser:
Código: Selecionar todos
Set wsPdf = resumo
ou
Código: Selecionar todos
Set wsPdf = report
Depende de qual planilha você deseja imprimir.
#55995
Alterei a linha com os 2 exemplos citados e da um erro de execução 9, quando mando depurar vai para o código que está na imagem em anexo.

Imagem

Obs: o arquivo a ser impresso é o da página 1, que vai ler a planilha resumo e gerar de cada linha da planilha uma página do relatório...
#56000
Veja bem, analise o código:
Código: Selecionar todos
Sheets(aba).Visible=True
Bom, aba é um parâmetro do tipo String (texto) informado quando chama a subrotina ImprimeRelatorio. No fundo ela representa o nome da planilha que será impressa.
Veja que você tem duas planilhas: uma está com nome 1 (codename = report e name = 1) a outra se chama Resumo (codename = resumo e name = Resumo).

Na subrotina testeImprimir, você chama a subrotina ImprimeRelatorio com o parâmetro "Relatorio", ou seja, a aba a ser impressa teria que ter o nome "Relatorio". Porém, como eu disse acima nenhuma das abas tem name Relatorio.
Se quiser imprimir a planilha com nome 1, então seria ser:
Código: Selecionar todos
ImprimeRelatorio "1"
Se quiser imprimir a planilha com nome Resumo, então seria ser:
Código: Selecionar todos
ImprimeRelatorio "Resumo"
Espero que tenha ficado claro.
#56001
Alterei onde foi citado para resumo, e o nome da planilha 1 pare relatório, feito isso, imprime o arquivo mas sai em branco como se tivesse pegando dados do lugar errado, mas o erro vai para o final do arquivo, na linha wsPdf.Visible = xlSheetVeryHidden, e dá um erro em tempo de execução...
Ai quando confirmo, some a planilha relatório (anteriormente 1)
#56002
Também tentei imprimir 1 conforme citado mas o resultado é o mesmo acima.. Continua gerando o relatório porém somente com a estrutura do relatório sem ler os dados, aparece apenas o nome do campo da tabela dinamica como se tivesse lendo do local errado...

Porém agora o erro muda, erro em tempo de execução "1004". O método 'Visible' do '_Worksheet' falhou, se clico em depurar vai pra linha wsPdf.Visible = xlSheetVeryHidden, depois some com a aba relatorio, e se confirmo na janela do erro, acontece o mesmo...
#56005
Anexe o arquivo e dia exatamente qual o resultado final que você pretende.
#56046
Certo, segue a planilha com todos os dados, retirei apenas a logomarca, nomes e contatos da empresa pois são dados confidenciais de colaboradores.

Planilha:
https://www.transfernow.net/Sc0Ji2062020

Imagem de uma página do relatório:
Imagem


O resultado que a planilha deve gerar é como na imagem em anexo, é como o relatório era impresso, cada linha da planilha resumo vira uma página do relatório, cada linha é um relatório de um colaborador, com as alterações sugeridas, até imprimiu o pdf mas sem os dados contidos na planilha resumo, e por fim apresentava o erro citado acima e a planilha de relatório some.
#56053
Deixa ver se eu entendi. Veja se os passos são esses:

1) Clicar no botão ImprimirPDF
2) Percorrer linha a linha a planilha Resumo, da linha 10 até a última linha preenchida
3) Para cada linha da planilha Resumo, atualizar a planilha 1, modificando o valor da célula C8 com o nome da linha correspondente da planilha Resumo
4) Gerar o PDF e salvar em uma pasta específica que você já definiu no código

É só isso, ou tem mais algo além disso?

VI que no código tem ajustes de tamanho de coluna, reexibe e oculta planilha, mesclar e desmesclar células, apaga e copia logo, etc. Qual a real necessidade disso? Porque não deixar um relatório com tamanho padrão, já com a logo pronta, tamanhos padrão de colunas, etc?
#56066
E somente isso mesmo, não fui eu quem criou o arquivo, e não acho que haja necessidade disso também mas como não conheço muito da linguagem me ative no problema que a pessoa me disse, só mandei aqui pra tentar ajudar e ver se encontrava alguém que poderia solucionar o problema pra pessoa contar a usar o documento como de costume. Agradeceria muito se puder ajudar, eu não sou dessa área, só estou tentando ajudar um amigo, que também não é da área, e a pessoa que fez o arquivo infelizmente não está na empresa nem atende mais quando ligamos...
#56278
Veja se é o que deseja.
Você não está autorizado a ver ou baixar esse anexo.
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord