Arquivo

Archive for the ‘Códigos Detonados’ Category

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:

 

Carregar imagens dentro da propria planilha

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.

load picture shape

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.

 

load picture dentro da planilha do excel

 

Passo 4  – Usando a “força”: Formulário + Imagem

 

Imagens Dentro da Propria Planilha

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

Validar e Formatar CPF

 

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 ??

 

vba 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

 

validar cpf com vba

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:

excel validacao

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!

 

Programar abertura de planilha

É 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:

 

abrir excel automático

 

Etapa 1 dentro do Excel – Código Principal

 

foco no código

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

 

 

inserir modulo vba

 

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

 

executar vba automático

 

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

 

agendador de tarefas excel

 

Usando o Windows 7, 8 ou 10 você pode apertar no teclado a tecla Windows e digitar “agendador de tarefas”.

tecla windows

 

Assim que você clicar no “Agendador de Tarefas” irá abrir uma tela como imagem abaixo:

 

tutorial windows macro

 

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.

 

macro automática

 

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.

 

macro abrir sozinha

 

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!

 

abrir vba automatico

 

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)

 

coo usar o agendador de tarefas

 

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

 

Formato moeda no textbox enquanto digita

Este código formato moeda no textbox enquanto você digita funciona da mesma maneira do caixa eletrônico ou internet banking.

formato moeda no textboxO visual do seu formulário vai mudar completamente com esta funcionalidade de interação com a pessoa que digita os valores monetários.

.

História do formato moeda no textbox?

 

Estava conversando com um amigo e o mesmo estava reclamando que não havia nada na internet em VBA que ajudasse para formatar o textbox enquanto digita.

Quando achava algo parecido era depois que a pessoa saia do campo ou em outra linguagem.

Então para ajudar resolvi eu mesmo fazer, ou seja, como vários outros códigos você só encontra aqui.

 

Mas afinal pra que serve isso?

 

E para quem ainda não entendeu basta dizer que o separador das casas (1000.)  e a vírgula aparece automaticamente enquanto digita, sem precisar sair do textbox para visualizar a mudança

máscara moeda vba

formatação formulario

Código para copiar

 

Sub formataMoeda()
    valor = TextBox1.Value
    If IsNumeric(valor) Then
        If InStr(1, valor, "-") >= 1 Then valor = Replace(valor, "-", "") 'retira sinal negativo
        If InStr(1, valor, ",") >= 1 Then valor = CDbl(Replace(valor, ",", "")) 'retirar a virgula
        If InStr(1, valor, ".") >= 1 Then valor = Replace(valor, ".", "") 'para trabalhar melhor retiramos ponto
        Select Case Len(valor) 'verifica casas para inserção de ponto
            Case 1
            numPonto = "00" & valor
            Case 2
            numPonto = "0" & valor
            Case 6 To 8
            numPonto = Left(valor, Len(valor) - 5) & "." & Right(valor, 5)
            Case 9 To 11
            numPonto = inseriPonto(8, valor)
            Case 12 To 14
            numPonto = inseriPonto(11, valor)
            Case Else
            numPonto = valor
        End Select
        numVirgula = Left(numPonto, Len(numPonto) - 2) & "," & Right(numPonto, 2)
        TextBox1.Value = numVirgula
    Else
        If valor = "" Then Exit Sub
        MsgBox "Número invalido", vbCritical, "Caracter Invalido"
        Exit Sub
    End If
End Sub


Function inseriPonto(inicio, valor)
    I = Left(valor, Len(valor) - inicio)
    M1 = Left(Right(valor, inicio), 3)
    M2 = Left(Right(valor, 8), 3)
    F = Right(valor, 5)
    If (M2 = M1) And (Len(valor) < 12) Then
    inseriPonto = I & "." & M1 & "." & F
    Else
    inseriPonto = I & "." & M1 & "." & M2 & "." & F
    End If
End Function

Confesso que me diverti neste exemplo de VBA, fiz até para versão de Excel 2003!

E se vocês olharem bem na verdade é um código que trabalha com texto, um assunto bem trabalhado no ebook.

O código está pronto para ser utilizado! Agora é com você, se gostou então de uma “curtida” e/ou compartilhe.

Talvez você também ache interessante saber sobre Valores Monetários por Extenso , e neste artigo disponibilizei duas planilhas para download.

Segue vídeo explicativo

 

Inserir dados do Excel para o Access com Vba

 

