Important:

Quaisquer soluções e/ou desenvolvimento de aplicações pessoais, ou da empresa, que não constem neste Blog podem ser tratados como consultoria freelance.

Views

VBA Access - Manipulando importações salvas

Inline image 1

Para nos beneficiarmos da rapidez do MS Office 2007, podemos [e devemos] gravar as importações que efetuamos 'na mão'. E posteriormente quando precisarmos dessas, podemos evocá-las das entranhas do MS Access.


Using a Saved Import in Access 2007 via a macro or VBA
Saved Import Access 2007

Não envergonhece-se de utilizar o comando banal, mas útil, abaixo:

DoCmd.RunSavedImportExport "imp_bernardes_Invoices"


E que tal ampliar os seus conhecimentos sobre as entranhas do MS Access, fuçando em:

Office button

Access Options

Current Database

Navigation Options

Show System Objects

É interessante ver que o MS Access grava internamente um nome diferente do que utilizamos externamente.

Reference:


TagsVBA, Access, import, export, automation, automação, importação, exportação, 

VBA Access - Comparação de tipos de dados.

Inline image 1

Usar o tipo certo de definição de dados é importantíssimo, nada melhor do que detectar o tipo antes de desenvolver nossas soluções. Seguem referências da própria Microsoft:

Comparação de tipos de dados
O mecanismo de banco de dados do MS Access reconhece diversos conjuntos de tipos de dados que se sobrepõem. No MS Access, existem quatro contextos diferentes nos quais talvez seja necessário especificar um tipo de dados: no modo de design da tabela (modo Design: uma janela que mostra o design destes objetos de banco de dados: tabelas, consultas, formulários, relatórios, macros e páginas de acesso a dados. No modo Design, você pode criar novos objetos de banco de dados e modificar o design dos existentes.), na caixa de diálogo Parâmetros da Consulta, no Visual Basic e no modo SQL em uma consulta.
A tabela a seguir compara os cinco conjuntos de tipos de dados correspondentes a cada contexto. A primeira coluna lista as configurações da propriedade Type disponíveis no modo de design da tabela e as cinco configurações da propriedade FieldSize para o tipo de dados Número (tipo de dados Número: em um banco de dados do MS Access, um tipo de dados de campo para dados numéricos que serão usados em cálculos matemáticos. 
Use o tipo de dados Moeda, entretanto, para exibir valores de unidade monetária.). A segunda coluna lista os tipos de dados de parâmetro de consulta disponíveis para estruturar consultas parâmetro (consulta parâmetro: uma consulta na qual um usuário especifica de maneira interativa um ou mais valores de critérios. Uma consulta parâmetro não é um tipo separado de consulta; na verdade, aumenta a flexibilidade de uma consulta.) na caixa de diálogo Parâmetros da consulta
A terceira coluna lista os tipos de dados correspondentes do Visual Basic. A quarta coluna lista tipos de dados do objeto Field (DAO). A quinta coluna lista os tipos de dados SQL do mecanismo de banco de dados do  MS Access  correspondentes definidos por esse mecanismo, juntamente com os seus sinônimos válidos.
Campos de tabela Parâmetros da consultaVisual BasicConstantes da propriedade Tipo de dados ADO SQL do mecanismo de banco de dados do Microsoft Access e sinônimos
Sem suporteBinárioSem suporte adBinaryBINARY (consulte Observações) (Sinônimo: VARBINARY)
Sim/NãoSim/NãoBoolean (Booleano: uma expressão que pode ser avaliada como verdadeira (diferente de zero) ou falsa (0). Você pode usar as palavras-chave Verdadeiro e Falso para fornecer os valores de -1 e 0, respectivamente. O tipo de dados de campo Sim/Não é booleano e tem o valor de -1 para Sim.) adBooleanBOOLEAN (Sinônimos: BIT, LOGICAL, LOGICAL1, YESNO)
Número (Tamanho do campo = Byte) ByteByte (tipo de dados Byte: um tipo de dados do banco de dados do Access usado para armazenar números inteiros positivos pequenos no intervalo de 0 a 255.) adUnsignedTinyIntBYTE (Sinônimo: INTEGER1)
AutoNumeração (Tamanho do campo=
Inteiro longo)
Inteiro longoLong (tipo de dados Longo: um tipo de dados básico que contém inteiros grandes. A variável Long é armazenada como um número de 32 bits no intervalo de - 2.147.483.648 a 2.147.483.647.) adIntegerCOUNTER (Sinônimo: AUTOINCREMENT)
Moeda MoedaCurrency (tipo de dados Unidade Monetária: em um banco de dados do Microsoft Access, um tipo de dados útil para cálculos que envolvam moeda ou para cálculos de ponto fixo nos quais a precisão é extremamente importante.) adCurrencyCURRENCY (Sinônimo: MONEY)
Data/hora Data/horaDate (tipo de dados Data/Hora: tipo de dados do banco de dados do Access usado para armazenar informações de data e hora.) adDateDATETIME (Sinônimos: DATE, TIME, TIMESTAMP)
Número (Tamanho do campo = Duplo) DuploDouble (tipo de dados Duplo: um tipo de dados básico que contém números de ponto flutuante de dupla precisão. É armazenado como um número de 64 bits e seu intervalo de valores vai de aproximadamente -1,797E308 a -4,940E-324 (negativo), de 4,94E-324 a 1,797E308 (positivo) e 0.) adDoubleDOUBLE (Sinônimos: FLOAT, FLOAT8, IEEEDOUBLE, NUMBER, NUMERIC)
AutoNumeração/GUID
(Tamanho do campo= Código de replicação)
Código de replicaçãoSem suporteadGUID GUID
Número (Tamanho do campo = Inteiro longo) Inteiro longoLongadIntegerLONG (Consulte Observações) (Sinônimos: INT, INTEGER, INTEGER4)
Objeto OLEObjeto OLEString (tipo de dados Seqüência: um tipo de dados básico que contém caracteres, um caractere por 2 bytes. Uma seqüência de comprimento fixo pode conter de 1 a 64 K de caracteres; uma seqüência de comprimento variável pode conter de 1 a 2 bilhões.) adLongVarBinaryLONGBINARY (Sinônimos: GENERAL, OLEOBJECT)
Memo MemoStringadLongVarWCharLONGTEXT (Sinônimos: LONGCHAR, MEMO, NOTE)
Número (Tamanho do campo = Simples) SimplesSingle (tipo de dados Simples: um tipo de dados que armazena variáveis de ponto flutuante de dupla precisão como 32 bits (4 bytes) no intervalo de -3,402823E38 a -1,01298E-45 para valores negativos e 1,401298E-45 a 3,402823E38 para valores positivos.) adSingleSINGLE (Sinônimos: FLOAT4, IEEESINGLE, REAL)
Número (Tamanho do campo = Inteiro) InteiroInteger (tipo de dados Inteiro: um tipo de dados fundamental que contém números inteiros. Uma variável Integer é armazenada como um número de 16 bits (2 bytes) no intervalo de -32.768 a 32.767.) adSmallIntSHORT (consulte Observações) (Sinônimos: INTEGER2, SMALLINT)
Texto Texto StringadVarWCharTEXT (Sinônimos: ALPHANUMERIC, CHAR, CHARACTER, STRING, VARCHAR)
HiperlinkMemoStringadLongVarWChar LONGTEXT (Sinônimos: LONGCHAR, MEMO, NOTE)
Sem suporteValorVariant (tipo de dados Variante: o tipo de dados padrão para variáveis que não têm caracteres de declaração de tipo quando uma instrução Deftipo não está sendo usada. Um Variante pode armazenar dados numéricos, seqüências de caracteres, data/hora, valores Nulo ou dados Vazio.) adVariantVALUE (consulte Observações)
  Observações
    • MS Access propriamente não utiliza o tipo de dados BINARY. Esse tipo é reconhecido somente para utilização em consultas a tabelas vinculadas provenientes de outros produtos de banco de dados que oferecem suporte ao tipo de dados BINARY.

    • O tipo de dados INTEGER no SQL do mecanismo de banco de dados do MS Access não corresponde ao tipo de dados Integer para campos de tabela, parâmetros de consulta ou Visual Basic. Em vez disso, no SQL, o tipo de dados INTEGER corresponde a um tipo de dados Long Integer para campos de tabela e parâmetros de consulta e a um tipo de dados Long no Visual Basic.

    • A palavra reservada VALUE não representa um tipo de dados definido pelo mecanismo de banco de dados do Access. Entretanto, em consultas do Microsoft Access ou do SQL, a palavra reservada VALUE pode ser considerada um sinônimo válido para o tipo de dados Variant do Visual Basic.

    • Se você estiver definindo o tipo de dados para um objeto DAO (DAO (Objetos de Acesso a Dados): uma interface de acesso a dados que se comunica com o Microsoft Jet e com fontes de dados compatíveis com ODBC para se conectar, recuperar, manipular e atualizar dados e a estrutura do banco de dados.) em código do Visual Basic, terá que configurar a propriedade Type do objeto.



