Trabalhar com horas no VBA – Exemplo Jornada Ponto
Trabalhar com Horas no VBA é bastante extenso, mas engana-se quem acha que é mais difícil que o próprio Excel…
Pois é, isso mesmo, calcular horários, saldos e etc é muito mais fácil no VBA. Isso porque no VBA é mais simples de calcular horas negativas, transformar decimal em horas e etc.
Requisitos:
• Variaveis com VBA
• If e suas variações
• Conversões
Logica por trás dos códigos
O VBA possui dezenas de funções para facilitar, mas só é preciso diminuir uma hora de outra!
Entretanto quando temos um problema quando temos “batidas” (principalmente no início ou meio do expediente) que ocorrem após virada da noite.
Para facilitar o entendimento, vamos pegar um exemplo, um expediente com mais de 12h iniciando as 19h até as 8h.
Casos assim é preciso verificar se a hora inicial, ou intermediária é maior que a hora inicial e se for então vamos adicionar 24h nas horas posteriores
varCalculo = 19h – 08h
varCalculo = 19h – (08h + 24h)
var calculo = 13h de jornada
Na verdade, a dificuldade de manipular as horas não está no código em si, mas na lógica!
Trabalhar com horas no VBA (cálculo jornada ponto)
Segue código para ver na prática:
'inicialmente verificamos é um registro de duas batidas ou quatro, se for duas então If horaR1 <> 0 And horaR2 <> 0 And horaR4 = 0 And horaR3 = 0 Then If CDate(horaR1) > CDate(horaR2) Then horaR2 = CDate(horaR2) + CDate("23:59:00") + CDate("00:01:00") End If 'caso seja um registro de quatro batidas… ElseIf horaR1 <> 0 And horaR4 <> 0 Then 'Se a primeira hora é maior que a segunda…então todos os registros posteriores serão adicionados 24h If CDate(horaR1) > CDate(horaR2) Then horaR2 = CDate(horaR2) + CDate("23:59:00") + CDate("00:01:00") horaR3 = CDate(horaR3) + CDate("23:59:00") + CDate("00:01:00") horaR4 = CDate(horaR4) + CDate("23:59:00") + CDate("00:01:00") 'Se for a segunda hora maior que o restante…então todos os registros posteriores serão adicionados 24h, hora3 e hora4 ElseIf CDate(horaR2) > CDate(horaR3) Then horaR3 = CDate(horaR3) + CDate("23:59:00") + CDate("00:01:00") horaR4 = CDate(horaR4) + CDate("23:59:00") + CDate("00:01:00") 'E por último verificamos se hora 3 maior que hora 4, se verdade então ElseIf CDate(horaR3) > CDate(horaR4) Then horaR4 = CDate(horaR4) + CDate("23:59:00") + CDate("00:01:00") End If End If
Após esse código de verificações basta diminuir as horas entre as batidas.
Lembrando que cada variável horaR1, horaR2 … são variáveis com valores de horas.
Vídeo Para Maior Entendimento
Como Carregar Imagens Dentro da Propria Planilha
Recentemente eu recebi o seguinte e-mail: “ Como carregar imagens dentro da propria planilha ??”. Então…
“Há muito tempo em uma galáxia muito distante…”
Essa é uma dúvida que atormenta vários entusiastas em VBA! E aqui você vai conseguir achar sua resposta.
Logo se você estava tentando saber como passar seu sistema para o cliente com as imagens (loadpicture) dentro da própria planilha chegou uma nova esperança!
Passo 1 – Faça seu formulário:
Conforme a imagem acima pegue a sua “Caixa de Ferramentas” e crie um “Controle de Imagem” e não esqueça de dar um nome (Name), pois vamos utiliza-lo mais tarde
Como exemplo você pode usar Image1
Passo 2 – Função API
Essa função API é o grande trunfo para a funcionalidade de carregar imagens Dentro da Propria Planilha , esta foi desenvolvida pelo Stephen Bullen.
Copie o código abaixo, crie um módulo em seu projeto vba e cole na integra.
Option Explicit Option Compare Text ''' User-Defined Types for API Calls 'Declare a UDT to store a GUID for the IPicture OLE Interface Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End Type 'Declare a UDT to store the bitmap information Private Type uPicDesc Size As Long Type As Long hPic As Long hPal As Long End Type '''Windows API Function Declarations 'Does the clipboard contain a bitmap/metafile? Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Integer) As Long 'Open the clipboard to read Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long 'Get a pointer to the bitmap/metafile Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Integer) As Long 'Close the clipboard Private Declare Function CloseClipboard Lib "user32" () As Long 'Convert the handle into an OLE IPicture interface. Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As uPicDesc, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long 'Create our own copy of the metafile, so it doesn't get wiped out by subsequent clipboard updates. Declare Function CopyEnhMetaFile Lib "gdi32" Alias "CopyEnhMetaFileA" (ByVal hemfSrc As Long, ByVal lpszFile As String) As Long 'Create our own copy of the bitmap, so it doesn't get wiped out by subsequent clipboard updates. Declare Function CopyImage Lib "user32" (ByVal handle As Long, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long 'The API format types we're interested in Const CF_BITMAP = 2 Const CF_PALETTE = 9 Const CF_ENHMETAFILE = 14 Const IMAGE_BITMAP = 0 Const LR_COPYRETURNORG = &H4 Function PastePicture(Optional lXlPicType As Long = xlPicture) As IPicture 'Some pointers Dim h As Long, hPicAvail As Long, hPtr As Long, hPal As Long, lPicType As Long, hCopy As Long 'Convert the type of picture requested from the xl constant to the API constant lPicType = IIf(lXlPicType = xlBitmap, CF_BITMAP, CF_ENHMETAFILE) 'Check if the clipboard contains the required format hPicAvail = IsClipboardFormatAvailable(lPicType) If hPicAvail <> 0 Then 'Get access to the clipboard h = OpenClipboard(0&) If h > 0 Then 'Get a handle to the image data hPtr = GetClipboardData(lPicType) 'Create our own copy of the image on the clipboard, in the appropriate format. If lPicType = CF_BITMAP Then hCopy = CopyImage(hPtr, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG) Else hCopy = CopyEnhMetaFile(hPtr, vbNullString) End If 'Release the clipboard to other programs h = CloseClipboard 'If we got a handle to the image, convert it into a Picture object and return it If hPtr <> 0 Then Set PastePicture = CreatePicture(hCopy, 0, lPicType) End If End If End Function Private Function CreatePicture(ByVal hPic As Long, ByVal hPal As Long, ByVal lPicType) As IPicture ' IPicture requires a reference to "OLE Automation" Dim r As Long, uPicInfo As uPicDesc, IID_IDispatch As GUID, IPic As IPicture 'OLE Picture types Const PICTYPE_BITMAP = 1 Const PICTYPE_ENHMETAFILE = 4 ' Create the Interface GUID (for the IPicture interface) With IID_IDispatch .Data1 = &H7BF80980 .Data2 = &HBF32 .Data3 = &H101A .Data4(0) = &H8B .Data4(1) = &HBB .Data4(2) = &H0 .Data4(3) = &HAA .Data4(4) = &H0 .Data4(5) = &H30 .Data4(6) = &HC .Data4(7) = &HAB End With ' Fill uPicInfo with necessary parts. With uPicInfo .Size = Len(uPicInfo) ' Length of structure. .Type = IIf(lPicType = CF_BITMAP, PICTYPE_BITMAP, PICTYPE_ENHMETAFILE) ' Type of Picture .hPic = hPic ' Handle to image. .hPal = IIf(lPicType = CF_BITMAP, hPal, 0) ' Handle to palette (if bitmap). End With ' Create the Picture object. r = OleCreatePictureIndirect(uPicInfo, IID_IDispatch, True, IPic) ' If an error occured, show the description If r <> 0 Then Debug.Print "Create Picture: " & fnOLEError(r) ' Return the new Picture object. Set CreatePicture = IPic End Function Private Function fnOLEError(lErrNum As Long) As String 'OLECreatePictureIndirect return values Const E_ABORT = &H80004004 Const E_ACCESSDENIED = &H80070005 Const E_FAIL = &H80004005 Const E_HANDLE = &H80070006 Const E_INVALIDARG = &H80070057 Const E_NOINTERFACE = &H80004002 Const E_NOTIMPL = &H80004001 Const E_OUTOFMEMORY = &H8007000E Const E_POINTER = &H80004003 Const E_UNEXPECTED = &H8000FFFF Const S_OK = &H0 Select Case lErrNum Case E_ABORT fnOLEError = " Aborted" Case E_ACCESSDENIED fnOLEError = " Access Denied" Case E_FAIL fnOLEError = " General Failure" Case E_HANDLE fnOLEError = " Bad/Missing Handle" Case E_INVALIDARG fnOLEError = " Invalid Argument" Case E_NOINTERFACE fnOLEError = " No Interface" Case E_NOTIMPL fnOLEError = " Not Implemented" Case E_OUTOFMEMORY fnOLEError = " Out of Memory" Case E_POINTER fnOLEError = " Invalid Pointer" Case E_UNEXPECTED fnOLEError = " Unknown Error" Case S_OK fnOLEError = " Success!" End Select End Function
Passo 3 – Carregar Imagens Dentro da Propria Planilha
Insira uma guia em sua planilha e cole as imagens que você irá usar.
Agora nomeie a sua nova guia, como exemplo eu usei “Produtos”
Nomeie também as imagens que você colou em sua planilha.
Passo 4 – Usando a “força”: Formulário + Imagem
Agora criem um botão em seu formulário e clique duas vezes para inserir o código abaixo:
Private Sub CommandButton1_Click() Worksheets("Produtos").Shapes("bb-8").CopyPicture Set Image1.Picture = PastePicture(xlPicture) End Sub
Observem que para funcionar é muito importante os nomes utilizados:
- Primeiro para localizar a imagem precisamos do nome da guia e nome da imagem
- Em segundo precisamos do nome do controle de imagem no formulario (passo1)
Vídeo com Detalhes
Para ver detalhes de como carregar imagens dentro da propria planilha veja o vídeo! Ah e se gostaram não esqueçam de curtir e espalhar para os amigos!!!
Validar e Formatar CPF compacto e funcional
Você já precisou de código para validar e formatar CPF? Caso sua resposta seja afirmativa você já deve ter encontrado centenas pela internet! E infelizmente são:
- Códigos grandes
- Não diz o que faz cada passo
- Não diz como implementar
- E o conceito está complexo
Então como sempre quero ajudar e inovar!! Não sei se irei conseguir abranger toda a lista acima, mas este será meu objetivo neste artigo.
Pra que Validar e Formatar CPF ??
Uma das principais funções de um sistema (veja como criar um) é a validação dos dados antes de gravá-los.
Devemos lembrar dos diversos cadastros de clientes que utilizam do CPF ou RG para encontrar seus clientes e sem um número válido sua base de dados está correndo risco.
Entendendo o código
Para entender o conceito é ideal que vejam o vídeo, mas mesmo assim tentarei explicar por aqui.
Em um número de CPF os dois últimos dígitos são os números verificadores. Estes são responsáveis para informar se a sequencia está correta e baseado nisso:
Para o DV1 (primeiro digito verificador) vamos:
- Multiplicar todos os números que compõem o CPF (com exceção dos dois dígitos verificadores) por usas respectivas posições
- Somar o resultado
- Dividir por 11 (total de dígitos) e pegar o resto
Que deve ser igual ao primeiro digito verificador do CPF (ver primeiro quadro amarelo).
Para o DV2 (segundo digito verificador) vamos:
- Desconsiderar a primeira posição
- Multiplicar todos os números que compõem o CPF (com exceção do último digito verificador) por usas posições – 1
- Somar o resultado
- Dividir por 11 (total de dígitos) e pegar o resto
Que deve estar idêntico ao segundo digito verificador do CPF (ver segundo quadro amarelo)
Observação: No cálculo de ambos dígitos verificadores se o resto for igual a 10, então vamos considerar como zero
Código vba de cpf super compacto
Para Validar e Formatar CPF o código abaixo está dividido em duas partes: pré-formatação e validação:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) numCPF = TextBox1.Value numCPF = Replace(numCPF, ".", "") numCPF = Replace(numCPF, "-", "") If Val(numCPF) = 0 Or validaCPF(numCPF) <> "OK" Then TextBox2.Value = "cpf invalido" Exit Sub Else TextBox1.Value = Left(numCPF, 3) & "." & Mid(numCPF, 4, 3) & "." & Mid(numCPF, 7, 3) & "-" & Right(numCPF, 2) TextBox2.Value = "cpf válido" End If End Sub Function validaCPF(numCPF) If Len(numCPF) < 11 Then numCPF = String(11 - Len(numCPF), "0") & numCPF For caracter = 1 To 9 DV1 = Val(Mid(numCPF, caracter, 1)) * caracter + DV1 If caracter > 1 Then DV2 = Val(Mid(numCPF, caracter, 1)) * (caracter - 1) + DV2 Next DV1 = Right(DV1 Mod 11, 1) DV2 = Right((DV2 + (DV1 * 9)) Mod 11, 1) If Mid(numCPF, 10, 1) = DV1 And Mid(numCPF, 11, 1) = DV2 Then validaCPF = "OK" End Function
Entenda mais: veja o vídeo
Programar Abertura de Planilha Automaticamente
Como programar abertura de planilha automaticamente? Essa é uma pergunta constante nos sites de ajuda VBA.
Tanto que quando recebo e-mails sobre esse assunto até dou duas opções:
- Executar o excel automaticamente por código vba
- Abrir o excel automático pelo agendador do Windows
Neste artigo vamos ver a segunda opção, pois a primeira pode ser vista em outros sites e apesar de ser mais simples é necessário que o processo do Excel fique aberto.
Você irá perceber que para funcionar quase não precisa de código, mas como envolve uma quantidade de passos eu coloquei várias imagens!
É muita tecnologia?!
Então antes de continuar detalhando sobre o assunto, é de convir, mesmo nunca tendo feito este código, que a idéia é muito interessante…
Deixar o Excel tão automático que não é preciso nem abrir!!!
E podemos expandir ainda mais a partir do assunto principal:
- Abrir periodicamente: diário, semanal, mensal
- Repetidamente conforme minutos ou horas
- Ao inicializar o computador
- E etc
Programar abertura de planilha
Antes de descrever cada passo é necessário enxergarmos o processo como um todo:
Etapa 1 dentro do Excel – Código Principal
Então vamos começar pelo fim do processo ou seja, com o código principal. Para fins didáticos meu procedimento será apenas uma mensagem.
Então irei criar um módulo conforme imagem abaixo.
Aperte ALT + F11 em sua planilha e clique com botão direito em cima da Plan1 e selecione Inserir > Módulo
Dentro deste módulo (tela branca que irá aparecer) vou inserir minha funcionalidade principal:
Sub EXECUTAR_AUTOMATICO() 'MEU CÓDIGO PRINCIPAL MsgBox "Olá Bem vindos ao ExceleVBA.com.br" 'CÓDIGO PARA FECHAR PLANILHA APÓS EXECUTAR Application.DisplayAlerts = False Application.Quit End Sub
Importante: Perceba que nas linhas acima eu programei para o Excel fechar após realizar sua principal função. Isso é necessário para não ficar nenhum processo aberto do Excel.
Etapa 2 dentro do Excel – Código Secundário
Este procedimento irá executar assim que abrir a planilha e é responsável por chamar o procedimento principal.
Então vamos dar dois cliques onde diz EstaPasta_de_trabalho e inserir o código abaixo:
Private Sub Workbook_Open() Call EXECUTAR_AUTOMATICO End Sub
Percebam que EXECUTAR_AUTOMATICO é o nome do código principal feito na etapa 1.
Agora é necessário salvar a planilha, no meu caso vou chamar de Plan_Automatica.xls
Importante: Sempre que precisei eu usei a extensão .xls. Ao fazer testes com xlsm o agendador não abriu/executou a planilha.
Etapa 3 no Windows – Agendador de Tarefas
Usando o Windows 7, 8 ou 10 você pode apertar no teclado a tecla Windows e digitar “agendador de tarefas”.
Assim que você clicar no “Agendador de Tarefas” irá abrir uma tela como imagem abaixo:
No menu da direita selecione a opção “Criar tarefa…”
Na próxima tela que abrir preencha os dados conforme os campos marcados na imagem abaixo.
Em seguida selecione a guia “Disparadores” e clique em “Novo”. Nesta tela vamos marcar qual a frequência que nossa planilha automática irá abrir.
Então nesta imagem eu selecionei os campos necessários para repetir a execução da planilha uma vez a cada dia iniciando as 23h.
Agora na próxima guia “Ações” vamos indicar o que desejamos abrir. Então clique em “Novo” e demonstre onde a sua planilha está salva!
Observação: Se o seu Windows for 64 bits e o seu excel for 32 bits então no campo do endereço do programa adicione o seguinte código:
%systemroot%\Syswow64\cmd.exe /C “endereço da planilha”
Dúvida ver vídeo explicativo.
A guia seguinte é a “Condições” e esta podemos pular (mas é bom você dar uma olhada).
E a última guia é a “Configurações” e é interessante você olhar o último campo que pergunta o que fazer caso o processo do Excel ainda esteja aberto (lembra que na etapa 1 nós fechamos o Excel)
E com isto finalizamos os passos para programar abertura de planilha automaticamente.
Agora é só curtir e caso tenha dúvidas veja o vídeo!
Vídeo Explicativo
VBA criar pasta em qualquer computador
Na última enquete o assunto de vba criar pasta ficou em segundo lugar, pois em primeiro foi votado para aprender a desligar um computador.
Com este código você poderá testar se existe uma pasta no computador. E se não existir você irá com vba criar uma pasta para:
- inserir backups
- chaves
- salvar planilha
Para que serve isso ???
Em vários momentos profissionais surgiram necessidades como esta que serviram para:
- Em uma multinacional vendedores deveriam ter um banco de dados em um diretório de seus computadores e tudo criado pelo vba.
- Em um hospital uma planilha deveria acessar o banco informix e filtrar dados para envio de e-mails à pacientes em outra planilha em uma pasta na rede
- Em um restaurante uma planilha era executada a cada 10 minutos e enviando dados a planilhas “filhas” para o dropbox com informações de clientes
Existe diversas situações, mas de imediato lembro destas
Como usar este código vba criar pasta
Dim ConferePasta As String ConferePasta = "C:\NOVO" If Dir(ConferePasta, vbDirectory) = "" Then MkDir ConferePasta MsgBox "O diretório: " & ConferePasta & " foi criado!", vbInformation, "AVISO" End If
Existe diversas formas de verificar e criar pastas usando vba, mas acredito que esta seja a mais simples.
Você ainda pode adicionar um else caso diretório já exista.
Agora basta você copiar e usar!!
Video explicativo com passo a passo
Neste vídeo além de explicar eu mostro o contexto de salvar a planilha na pasta, aproveite!
Sucesso e abraço a todos.
Como desligar o computador com VBA
Após longo tempo trabalhando nos bastidores venho trazendo novidades, das quais vocês votaram na última enquete.
A ideia do código veio através do colega que eu conheci aqui pelo site, muito obrigado Vagner Beraldo. E recentemente ao abrir o código que ele enviara percebi que o mesmo somente reiniciava o computador com vba e este fato me deixou com vontade de mais…
Ao começar a pesquisa percebi a dificuldade… A maioria dos códigos na internet estavam voltados para o Windows xp e não funcionavam nas versões atuais.
Enfim consegui, testei e após o sucesso coloco aqui abaixo:
Opção 1 – Desligar o computador com vba
'*******************DESLIGAR********************* Public Function TurnOff() Shell "shutdown -s -t 02", vbHide End Function
Opção 2 – Reiniciar com vba
'*********************REINICIAR*********************** Public Function Reboot() Shell "shutdown -r -t 02", vbHide End Function
Opção 3 – Forçar reinicio
'**********************FORCE************************ Public Function ForceReboot() Shell "shutdown -r -f -t 02", vbHide End Function
Vídeo Excel com Vba
ianfrater.wordpress.com/
VBA Copiar colar arquivos diferentes
Vocês votaram na enquete aqui do site excel e vba e em segundo lugar ficou o assunto VBA Copiar colar arquivos diferentes.
A maneira que demonstro é uma mais avançada e também com menos código.
Porém se você não gostar ou achar complicado aqui mesmo no site há outras maneiras (passo1 e passo2)que envolvem copiar célula por célula com um loop.
Você que escolhe a melhor maneira para trabalhar excel com vba.
1 – Vamos ao codigo VBA Copiar Colar arquivos diferentes:
________________________________________________________
Sub COPIAR_COLAR_ARQUIVO_DIFERENTES() 'Declarações Dim appExcel As Excel.Application Dim wb As Excel.Workbook 'A Aplicação Excel é criada aqui: Set appExcel = CreateObject("Excel.Application") 'A linha abaixo é importante: eu estou dizendo que todo o processo seja invisível. 'Talvez para testes seja importante deixar como True e assim acompanhar o processo appExcel.Visible = False 'Note que, na linha abaixo, foi adicionado um Workbook (um plan) 'E esse workboook fica nomeado como "wb" Set wb = appExcel.Workbooks.Add 'Agora para simplificar o processo, também vou gravar o nome da planilha origem Set oldPlan = Workbooks("planilha_antiga.xlsm").Worksheets("Plan1") 'Então copio todos os dados da tabela oldPlan.Range("A2").CurrentRegion.Copy 'Na linha abaixo eu colo os dados na nova planilha (lembre-se do "wb") wb.Worksheets("Plan1").Range("A1").PasteSpecial xlPasteValues 'Nas linhas abaixo eu salvo a planilha no mesmo diretorio que a planilha antiga diretorio = ThisWorkbook.Path & "\" nome = "exemplo.xls" appExcel.DisplayAlerts = False wb.SaveAs Filename:=diretorio & nome, FileFormat:=xlNormal 'Agora eu elimino o processo aberto do excel appExcel.Quit 'E finalizado as declarações Set wb = Nothing Set appExcel = Nothing End Sub
2 – Vídeo Demonstrativo
Como Fazer o Excel Falar
O artigo de hoje é mais curto que os últimos entretanto não deixa de ser interessante: fazer o excel falar. Uma curiosidade apresentada por um colega e leitor do Blog Vagner Vieira Beraldo!
Muitos usam o recurso de mensagens de bom dia, alertas e avisos por escrito na tela usando o MsgBox, mas que tal você os mesmos alertas, avisos e etc utilizando o recurso do som! É no mínimo interessante, não?!
Que tal Fazer Seu Excel Falar?
Sub Hello Application.Speech.Speak ("hello") End Sub
Detalhando Formularios Vba 2
Neste artigo sobre Fomularios VBA você encontrará:
Abrir e Fechar formulário
Limpando todos os campos do formulário
Como colocar barra de rolagem
Imprimir formulário
No artigo Formularios Vba 1 coloquei como alterar o tamanho do formulário, como tirar o botão fechar e como inserir gráficos no formulário. Neste post quero finalizar o assunto e eliminar as principais dúvidas referentes a formulários.
Abrir e Fechar Formulário VBA
Para abrir formulários vou colocar aqui duas opções: abrir com um botão ou diretamente ao abrir a planilha.
Vou começar com o mais simples, para fechar um formulário bastar colocar: unload Nome_formulário
Para abrir basta colocar o “Nome_Formulario”.Show, abaixo segue imagem onde fica o nome do formulário.
Então agora que sabe como abrir formulário cabe decidir se deseja colocar em um botão na planilha ou abrir direto, para colocar em um botão é só inserir o código de abrir em um módulo e relacionar com o botão.
Para abrir o formulario direto, basta colocar o código conforme a imagem abaixo:
Segue vídeo para exemplificar:
Limpando Todos Os Campos Do Formulário
Abaixo segue código para limpar todos os campos textbox, combobox e radiobox. Devo alertar para os nomes dos controles, pois o código irá varrer no formulário todos os campos e conforme o nome que você colocou irá limpar.
Resumindo o codigo… Se tiver algum campo no formulario que inicie com text ou txt irá limpar, mesma coisa para os optionButton e combobox.
Como Colocar Barra De Rolagem
O código é bem simples basta clicar duas vezes no formulário e copiar e colar o código abaixo.
Private Sub UserForm_Initialize()
Me.ScrollBars = fmScrollBarsVertical
Me.ScrollHeight = Me.InsideHeight * 2
End Sub
Imprimir Formulario
Para imprimir o formulário atual coloque o código:
‘Me.PrintForm
Se deseja imprimir outro formulário, então coloque:
nomeFormulario.PrintForm