Atualmente no site existe um artigo descrevendo como consultar dados do Access para o Excel (que por sinal é bem interessante) e resolvi complementar para aqueles que são amantes de usar o excel somente como interface.

Existe diversas formas de fazer esta inserção, mas acredito que esta seja uma das mais simples.

Com este artigo você poderá inserir dados do Excel para o Access e assim poderá ter todo um histórico de informações e consultas. Dependendo da situação nada melhor que salvar os dados em um banco de dados (ou melhor um: sgbd).

 

Primeiro Passo: Informações de diretório

 

O arquivo de banco de dados deve ficar dentro de uma pasta chamado: base
A pasta base deve ficar no mesmo diretório da planilha

excel para a access

 

Segundo Passo: Criação do banco no Access

 

Para este artigo criei uma tabela simples com as seguintes informações:

Campos: Nome, Idade, Profissao e Cidade
Nome Tabela: TB_dados_pessoais
Nome banco: BD_dados.mdb

 

excel com vba access

Obs.: É muito importante que neste exemplo de código você salve como .mdb

 

Terceiro: Biblioteca Excel

 

Primeiro é necessário marcar algumas bibliotecas para o código funcionar, portanto segue os passos abaixo:

Alt + F11 > Ferramentas > referências > marcar Microsoft Active data Objects

excel para o access

 

Quarto Passo: Interface Excel

 

Os campos na planilha são os mesmos que estão no Access.

Podem ser criados na planilha mesmo ou em formulário, fica a gosto. No exemplo aqui eu misturei as duas coisas, coloquei objetos do formulário na planilha.

 

excel access

 

Quinto Passo: Criando a comunicação com o Access

 

Aqui eu criei um módulo chamado mod_bd e dentro dele coloquei os códigos abaixo:

excel para o access

 

Sexto Passo: Insert no Access

 

Neste passo foi criado um outro módulo cujo código segue abaixo:

access excel

 

Sétimo Passo: Botão Inserir

 

Agora só falta fazer o botão que irá executar:

access com vba

 

Vídeo Demonstrativo

 

 

 

 

 

Detalhando Formularios Vba 2

formularios vba          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.

nome formulario vba

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:

 

abrir formulario vba

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.

 

codigo excel e vba

limpar formulario vba

 

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

 

 

Detalhando Formularios Vba 1

 

Formularios VBA

 

Neste artigo sobre Fomularios VBA você encontrará:

                  • Ocultar botão fechar formulario VBA
                  • Vba verificar formulário aberto
                  • Formulário tela inteira vba excel
                  • Inserir gráfico em formulário vba
                  • Botão minimizar formulário vba
                  • Maximizar formulário vba excel

 

Eu já estava com a ideia de fazer alguns artigos sobre formulários vba, pois ainda não coloquei nenhum artigo a respeito (sobre componentes já foi dito sobre listbox, inputbox e etc).  Coincidência ou não conforme as últimas (e ótimas) conversas que obtive graças a este site o tema era justamente este.

Formulários VBA é um tema muito abrangente, então neste primeiro artigo sobre formulário vamos detalhar sobre algumas dúvidas mais frequentes que percebo e que o pessoal entra em contato como sugestões.

E por último é preciso informar que todos os códigos vba foram testados no Excel 2013! É muito provável que funcione nas versões do Excel 2007 e 2010, entretanto não posso dizer o mesmo para a versão 2003. E os vídeos aqui no artigo fazem referencia a dois tópicos, ou seja  3 vídeos e cada vídeo retrata sobre 2 assuntos.

 

Ocultar Botão Fechar Formulário VBA

 

Na verdade vou descrever duas opções para esta dúvida, a primeira (código logo abaixo) desativa toda barra de títulos, ou seja não exibe opção de fechar e nem de mover o formulário. É excelente opção se combinado com “formulário tela inteira vba”

A segunda opção (código logo depois da primeira opção) exibe o botão fechar entretanto ele fica inativo forçando ao cliente fechar o formulário cm o botão que você criar.

 

formulario vba

 

1ª Opção – Formulário ocultar barra de títulos

'Insira este código na inicialização do formulário.
Call removeCaption(Me)

_____________________________________________

'Crie um módulo e copie o código abaixo
Private Declare Function FindWindow Lib "User32" _

Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLong Lib "User32" _
Alias "GetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long) As Long