Reference:


TagsVBA, Access, SQL, Visual Basic, DAO, Type, Tipo, Variables, data, dados, ODBC, 

VBA Access - Excluindo fontes de dados conectadas.

Inline image 1


Quando criamos aplicações de automação com o MS Access, não raro precisarmos implementar conexões nas diversas bases de dados como: planilhas MS Excel, arquivos Texto, ou outras tabelas MS Access, sites da Web, etc... Essas conexões geralmente precisam ser refeitas e/ou excluídas.

Abaixo segue parte de códigos com variantes para aplicar ao seu gosto...Boa diversão!

Esta primeira função é muito rápida, ela checa se o objeto que desejamos excluir está disponível para deleção:


CÓDIGO: 

Function CheckExistTbl(tblName As String) As Integer
    ' Author:                     Date:               Contact:                 URL:
    ' André Bernardes             09/11/2010 09:45   bernardess@gmail.com     https://sites.google.com/site/vbabernardes/
    ' Application: 
    ' Detecta a tabela e a deleta.

    Dim i As Integer ' Counter.
    
    Let CheckExistTbl = False

    For i = 0 To CurrentData.AllTables.Count - 1

        If CurrentData.AllTables(i).Name = tblName Then
            Let CheckExistTbl = True
        End If
    
    Next i
