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.

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

;-)

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

;-)

Criando arquivos MDE no Access 2007

Estava preocupado em trabalhar com o Access 2007, pois sempre criava MDE's para proteger meus códigos VBA e nesta versão, vi somente a opção de criação de ACCDE's, o equivalente do primeiro caso.
Questionando no fórum ExpertAccess, nosso colega JPaulo indicou um texto interessante que reproduzo parte dele mais abaixo, onde descreve-se a funcionalidade de criar MDE a partir de banco de dados MDB da versão 2003 no Access 2007.
Façam um teste.
Criem um mdb no formato 2003 e na faixa de opções "Ferramentas de banco de dados" aparecerá o botão "criar MDE".
Usando o formato ACCDB, na faixa de opções aparece "Criar ACCDE".
Muito bom, tomara que na versão 2010, o recurso seja mantido.

;-)

Obs.: costumo colocar o link + o texto, pois frequentemente os sites são atualizados e por vezes, o link torna-se inválido. Procuro dessa forma, preservar o texto original para futuras consultas aqui.

link do texto:
http://office.microsoft.com/en-us/access-help/6-key-considerations-when-creating-access-2007-databases-HA010219005.aspx


trecho do texto:
TIP In previous versions of Access this was called a Microsoft Database Executable (MDE) file. The functionality and creation process are the same. If you open an older (Access 2002 or Access 2003) MDB file in Access 2007, a Make MDE command appears in the Database Tools group on the Database Tools tab in place of the Make ACCDE command that appears when you're working in an Access 2007 database.

quinta-feira, 10 de março de 2011

Mais um site sobre Outlook...

... com muitas informações!!!
http://www.outlookcode.com/

;-)

segunda-feira, 7 de março de 2011

Agenda no Office

Tenho visto muita gente desenvolvendo uma agenda no Accesss, mas creio que "reinventar a roda" é perda de tempo.
Segue minha opinião:
A maioria dos computadores (para não dizer todos) que têm o Access instalado, invariavelmente têm o MS Outlook também.
Então para que criar uma agenda no Access, se você tem no MS Outlook uma excelente agenda, totalmente funcional e completa?
Via VBA é possível fazer os dois aplicativos interagirem entre si, obtendo assim a produtividade esperada do pacote Office.
Falar em produtividade aqui no blog já é "chover no molhado", mas insisto no assunto para que os colegas programadores gastem menos tempo com soluções mirabolantes em VBA e entendam que a integração entre os aplicativos Office é o caminho para a produtividade.
Quem já vem acompanhando o blog, sabe que tenho a mesma opinião quanto a criação de controle de estoque em Excel: funciona quando a quantidade de itens é pequena (eu diria que até uns 50 itens no estoque e com pouca movimentação de entradas e saídas).
É o aplicativo inadequado para a tarefa.
Dúvidas? Vejam o famoso Northwind que é o banco de dados exemplo que vem no Office (não sei se na versão 2010 ainda vem).
Onde encontrar muita coisa de programação VBA no Outlook: http://www.rsoutlook.com


;-)

Zipando via VBA com o 7Zip

Segue uma adaptação de um código que eu peguei na internet.
Não é de minha autoria, mas vou deixar aqui para futuras consultas.
É bom ressaltar que o 7Zip é um compactador free e até o último comparativo que fiz, tinha uma taxa de compressão melhor que a do WinRAR.


Option Explicit

Dim nome_zip As Variant
Dim pasta_a_zipar As Variant
Dim strDate As String
Dim Pasta_destino As String
Dim oApp As Object


Sub Zipar_tudo_com_7Zip()

'Pasta onde estará o arquivo zipado
Pasta_destino = "C:\Users\todorok\Desktop\"

'Pasta que contém os arquivos a serem zipados
pasta_a_zipar = "C:\Users\todorok\Desktop\Kaizen\"

'Arquivo zip que contém os arquivos compactados
nome_zip = Pasta_destino & "backup" & ".zip"

'Criar um arquivo zip vazio
Call Novo_zip_vazio(nome_zip)

Set oApp = CreateObject("Shell.Application")
'Copiar os arquivos para dentro do arquivo zip vazio
oApp.NameSpace(nome_zip).CopyHere oApp.NameSpace(pasta_a_zipar).Items

'Aguardar o término da compactação
On Error Resume Next
Do Until oApp.NameSpace(nome_zip).Items.Count = oApp.NameSpace(pasta_a_zipar).Items.Count
Application.Wait (Now + TimeValue("0:00:01"))
Loop
On Error GoTo 0

MsgBox "Fim!"
End Sub

Sub Novo_zip_vazio(sPath)
'Se já existir um arquivo zip, apagá-lo e criar um novo
If Len(Dir(sPath)) > 0 Then Kill sPath
Open sPath For Output As #1
Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0)
Close #1
End Sub

Pesquisar este blog

Arquivo do blog

Quem sou eu

Minha foto
Administrador de Empresas/Técnico em Processamento de Dados. Microsoft Office User Specialist - Excel Proficient. Pós-graduado em Business Intelligence.