Private Declare Function SetWindowLong Lib "User32" _
Alias "SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long

Private Declare Function DrawMenuBar Lib "User32" ( _
ByVal hwnd As Long) As Long

Sub removeCaption(objForm As Object)
Dim lStyle          As Long
Dim hMenu           As Long
Dim mhWndForm       As Long

If Val(Application.Version) < 9 Then
   mhWndForm = FindWindow("ThunderXFrame", objForm.Caption) 'XL97
Else
   mhWndForm = FindWindow("ThunderDFrame", objForm.Caption) 'XL2000+
End If

lStyle = GetWindowLong(mhWndForm, -16)
lStyle = lStyle And Not &amp;HC00000
SetWindowLong mhWndForm, -16, lStyle
DrawMenuBar mhWndForm
End Sub


Código Fonte:
http://www.vbaexpress.com

2ª Opção – Desativar Botão Fechar

Para funcionar basta copiar e colar no seu formulário

Desativar botão fechar formulario vba

 

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

If CloseMode = 0 Then
   Cancel = True
   MsgBox "Use o botão fechar no rodapé"
End If

End Sub

 

 Vba Verificar Formulário Aberto

 

O código é bem simples, ele verifica entre os vários formulários abertos entre todos que você tem. No caso abaixo eu coloquei mensagem caso ache aberto, mas você pode fechar e etc.

Segue código exclusivo ExceleVba, você somente acha aqui!!

 

 

Vba verificar formulario aberto

 

Sub VerificaFormularioAberto()
Dim Forms As Object
For Each Forms In VBA.UserForms
   If Forms.Visible = True Then
      'Aqui fica por sua criatividade/ vontade
      MsgBox Forms.Name & " está aberto"
   End If
Next
End Sub

 

Formulário Tela Inteira VBA Excel

 

 

Aqui vou exibir 2 opções, para funcionar basta colocar na inicialização do formulário. Aqui é bom testar a opção A, opção B ou misturar as duas opções.

Existe outros métodos pela internet entretanto este é o melhor seguindo parâmetro complexidade/funcionalidade.

 

 

‘Opção A

With Me
   .Width = Application.Width
   .Height = Application.Height
End With

‘Opção B

With Me
    .Width = Application.UsableWidth
    .Height = Application.UsableHeight
End With

 

Código Fonte: http://www.ozgrid.com

 

 Inserir Gráfico Em Formulário VBA

 

Como o controle de imagens do formulário busca por imagens em seu computador, o código abaixo pega o gráfico informado cria um gif no local da planilha e exibe a imagem.

 

 

 

Graficos em formulario vba

 

Private Sub UserForm_Initialize()

'"Plan2" é o nome da guia e "Gráfico 2" é o nome do Gráfico
Set GraficoAtual = Sheets("Plan2").ChartObjects("Gráfico 2").Chart
localNome = ThisWorkbook.Path & "\temp.gif"
GraficoAtual.Export Filename:= localNome, FilterName:="GIF"

Image1.Picture = LoadPicture(localNome)

End Sub

 

Maximizar Formulário Vba Excel

Botão Minimizar Formulário Vba

maximizar e minimizar formulario vba 

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long

Private Const WS_MINIMIZEBOX As Long = & H20000
Private Const WS_MAXIMIZEBOX As Long = & H10000
Private Const GWL_STYLE As Long = (-16)

Private Sub UserForm_Initialize()

Dim lngMyHandle As Long, lngCurrentStyle As Long, lngNewStyle As Long
If Application.Version < 9 Then
   lngMyHandle = FindWindow("THUNDERXFRAME", Me.Caption)
Else
   lngMyHandle = FindWindow("THUNDERDFRAME", Me.Caption)
End If

lngCurrentStyle = GetWindowLong(lngMyHandle, GWL_STYLE)
lngNewStyle = lngCurrentStyle Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
SetWindowLong lngMyHandle, GWL_STYLE, lngNewStyle

End Sub

 

Código Fornecido Por Vagner Beraldo em contato ExceleVBA

__________________________________________

 É isso pessoal em breve estarei fazendo Detalhando Formulários 2!

 

 

 

Como usar figuras com Excel e VBA

Figuras com Excel e VBA

Existe várias formas de se lidar com o vba.
Algumas empresas preferem trabalhar o vba em cima da planilha mesmo, outras gostam de trabalhar com vba + fórmulas do excel , um terceiro tipo com Access e excel e um quarto tipo somente com formulários.
Digo isso baseado em experiências e contatos gratificantes que tive através deste site.

 

 

 Usar Figuras com Excel e VBA