End Function

Por exemplo: 


CÓDIGO: 

If CheckExistTbl(strConectionTbl01) Then
   DoCmd.DeleteObject acTable, strConectionnTbl01
Endif


Abaixo demonstro uma das inúmeras técnicas para se conectar dados à sua aplicação MS Access, neste caso efetuo conexões a outras bases MS Access.


CÓDIGO: 

Function ConectAll(nBase As String, strConection As String)
    ' Author:                     Date:               Contact:                 URL:
    ' André Bernardes             09/11/2010 09:31   bernardess@gmail.com     https://sites.google.com/site/vbabernardes/
    ' Application: 
    ' Efetua as conexões.

    Dim dbsTemp As Database
    Dim strMenu As String
    Dim strInput As String
    Dim nTbl01 As String
    Dim nTbl02 As String
    Dim nTbl03 As String

    ' Tabelas
    nTbl01 = "tbl_01x"
    nTbl02 = "tbl_02y"
    nTbl03 = "tbl_03k"

    Set dbsTemp = CurrentDb

    ' Deleta os objetos pré-existentes.
    If CheckExistTbl(strConection & nTbl01) Then
        Call Banner("Desconectando tabela:" & strConection & nTbl01)
        DoCmd.DeleteObject acTable, strConection & nTbl01

        Call Banner("Desconectando tabela:" & strConection & nTbl02)
        DoCmd.DeleteObject acTable, strConection & nTbl02

        Call Banner("Desconectando tabela:" & strConection & nTbl03)
        DoCmd.DeleteObject acTable, strConection & nTbl03
    End If

    ' Conecta o grupo de tabelas respectivas ao mês de análise.
    Call Banner("Conectando a tabela: " & strConection & nTbl01)
    ConnectOutput dbsTemp, strConection & nTbl01, ";DATABASE=" & nBase, nTbl01

    Call Banner("Conectando a tabela: " & strConection & nTbl02)
    ConnectOutput dbsTemp, strConection & nTbl02, ";DATABASE=" & nBase, nTbl02

    Call Banner("Conectando a tabela: " & strConection & nTbl03)
    ConnectOutput dbsTemp, strConection & nTbl03, ";DATABASE=" & nBase, nTbl03
