Public Function CreateAppointment(SubjectStr As String, BodyStr As String, AllDay As Boolean)
Dim OlApp As Outlook.Application
Dim Appt As Outlook.AppointmentItem
Set OlApp = CreateObject("Outlook.Application")
Set Appt = OlApp.CreateItem(olAppointmentItem)
Appt.Subject = SubjectStr
'Formato da data = mes/dia/ano
Appt.Start = #10/20/2011 1:00:00 PM#
Appt.End = #10/20/2011 2:00:00 PM#
'Appt.AllDayEvent = AllDay
Appt.Body = BodyStr
Appt.ReminderMinutesBeforeStart = 5
Appt.Save
Set Appt = Nothing
Set OlApp = Nothing
End Function
Private Sub testsub()
CreateAppointment "Teste", "Texto", False
End SubCri
Eventualmente dicas sobre outros programas, Windows e hardware.
domingo, 22 de janeiro de 2012
Criar um compromisso no Outlook
sábado, 21 de janeiro de 2012
Código de barras no Office
A forma mais rápida de se gerar um código de barras é simplesmente trocar a fonte do seu número para uma fonte de barras.
Neste link, tem a fonte para o código 3 de 9, um dos mais populares e utilizados: http://www.idautomation.com/fonts/free/
Lembrando que, o caracter de abertura e fechamento de leitura é o asterisco (*), ou seja, se o se código é 123456, utilize "*123456*" (sem as aspas) e troque a fonte para IDAutomationHC39M.ttf.
A maioria dos leitores já vem habilitado para leitura desse código de barras, mas eventualmente se não vier, basta dar uma olhada no manual que lá tem as instruções para configurar o seu leitor.
Não custa lembrar que...
- Quem faz a leitura do código de barras é o leitor e não o programa, portanto, não existe código ou programa para leitura de código de barras neste caso;
- Para maior segurança, é interessante acrescentar um dígito verificador. O algoritmo mais utilizado é o famoso módulo 11, facilmente encontrado na internet.
;-)
Neste link, tem a fonte para o código 3 de 9, um dos mais populares e utilizados: http://www.idautomation.com/fonts/free/
Lembrando que, o caracter de abertura e fechamento de leitura é o asterisco (*), ou seja, se o se código é 123456, utilize "*123456*" (sem as aspas) e troque a fonte para IDAutomationHC39M.ttf.
A maioria dos leitores já vem habilitado para leitura desse código de barras, mas eventualmente se não vier, basta dar uma olhada no manual que lá tem as instruções para configurar o seu leitor.
Não custa lembrar que...
- Quem faz a leitura do código de barras é o leitor e não o programa, portanto, não existe código ou programa para leitura de código de barras neste caso;
- Para maior segurança, é interessante acrescentar um dígito verificador. O algoritmo mais utilizado é o famoso módulo 11, facilmente encontrado na internet.
;-)
domingo, 25 de dezembro de 2011
Outlook VBA - Desanexando todos arquivos
Outro dia me deparei com uma situação diferente: ter de desanexar aproximadamente 150 arquivos/e-mails.
Adaptando um código que peguei na internet, resolvi a parada movendo todos os e-mails para uma pasta temporária, criada apenas para esta finalidade e resolvi o problema na boa.
Abaixo o código.
Option Explicit
Public Sub salvar_anexos()
On Error GoTo erro
Dim objApp As Outlook.Application
Dim pasta_outlook As Outlook.MAPIFolder
Dim objItem As Object
Dim arq_anexo As Outlook.Attachment
Dim pasta As String
'Pasta onde serão gravados os arquivos anexos dos emails:
pasta = "C:\Teste"
Set objApp = Outlook.Application
Set pasta_outlook = objApp.ActiveExplorer.CurrentFolder
If MsgBox("Deseja desanexar todos os arquivos da pasta " & pasta_outlook.Name, vbYesNo) = vbNo Then Exit Sub
For Each objItem In pasta_outlook.Items
DoEvents
'Se o objeto é do tipo email, começa a desanexar os arquivos
If objItem.Class = olMail Then
For Each arq_anexo In objItem.Attachments
DoEvents
arq_anexo.SaveAsFile pasta & "\" & arq_anexo.FileName
Next arq_anexo
End If
Next objItem
MsgBox "Processo finalizado!", vbOKOnly
Exit Sub
erro:
MsgBox Err.Number & " - " & Err.Description, vbOKOnly
Exit Sub
End Sub
sábado, 26 de novembro de 2011
Office nas nuvens
Ainda não estou na nuvem, mas creio que se tornará inevitável...
Link do Office365 para quem quiser conhecer:
;-)
Coletando dados de pesquisas com o Outlook e Access
Outro dia estava procurando uma forma de fazer uma pesquisa de satisfação por e-mail e a primeira dificuldade foi justamente criar um texto que o usuário não pudesse modificar.
Apesar de não chegar no modelo que queria, acabei descobrindo um recurso do Access que facilitou muito.
O formulário final não é lá dos melhores em termos de estética, mas cumpre sua função.
Segue o link para quem quiser experimentar:
;-)
sexta-feira, 21 de outubro de 2011
Mais um site legal sobre Outlook
http://www.outlookcode.com/default.aspx
O foco é programação, coisa meio rara em se tratando de Outlook.
;-)
quarta-feira, 12 de outubro de 2011
Site de VB com dicas interessantes
Tenho a impressão de que o site não é atualizado, mas as dicas que estão lá são bem interessantes.
Espero que não saia do ar...
http://www.codelines.com/
Indicado pelo grande amigo Gib@.
;-)
Espero que não saia do ar...
http://www.codelines.com/
Indicado pelo grande amigo Gib@.
;-)
sábado, 8 de outubro de 2011
Conectando o SQL Server 2008 Express via VBA
Bem simples a conexão por ADO ao SQL Server Express 2008.
Uma vez conectado, nada muda no resto da programação.
Uma vez conectado, nada muda no resto da programação.
Option Compare Database
Option Explicit
Option Explicit
Sub teste_sql()
Dim cnn As New ADODB.Connection
cnn.Open "Provider=SQLNCLI10.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=base_teste;Data Source=pkazu\sql_express_2008"
cnn.Execute "DELETE FROM TABELA1"
cnn.Open "Provider=SQLNCLI10.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=base_teste;Data Source=pkazu\sql_express_2008"
cnn.Execute "DELETE FROM TABELA1"
cnn.Close
End Sub
domingo, 4 de setembro de 2011
Estupidez humana
Este espaço não era para este tipo de comentário, mas me revolta ver certas notícias pela internet.
Mais de 100 toneladas de tomate gastos em folia enquanto milhares morrem de fome é algo que não pode passar em branco.
Ok, ninguém sobrevive só comendo tomates, mas para quem não tem absolutamente nada, um tomate é o equivalente a esperança de viver um pouco mais.
Mais de 100 toneladas de tomate gastos em folia enquanto milhares morrem de fome é algo que não pode passar em branco.
Ok, ninguém sobrevive só comendo tomates, mas para quem não tem absolutamente nada, um tomate é o equivalente a esperança de viver um pouco mais.
segunda-feira, 22 de agosto de 2011
Copiando texto de arquivos PDF
Esta é para tirar poeira do blog, pois faz um bom tempo que não colocado dicas aqui...
Aliás, o blog que inicialmente era focado no Excel, agora praticamente virou blog de VBA.
Bem, pelo menos espero que mesmo assim continue sendo útil.
Vamos ao código de hoje.
O problema:
Precisava abrir muitos documentos PDF e selecionar apenas alguns campos para poder trabalhar com eles numa tabela do Access.
Após uma pesquisa pela internet, verifiquei que existe pouca coisa sobre automação do Adobe via VBA que pudesse me ajudar.
Automação com o Internet Explorer seria o óbvio, porém não existe "Select All" nem "Copy".
Parti para a solução que não considero a melhor, porém foi o que me quebrou o galho e espero que ajude aqueles que visitarem este blog.
Detalhe importante: os dados são copiados para um arquivo TXT e a parte de tratamento depende do documento que está sendo aberto e copiado, por isso não vou detalhar para não complicar.
Outro detalhe importante: marcar a referência Microsoft Forms 2.0 Object Library.
Se não estiver na lista das referências, procurar pelo arquivo FM20.dll que geralmente está em C:\Windows\System32\.
;-)
Aliás, o blog que inicialmente era focado no Excel, agora praticamente virou blog de VBA.
Bem, pelo menos espero que mesmo assim continue sendo útil.
Vamos ao código de hoje.
O problema:
Precisava abrir muitos documentos PDF e selecionar apenas alguns campos para poder trabalhar com eles numa tabela do Access.
Após uma pesquisa pela internet, verifiquei que existe pouca coisa sobre automação do Adobe via VBA que pudesse me ajudar.
Automação com o Internet Explorer seria o óbvio, porém não existe "Select All" nem "Copy".
Parti para a solução que não considero a melhor, porém foi o que me quebrou o galho e espero que ajude aqueles que visitarem este blog.
Detalhe importante: os dados são copiados para um arquivo TXT e a parte de tratamento depende do documento que está sendo aberto e copiado, por isso não vou detalhar para não complicar.
Outro detalhe importante: marcar a referência Microsoft Forms 2.0 Object Library.
Se não estiver na lista das referências, procurar pelo arquivo FM20.dll que geralmente está em C:\Windows\System32\.
;-)
Option Compare Database
Option Explicit
Dim ie As Object
Dim temp_area As New DataObject
Dim arquivo As String
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Sub Pausa(ByVal segundos As Single)
Call Sleep(Int(segundos * 1000#))
End Sub
'Código teste para copia de texto de arquivo PDF
Sub IExplorer()
Open CurrentProject.Path & "\dados.txt" For Output As #1
Set ie = CreateObject("internetexplorer.application")
ie.Visible = True
arquivo = Dir(CurrentProject.Path & "\*.pdf")
Do While arquivo <> ""
ie.navigate CurrentProject.Path & "\" & arquivo
Do While ie.busy
DoEvents
Loop
Pausa 2
SendKeys "%E", True
SendKeys "{down}", True
SendKeys "{down}", True
SendKeys "{down}", True
Pausa 0.5
SendKeys "{ENTER}", True 'Selecionar tudo
SendKeys "%E", True
SendKeys "{down}", True
Pausa 0.5
SendKeys "{ENTER}", True 'Copiar
temp_area.GetFromClipboard
Print #1, temp_area.GetText
Print #1, "---------------------"
Debug.Print arquivo
arquivo = Dir
Loop
Close #1
ie.Quit
Set ie = Nothing
End Sub
terça-feira, 5 de julho de 2011
sábado, 2 de julho de 2011
Sobre o Custo Efetivo Total
Procurando a fórmula para o cálculo do C.E.T., achei no site do Banco Central do Brasil, a forma mais fácil de se chegar no valor.
O exemplo é extremamente simples, com a HP12C cheguei nos percentuais sem problemas.
http://www.bcb.gov.br/pre/bc_atende/port/custo.asp#3
;-)
O exemplo é extremamente simples, com a HP12C cheguei nos percentuais sem problemas.
http://www.bcb.gov.br/pre/bc_atende/port/custo.asp#3
;-)
quinta-feira, 14 de abril de 2011
Um lembrete quando utilizar late binding
Cuidado com algumas constantes...
Por exemplo, no Outlook VBA, o formato do texto do e-mail pode ser definido como olFormatHTML desde que a referência à versão corrente do Outlook esteja marcada!
No caso de late binding, lembre-se de que não há referência, portanto, neste exemplo o código retornará um erro.
Basta trocar o "olFormatHTML" por 2 que é a constante correspondente.
Ficaria assim:
email.BodyFormat = 2 (late binding) e
email.Bodyformat = olFormatHTML (early binding).
No Help dos VBA's do Office, pode encontrar todas as constantes necessárias para o dia a dia do programador.
;-)
Por exemplo, no Outlook VBA, o formato do texto do e-mail pode ser definido como olFormatHTML desde que a referência à versão corrente do Outlook esteja marcada!
No caso de late binding, lembre-se de que não há referência, portanto, neste exemplo o código retornará um erro.
Basta trocar o "olFormatHTML" por 2 que é a constante correspondente.
Ficaria assim:
email.BodyFormat = 2 (late binding) e
email.Bodyformat = olFormatHTML (early binding).
No Help dos VBA's do Office, pode encontrar todas as constantes necessárias para o dia a dia do programador.
;-)
sábado, 9 de abril de 2011
Compactando via VBA
Onde pretendo aplicar esta solução, o prompt do comando é bloqueado, portanto, o Shell não funciona.
De qualquer forma, fica aqui o código para quem quiser compactar usando o 7Zip ou WinRAR.
Para compactar um por um, basta fazer um loop e vir trocando o nome dos arquivos, idem para as senhas.
;-)
De qualquer forma, fica aqui o código para quem quiser compactar usando o 7Zip ou WinRAR.
Para compactar um por um, basta fazer um loop e vir trocando o nome dos arquivos, idem para as senhas.
;-)
Sub teste()
Dim ret As Long
ret = Shell("C:\Arquivos de programas\WinRAR\rar a -pteste c:\base.rar c:\base.mdb")
End Sub
Sub teste7z()
Dim ret
ret = Shell("C:\Arquivos de programas\7-Zip\7z a -pteste c:\base.7z c:\base.mdb")
End Sub
Protegendo com senha os arquivos compactados pelo Windows
Poderia ser mais intuitivo, mas existe a possibilidade de proteger com senha quando se compacta um arquivo pelo próprio Windows, sem utilizar um compactador de terceiros.
Clique com o botão direito sobre o arquivo a ser compactado, selecione Enviar para > Pasta compactada (zipada).
No arquivo zipado que se criou, clique com o botão direito do mouse e clique em Explorar.
No menu arquivo, aparece então a opção de adicionar senha.
;-)
Compactando com senha todos os arquivos de uma pasta
Estou tentando fazer essa tarefa via VBA, mas enquanto não encontro solução... segue a dica de um compactador que faz esse trabalho, o PeaZip.
Trabalha com vários formatos (*.7Z, *.rar, *.zip e outros), e tem versão "Portable" que funciona a partir do pendrive.
Ainda não testei, mas aparentemente muito bom e simples de usar.
Já ia esquecendo... os arquivos são individuais, ou seja, trata-se de criar um zip para cada cada arquivo e não um zip contendo todos os arquivos!
http://www.peazip.org
;-)
;-)
terça-feira, 29 de março de 2011
Mais um código para obter via VBA o IP do seu computador
Com os devidos créditos nos comentários.
Option Explicit
Global num_ip As String
' VBA MODULE: Get all IP Addresses of your machine
' (c) 2005 Wayne Phillips (http://www.everythingaccess.com)
' Written 18/05/2005
'
' REQUIREMENTS: Windows 98 or above, Access 97 and above
'
' Please read the full tutorial here:
' http://www.everythingaccess.com/tutorials.asp?ID=Get-all-IP-Addresses-of-your-machine
'
' Please leave the copyright notices in place.
' Thank you.
'
'Option Compare Database
'A couple of API functions we need in order to query the IP addresses in this machine
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Declare Function GetIpAddrTable Lib "Iphlpapi" (pIPAdrTable As Byte, pdwSize As Long, ByVal Sort As Long) As Long
'The structures returned by the API call GetIpAddrTable...
Type IPINFO
dwAddr As Long ' IP address
dwIndex As Long ' interface index
dwMask As Long ' subnet mask
dwBCastAddr As Long ' broadcast address
dwReasmSize As Long ' assembly size
Reserved1 As Integer
Reserved2 As Integer
End Type
Public Function ConvertIPAddressToString(longAddr As Long) As String
Dim IPBytes(3) As Byte
Dim lngCount As Long
'Converts a long IP Address to a string formatted 255.255.255.255
'Note: Could use inet_ntoa instead
CopyMemory IPBytes(0), longAddr, 4 ' IP Address is stored in four bytes (255.255.255.255)
'Convert the 4 byte values to a formatted string
While lngCount < 4
ConvertIPAddressToString = ConvertIPAddressToString + _
CStr(IPBytes(lngCount)) + _
IIf(lngCount < 3, ".", "")
lngCount = lngCount + 1
Wend
End Function
Public Sub GetIPAddresses(Optional blnFilterLocalhost As Boolean = False)
Dim Ret As Long, Tel As Long
Dim bytBuffer() As Byte
Dim IPTableRow As IPINFO
Dim lngCount As Long
Dim lngBufferRequired As Long
Dim lngStructSize As Long
Dim lngNumIPAddresses As Long
Dim strIPAddress As String
On Error GoTo ErrorHandler:
Call GetIpAddrTable(ByVal 0&, lngBufferRequired, 1)
If lngBufferRequired > 0 Then
ReDim bytBuffer(0 To lngBufferRequired - 1) As Byte
If GetIpAddrTable(bytBuffer(0), lngBufferRequired, 1) = 0 Then
'We've successfully obtained the IP Address details...
'How big is each structure row?...
lngStructSize = LenB(IPTableRow)
'First 4 bytes is a long indicating the number of entries in the table
CopyMemory lngNumIPAddresses, bytBuffer(0), 4
While lngCount < lngNumIPAddresses
'bytBuffer contains the IPINFO structures (after initial 4 byte long)
CopyMemory IPTableRow, _
bytBuffer(4 + (lngCount * lngStructSize)), _
lngStructSize
strIPAddress = ConvertIPAddressToString(IPTableRow.dwAddr)
If Not ((strIPAddress = "127.0.0.1") _
And blnFilterLocalhost) Then
'Replace this with whatever you want to do with the IP Address...
num_ip = strIPAddress
End If
lngCount = lngCount + 1
Wend
End If
End If
Exit Sub
ErrorHandler:
MsgBox "An error has occured in GetIPAddresses():" & vbCrLf & vbCrLf & _
Err.Description & " (" & CStr(Err.Number) & ")"
End Sub
Criando arquivos MDE no Access 2007 - Parte III
Apesar de ter escrito em outros lugares que não ia baixar o hotfix (achei uma falta de respeito com o consumidor não corrigir esse erro banal até o SP2), mudei de idéia e fui buscar o arquivo.
Para minha surpresa, foi necessário cadastrar meu e-mail para receber as instruções!
Bem, feito isso, olha só o que veio no e-mail demonstrando o pouco caso com o problema.
:-(
INFORMAÇÕES IMPORTANTES
Para sua conveniência, colocamos o hotfix solicitado em um site HTTP. Você pode baixar o hotfix desse site e com isso evitamos ocupar a sua caixa de entrada de emails.
AVISO Esse hotfix não foi submetido a um teste completo. Portanto, destina-se somente a sistemas ou computadores enfrentando o mesmo problema descrito em um ou mais artigos da Base de Dados de Conhecimento Microsoft listados no campo "Números do artigo da base de dados" da tabela que se encontra no final desta mensagem de email. Se você não tiver certeza de que algum problema específico de compatibilidade ou instalação esteja associado a esse hotfix, será recomendável aguardar pela próxima versão do service pack. O service pack incluirá uma versão totalmente testada dessa correção. Sabemos que pode ser difícil determinar se algum problema de compatibilidade ou instalação está associado a um hotfix. Assim, se desejar confirmar se o hotfix corrige o seu problema específico, ou se algum problema de compatibilidade ou instalação está a ele associado, os analistas de suporte dos Serviços de Atendimento ao Cliente poderão ajudá-lo. Para obter mais informações sobre como contatar o suporte, copie o link a seguir e cole-o no seu navegador da Web:
http://support.microsoft.com/contactus/
Para obter opções adicionais de suporte, copie o link a seguir e cole-o no seu navegador da Web:
http://support.microsoft.com/
Antes de instalar o hotfix
------------------------------
Se você decidir instalar esse hotfix, observe os itens a seguir:
Não implante um hotfix em um ambiente de produção sem antes testá-lo.
Faça backup do sistema ou computador que receberá o hotfix antes de instalá-lo.
Para minha surpresa, foi necessário cadastrar meu e-mail para receber as instruções!
Bem, feito isso, olha só o que veio no e-mail demonstrando o pouco caso com o problema.
:-(
INFORMAÇÕES IMPORTANTES
Para sua conveniência, colocamos o hotfix solicitado em um site HTTP. Você pode baixar o hotfix desse site e com isso evitamos ocupar a sua caixa de entrada de emails.
AVISO Esse hotfix não foi submetido a um teste completo. Portanto, destina-se somente a sistemas ou computadores enfrentando o mesmo problema descrito em um ou mais artigos da Base de Dados de Conhecimento Microsoft listados no campo "Números do artigo da base de dados" da tabela que se encontra no final desta mensagem de email. Se você não tiver certeza de que algum problema específico de compatibilidade ou instalação esteja associado a esse hotfix, será recomendável aguardar pela próxima versão do service pack. O service pack incluirá uma versão totalmente testada dessa correção. Sabemos que pode ser difícil determinar se algum problema de compatibilidade ou instalação está associado a um hotfix. Assim, se desejar confirmar se o hotfix corrige o seu problema específico, ou se algum problema de compatibilidade ou instalação está a ele associado, os analistas de suporte dos Serviços de Atendimento ao Cliente poderão ajudá-lo. Para obter mais informações sobre como contatar o suporte, copie o link a seguir e cole-o no seu navegador da Web:
http://support.microsoft.com/contactus/
Para obter opções adicionais de suporte, copie o link a seguir e cole-o no seu navegador da Web:
http://support.microsoft.com/
Antes de instalar o hotfix
------------------------------
Se você decidir instalar esse hotfix, observe os itens a seguir:
Não implante um hotfix em um ambiente de produção sem antes testá-lo.
Faça backup do sistema ou computador que receberá o hotfix antes de instalá-lo.
Criando arquivos MDE no Access 2007 - Parte II
Achei muito bom a opção de criar um arquivo MDE em vez do ACCDE no Access 2007, porém encontrei problemas...
Um MDE criado no 2007 simplesmente não abre em outro computador!
Gastando meu precioso tempo numa pesquisa na net, descobri que o problema é de conhecimento da Microsoft e até disponibilizou um hotfix para sanar o inconveniente.
Inadmissível um problema tão tosco e básico, lamentável mesmo.
link para o hotfix:
http://support.microsoft.com/kb/943249
;-)
Um MDE criado no 2007 simplesmente não abre em outro computador!
Gastando meu precioso tempo numa pesquisa na net, descobri que o problema é de conhecimento da Microsoft e até disponibilizou um hotfix para sanar o inconveniente.
Inadmissível um problema tão tosco e básico, lamentável mesmo.
link para o hotfix:
http://support.microsoft.com/kb/943249
;-)
terça-feira, 22 de março de 2011
Cadê os comandos do Office 2010?
Segue link com o "de -> para" dos comandos do Office 2010 em relação ao 2003.
Não sei quanto tempo o link estará no ar.
É necessário ter o Silverlight instalado.
Estranhamente o tutorial não roda no Chrome.
http://office2010.microsoft.com/en-us/word-help/learn-where-menu-and-toolbar-commands-are-in-office-2010-HA101794130.aspx#_Toc268688374
Se não estiver enganado, acho que já vi algo parecido para o Office 2007...
;-)
Não sei quanto tempo o link estará no ar.
É necessário ter o Silverlight instalado.
Estranhamente o tutorial não roda no Chrome.
http://office2010.microsoft.com/en-us/word-help/learn-where-menu-and-toolbar-commands-are-in-office-2010-HA101794130.aspx#_Toc268688374
Se não estiver enganado, acho que já vi algo parecido para o Office 2007...
;-)
Assinar:
Postagens (Atom)
Pesquisar este blog
Quem sou eu
- Kazu
- Administrador de Empresas/Técnico em Processamento de Dados. Microsoft Office User Specialist - Excel Proficient. Pós-graduado em Business Intelligence.