Baseado nisso, cada “tipo” possui suas vantagens e desvantagens, contudo hoje quero falar de um assunto que quem trabalha com a planilha obtém vantagem.
No aspecto design e o uso do shapes (figuras) a criatividade é imbatível com as planilhas.

 

figuras com vba

Inserir Nome Para As Figuras

Para podermos selecionarmos uma figura, primeiro precisamos definir um nome para elas.

figuras com excel e vba

 

Selecionar,  Ocultar e Copiar Figuras com VBA

A partir do nome da figura, podemos selecionar, ocultar e mover as figuras.
Detalhe, aqui estou sando ActiveSheet (ou seja planilhas na Guia Ativa)

'Selecionar figura
ActiveSheet.Shapes.("rostoFeliz1").Select

'Ocultar figuras: false ou true
ActiveSheet.Shapes.("rostoFeliz1").Visible = false

'Copiar figura e já definir destino
ActiveSheet.Shapes("rostoFeliz1").Copy
Sheets("Plan2").Paste

Se eu tivesse acabando de ler isso minha cabeça já está a mil por hora, pois e já iria imaginar…

  • Logotipos em planilhas aparecendo na hora de impressão
  • Planilhas de qualidade exibindo smiles de sorriso ou tristeza
  • Ao abrir uma planilha fazer uma animação de abertura
  • Formulários em shapes aparecendo conforme checkbox marcados

Animar Figuras com VBA

Vamos continuar… Irei pegar a idéia de animar figuras com Vba e mostrar como fazer.

 

Sub teste()
mov_figura = 0

Do While mov_figura &lt;= 350

   DoEvents
   mov_figura = mov_figura + 1

   'irá pra a direita
   Plan1.Shapes("rostoFeliz1").Left = mov_figura

   'neste caso coloquei a altura fixa
   Plan1.Shapes("rostoFeliz1").Top = 20

   'aumenta o tamanho da altura da figura
   Plan1.Shapes("rostoFeliz1").Height = mov_figura

   'aumenta a largura
   Plan1.Shapes("rostoFeliz1").Width = mov_figura

   'gira a figura
   Plan1.Shapes("rostoFeliz1").Rotation = mov_figura

Loop
End Sub

 

Observação

Nesse artigo eu usei uma “forma” do Excel, entretanto poderia ter usado uma figura qualquer, basta inserir a figura e seguir os passos descritos nesse artigo

 

Sucesso a todos!

 

VBA com SMTP

 

VBA com SMTP

VBA com SMTP

Alguns anos atrás tive que desenvolver uma rotina, dentro de uma ferramenta VBA, e era obrigatório usar VBA com SMTP para envio de e-mails. Lembro que passei algumas horas para então conseguir meus primeiros testes.

Apesar de já ter colocado um artigo sobre vários tipos de envio de e-mail, segue aqui uma maneira simples de fazer usando SMTP. Com apenas algumas linhas consegui enviar um e-mail e foi muito rápido.

O uso do SMTP é muito útil quando não quer usar o envio de e-mail através do outlook.


Eu também coloco aqui um link com endereços de SMTP e POP dos principais fornecedores de e-mail: ver site.

 

Primeiro Passo

Eu usei um programa que EASendmail que permite envio de e-mail SMTP usando uma licença teste.

 

Segundo Passo

excel e vba biblioteca

Adicione a referência do vba: “EASendMailObj ActiveX Object”
Na tela de desenvolvimento vá no menu Ferramentas > Referências > e marque EASendMailObj ActiveX Object

 

Terceiro Passo – VBA com SMTP

Sub Btn_EnvioEmailSmtp()
'Atenção: É necessário usar a biblioteca EASendMailObjLib.Mail

Dim oSmtp As New EASendMailObjLib.Mail

'É necessário utilizar essa linha, é a licença de uso
oSmtp.LicenseCode = "TryIt"

'Defina qual endereço do remetente
oSmtp.FromAddr = "brsobral@excelevba.com.br"

'Adicione endereço de email para qual deseja enviar
oSmtp.AddRecipientEx "atendimento@excelevba.com.br", 0

'Assunto do email
oSmtp.Subject = "Envio de simples email por SMTP"