End Function

 Perceba no código acima a utilização das funções explanadas anteriormente.

Abaixo observaremos a simples e suave conexão da fonte de dados com o banco de dados atual:

CÓDIGO: 

Sub ConnectOutput(dbsTmp As Database, strTbl As String, strConnect As String, strSourceTbl As String)
    ' Author:                     Date:               Contact:                 URL:
    ' André Bernardes             09/11/2010 08:01   bernardess@gmail.com     https://sites.google.com/site/vbabernardes/
    ' Application:
    ' Efetua as conexões.

    Dim tblLinked As TableDef

    Set tblLinked = dbsTmp.CreateTableDef(strTbl)

    Let tblLinked.Connect = strConnect
    Let tblLinked.SourceTableName = strSourceTbl

    dbsTmp.TableDefs.Append tblLinked
End Sub


Outra técnica também eficiente, seria utilizar o código abaixo:

CÓDIGO: 

    Dim d_b As Database

    On Error GoTo ProcessingErrorMsg:

    Set d_b = CurrentDb()

    d_b.TableDefs.Delete "tbl_Bernardes"

    Exit Sub

ProcessingErrorMsg:

    Select Case Err.Number
             Case 3265 'Table
                    Resume Next
             Case Else
                    MsgBox Err.Number & " - Descrição: " & Err.Description, vbExclamation, Err.Source
    End Select
Reference:


TagsVBA, Access, datasource, data, dados, excluir,  object

VBA Access - Documentando os objetos da aplicação

VBA Access - Documentando Objetos da Aplicação MS Access - Code Documenter


ACESSE AO CÓDIGO ATUALIZADO PARA TODAS AS VERSÕES AQUI.


Envie seus comentários e sugestões e compartilhe este artigo!

brazilsalesforceeffectiveness@gmail.com

✔ Brazil SFE®✔ Brazil SFE®´s Facebook´s Profile  Google+   Author´s Professional Profile  ✔ Brazil SFE®´s Pinterest       ✔ Brazil SFE®´s Tweets

VBA Access - Ordenando a propriedade de um RecordSet.

Inline image 1

Os Recordsets são um dos objetos mais utilizados quando manipulamos dados. Esta dica simples, mas útil, é importante conceitualmente. Procure acrescentar sua experiência a este código e depois compartilhe os seus resultados conosco, postado aí embaixo.

De vez em quando é necessário que re-organizemos o modo como o nosso Recordset será ordenado, isso após termos definido a string SQL.

Bem, isso pode ser implementado mesmo após este momento como poderá ver abaixo:


Sub SortRecordset()
    Dim intCounter As Integer
    Dim rst As ADODB.Recordset

    Set rst = New ADODB.Recordset

    Letrst.ActiveConnection = CurrentProject.Connection
    Let rst.CursorLocation = adUseClient

    rst.Open "Select * from tbl_Bernardes"

    Debug.Print "Sem ordenação."

    Do Until rst.EOF
        Debug.Print rst("BernardesID")

        rst.MoveNext
    Loop

    Debug.Print "Ordenado."

    Let rst.Sort = "[BernardesID]"

    Do Until rst.EOF
        Debug.Print rst("BernardesID")

        rst.MoveNext
    Loop

    rst.Close

    Set rst = Nothing
End Sub


Reference:

TagsVBA, Access, order, property, sprt, recordset, ADODB,

VBA - Brasil, O amadurecimento do nosso legado - Brazil, VBA Development reflections

Inline image 1

Quando criei este Blog específico de VBA, a inter-colaboração de códigos VBA inexistia no mercado nacional, ou era muito incipiente. A utilização profissional de Dashboards e Scorecards existia somente como a cópia e adaptação de modestos extravagantes modelos vindos de fora do Brasil, através das corporações que mantinham filiais por aqui. Nestas versões 'traduzidas' dentro dos ambientes corporativos tentava-se espelhar em tais modelos, as informações da filial brasileira ou fazíamos aqui a consolidação da América Latina.

O desenvolvimento VBA naquela época restringia-se as expressão "faz-se macros no excel'. 

Agora em 2012, vivenciamos um mercado de desenvolvimento VBA maduro, cheio de profissionais experientes, Blogs competentíssimos, inúmeras excelentes soluções de desenvolvimento e aplicações de automação disponíveis para várias pessoas baixarem e usarem. 

O mercado nacional está amadurecido e pronto para colaborar com o mercado internacional. Criando soluções e enviado-as as matrizes das empresas.

TagsVBA, Brasil, Brazil, Mercado, VBA Development

VBA Access - Compactando e Descompactando arquivos - Zip and Unzip Files






Em algumas ocasiões precisamos exportar arquivos como parte do fluxo de trabalho dentro da nossa aplicação MS Access, invariavelmente seria muito bom que estes pudessem sair compactados. Mas, se há um ponto sensível com o Zip é o de que não há nenhuma maneira simples de 'Zipar' ou descompactar um arquivos sem depender de um utilitários de terceiros. E, ao pensar sobre isso, considere que a capacidade de 'Zipar' está integrada ao Windows Explorer. Parece haver alguma restrição de licenciamento.

Felizmente, Ron de Bruin forneceu-nos uma solução que envolve automatizar o Windows Explorer (aka Shell32). O objeto para compactação Shell32.Folder pode ser uma pasta real ou uma pasta Zip, disponível para manipulação como se fosse um Shell32.Folder. Assim podemos usar o "Copiar aqui", método do Shell32.Folder, para mover os arquivos para dentro e para fora do arquivo Zip.

Como Ron observou, há um bug sutil quando trata-se da recuperação do Shell32.Folder através do método Shell32.Applications Namespace

Portanto, este código não vai funcionar como esperado:

Dim s As String
Dim f As Object 'Shell32.Folder

Let s = "C:\MyZip.zip"
Set f = CreateObject("Shell.Application").Namespace(s)

f.CopyHere "C:\MyText.txt" 'Error occurs here

De acordo com a documentação do MSDN, se o Método Namespace falhar, o valor de retorno será nada, e  poderemos ter um erro aparentemente não relacionado (Error 91 "With or object variable not set"). É por isso que Ron de Bruin usa Variant na sua amostra. 

Convertendo a string em uma variante irá funcionar também:

Dim s As String
Dim f As Object 'Shell32.Folder

Let s = "C:\MyZip.zip"
Set f = CreateObject("Shell.Application").Namespace(CVar(s))

f.CopyHere "C:\MyText.txt"

Alternativamente, pode optar por referenciar a Shell32.dll (normalmente no Windows\System32), modo early bind. A Vinculação antecipada não está sujeita a erro. No entanto, nossa preferência será a de late bind, para evitar qualquer problema com versões que possam ocorrer durante a execução de código num computador diferente, sistemas operacionais diferentes, service packs diferentes e assim por diante.

Ainda assim, o modo early bind pode ser útil para o desenvolvimento e validação do seu código antes de mudá-lo definitivamente para late bind.

Outra questão com a qual precisamos lidar é a de que, por existir apenas um método ou o outro disponível, ("Copiar aqui" ou "Mover para cá") com o objeto Shell32.Folder, temos de considerar como devemos lidar com a nomeação dos arquivos que serão compactados, especialmente quando estivermos descompactando os arquivos que potencialmente têm o mesmo nome ou devem substituir os arquivos originais no diretório de destino. 

Isso pode ser resolvido de duas maneiras diferentes

1) Descompacte os arquivos em um diretório temporário, renomeando-os, em seguida, movendo-os para o diretório final ou;

2) Renomeie um arquivo antes de 'zipar', assim terá um nome único quando descompactar Zip e, portanto, poderá ser renomeado. 

A opção 1 é mais segura, mas exige a criação de um diretório temporário e a sua eventual limpeza, mas quando você tem controle sobre o que o diretório de destino conterá, a opção 2 é bastante simples.

Em qualquer abordagem, podemos usar o VBA para renomear um arquivo simplesmente como:

Name strUnzippedFile As strFinalFileName

Finalmente, ao usar Shell32, estamos essencialmente automatizando o aspecto visual do Windows Explorer. Assim, quando invocarmos um "Copiar aqui" (CopyHere), será equivalente a realmente arrastar um arquivo e soltá-lo numa pasta (ou um arquivo zip). Isto significa que virá com os componentes da interface do usuário que podem impor algumas questões, especialmente quando estivermos automatizando o processo. Neste caso, é preciso esperar até que a compressão seja concluída antes de tomarmos qualquer tipo de ação. Porque será uma ação interativa, que ocorre de forma assíncrona, precisaremos escrever um código de espera. 

O monitoramento de uma compressão fora do processo pode ser complicado e por isso desenvolveremos um salvaguarda, que abrange diferentes contingências, tais como a compressão ocorrendo muito rapidamente, ou quando há um atraso entre a caixa de diálogo de compressão.

Faremos isso de 3 maneiras diferentes:

a) Um timing após 3 segundos para os arquivos pequenos, 

b) Acompanhar a contagem de itens do arquivo Zip, 

c) e Monitorização da presença de compressão de diálogo. 

A última parte nos obriga a utilizar o método WScript.Shell object's AppActivate porque ao contrário do método de acesso embutido o WScript.Shell retornará um valor booleano que pode ser usado para determinar se a ativação foi bem sucedida ou não, e, portanto, implicará na presença / ausência do "Comprimir ..." diálogo sem um gerenciamento bagunçado da API.

Exemplo de uso
O código completo está abaixo para usar:

'Cria um novo arquivo Zip e Zipa o arquivo PDF
Zip "C:\Temp\MyNewZipFile.zip", "C:\Temp\MyPdf.pdf

'Unzip o PDF e coloca-o no mesmo diretório
Unzip "C:\Temp\MyNewZipFile.zip"

'Exemplo de múltipla compactação num simples arquivo Zip.
Zip "C:\Temp\MyZipFile.zip", "C:\Temp\A1.pdf"
Zip "C:\Temp\MyZipFile.zip", "C:\Temp\A2.pdf"
Zip "C:\Temp\MyZipFile.zip", "C:\Temp\A3.pdf"

'Descompacta um arquivo Zip com mais de um arquivo
'colocando-o nu mpasta compartilhada sobreescrevendo qualquer arquivo préexistente.

Unzip "C:\Temp\MyZipFile.zip", "Z:\Shared Folder\", True

Aqui está o algoritmo completo do procedimento para Zipar e Descompactar, basta copiá-lo num novo módulo VBA e aproveitar:

Private Declare Sub Sleep Lib "kernel32" ( _
    ByVal dwMilliseconds As Long _)

Public Sub Zip( _
    ZipFile As String, _
    InputFile As String _)

On Error GoTo ErrHandler

    Dim FSO As Object 'Scripting.FileSystemObject
    Dim oApp As Object 'Shell32.Shell
    Dim oFld As Object 'Shell32.Folder
    Dim oShl As Object 'WScript.Shell
    Dim i As Long
    Dim l As Long

    Set FSO = CreateObject("Scripting.FileSystemObject")

    If Not FSO.FileExists(ZipFile) Then
        'Create empty ZIP file
        FSO.CreateTextFile(ZipFile, True).Write _
            "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
    End If

    Set oApp = CreateObject("Shell.Application")
    Set oFld = oApp.NameSpace(CVar(ZipFile))

    Let i = oFld.Items.Count

    oFld.CopyHere (InputFile)

    Set oShl = CreateObject("WScript.Shell")

    'Search for a Compressing dialog
    Do While oShl.AppActivate("Compressing...") = False
        If oFld.Items.Count > i Then
            'There's a file in the zip file now, but
            'compressing may not be done just yet
            Exit Do
        End If
        If l > 30 Then
            '3 seconds has elapsed and no Compressing dialog
            'The zip may have completed too quickly so exiting
            Exit Do
        End If

        DoEvents

        Sleep 100

        Let l = l + 1
    Loop

    ' Wait for compression to complete before exiting
    Do While oShl.AppActivate("Compressing...") = True
        DoEvents

        Sleep 100
    Loop

ExitProc:
    On Error Resume Next
        Set FSO = Nothing
        Set oFld = Nothing
        Set oApp = Nothing
        Set oShl = Nothing
    Exit Sub
ErrHandler:
    Select Case Err.Number
        Case Else
            MsgBox "Error " & Err.Number & _
                   ": " & Err.Description, _
                   vbCritical, "Unexpected error"
    End Select

    Resume ExitProc

    Resume
End Sub

Public Sub UnZip( _
    ZipFile As String, _
    Optional TargetFolderPath As String = vbNullString, _
    Optional OverwriteFile As Boolean = False _)

On Error GoTo ErrHandler
    Dim oApp As Object
    Dim FSO As Object
    Dim fil As Object
    Dim DefPath As String
    Dim strDate As String

    Set FSO = CreateObject("Scripting.FileSystemObject")
   If Len(TargetFolderPath) = 0 Then
        Let DefPath = CurrentProject.Path & "\"
    Else
        If FSO.folderexists(TargetFolderPath) Then
            Let DefPath = TargetFolderPath & "\"
        Else
            Err.Raise 53, , "Folder not found"
        End If
    End If

    If FSO.FileExists(ZipFile) = False Then
        MsgBox "System could not find " & ZipFile _
            & " upgrade cancelled.", _
            vbInformation, "Error Unziping File"
        Exit Sub
    Else
        'Extract the files into the newly created folder
        Set oApp = CreateObject("Shell.Application")

        With oApp.NameSpace(ZipFile & "\")
            If OverwriteFile Then
                For Each fil In .Items
                    If FSO.FileExists(DefPath & fil.Name) Then
                        Kill DefPath & fil.Name
                    End If
                Next
            End If
            oApp.NameSpace(CVar(DefPath)).CopyHere .Items
        End With

        On Error Resume Next
        Kill Environ("Temp") & "\Temporary Directory*"

        'Kill zip file
        Kill ZipFile
    End If

ExitProc:
    On Error Resume Next
    Set oApp = Nothing
    Exit Sub
ErrHandler:
    Select Case Err.Number
        Case Else
            MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, "Unexpected error"
    End Select
    Resume ExitProc
    Resume
End Sub



Reference: Ron de Bruin

Tags: VBA, Access, Zip, Unzip, compact, compactar, Shell32, Shell32.Folder, Shell32.Applications, Namespace, Dll, Shell32.dll, API, 

LinkWithinBrazilVBAAccessSpecialist

Related Posts Plugin for WordPress, Blogger...

Vitrine