'Mensagem do corpo de Email
oSmtp.BodyText = "Este e-mail foi enviado por VB - teste do site excelevba.com.br"

'Seu endereço SMTP server
'No caso aqui estou usando do gmail
oSmtp.ServerAddr = "smtp.gmail.com"

'Caso necessite usar autenticação SMTP use o código abaixo, caso contrário remova as linhas abaixo
oSmtp.UserName = "xxxxxxxx@gmail.com"
oSmtp.Password = "xxxxxxxx"

' If your smtp server requires SSL connection, please add this line
oSmtp.SSL_init
oSmtp.ServerPort = "587"

MsgBox "Confirme para enviar email ..."

If oSmtp.SendMail() = 0 Then
   MsgBox "Email foi enviado com sucesso!"
Else
   MsgBox "Erro de envio de email com o seguinte código:" & oSmtp.GetLastErrDescription()
End If

End Sub

 

Vídeo Demonstrativo

 

 

 

 

 

Vba Internet : listbox, radiobox, button…

Nesse sobre VBA Internet post você encontrará:

  • VBA e Checkbox: marcar e verificar qual está marcado
  • VBA e Radiobox: marcar e verificar qual está marcado
  • VBA e ListBox: marcar e verificar qual está marcado
  • Como clicar em um botão de um site através de VBA
  • Clicar em um link através de VBA

 

Este será o último post sobre vba e internet, anteriormente escrevi como fazer login em uma página web e como abrir um site no browser padrão do computador 

Apesar de estar separado em tópicos (acima) vocês perceberão que no código estão tudo em mesmo contexto.
Se quiserem testar basta abrir um módulo e copiar o código abaixo (atenção para as aspas duplas que ao copiar vira apostrofo).

E para ajudar eu criei uma página na internet justamente para facilitar o estudo do código vba. E no rodapé segue vídeo.

 

Muito importante:
Para o código funcionar é necessário marcar a refêrencia: Microsoft Internet Controls
Outra observação é que deve ser verificado no site o Name dos listbox, checkbox e etc

 

vba internet

vba internet

______________________________________________________________ 

Sub VbaInternet()

Set Internet = New InternetExplorer
Internet.Navigate "http://excelevba.com.br/download/teste_vba.htm"
Internet.Visible = True

While Internet.Busy
DoEvents
Wend

'-------------------------------------------------listbox
'abaixo marca qual linha do listbox queremos que fique marcada
Internet.Document.All.Item("lst_excelevba").selectedindex = 2
nomeVar = Internet.Document.All.Item("lst_excelevba").Item(1).Text

'abaixo verifica qual linha do listbox está marcada
For Each valorLinha In Internet.Document.All.Item("lst_excelevba")
If valorLinha.Selected = True Then
MsgBox "linha marcada = " &amp; valorLinha.Value
End If
Next valorLinha

'-------------------------------------------------------checkbox
'abaixo eu marco um checkbox no site
Internet.Document.All.Item("chk_excelevba").Item(0).Checked = "true"
nomeVar = Internet.Document.All.Item("chk_excelevba").Item(1).Value

'aqui verifico qual checkbox está marcado no site
For Each checkMarcado In Internet.Document.All.Item("chk_excelevba")
If checkMarcado.Checked = True Then
MsgBox "check marcado é o " &amp; checkMarcado.Value
End If
Next checkMarcado

'-----------------------------------------------------radiobox
'abaixo marca uma opção do radiobox
Internet.Document.All.Item("rdo_excelevba").Item(1).Checked = True

'aqui verifica qual radiobox esta marcado
Count = 0
For Each radioMarcado In Internet.Document.All.Item("rdo_excelevba")
If radioMarcado.Checked = True Then
MsgBox "radio marcado é o " &amp; Count
End If
Count = Count + 1
Next radioMarcado

'-------------------------------------------------------textbox
'o comando abaixo escreve na caixa do textbox
Internet.Document.getElementsByName("txt_excelevba").Item.Value = "Bem vindo ExceleVba.com.br"

'---------------------------------------------------------botao
'aqui somente clica no evento do botão no site
Internet.Document.getElementsByName("btn_excelevba").Item.Click

'---------------------------------------------------------link
'e abaixo verifica entre todos os links qual o desejado e clica
For Each link In Internet.Document.Links
If link.href = "http://excelevba.com.br/" Then link.Click
Next link
End Sub

 

Segue vídeo demonstrativo: