terça-feira, 7 de agosto de 2007

Automação - Excel

[]
É comum encontrarmos problemas com referência em automação com aplicativos Office, quando referenciamos uma biblioteca, por exemplo XP e temos instalada a versão 2003, então certamente ocorrerá um erro, de biblioteca ausente na referência.

Para evitar o erro, crie uma classe que faça este trabalho setando um objeto, sem usar a referência.

Em um novo módulo Classe cole o código abaixo e salve com o nome de "ExcelReporter"

=======================================================================

Option Explicit
Option Compare Database

Public Function
OpenWorkbook(FileName As String) As Object

On Error GoTo OpenWorkbook_Err

Dim ExcelApp As Object
Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.Visible = False

'Abre o arquivo no Excel
Dim wb As Object
Set
wb = ExcelApp.Workbooks.Open(FileName)

Set OpenWorkbook = wb

Exit Function

OpenWorkbook_Err:
Err.Raise vbObjectError + 100, _
"Project1.ExcelReporter.OpenWorkbook", _
"ExcelReporter component failure"

End Function



Public Sub CloseWorkbook(wb As Object)

On Error GoTo CloseWorkbook_Err

Dim app As Object
Set app = wb.Application
app.DisplayAlerts =
False

wb.Save
wb.Close
app.Quit


Exit Sub

CloseWorkbook_Err:
Err.Raise vbObjectError + 100, _ "Project1.ExcelReporter.CloseWorkbook", _
"ExcelReporter component failure"
Resume Next

End Sub

Para utilizar a Classe

Dim ex As ExcelReporter
Set ex = New ExcelReporter

Dim File AS String
File = "C:\Planilha.XLS"

'Para abrir
Dim wb As Object
Set wb = ex.OpenWorkbook(strFile)

Para Fechar

ex.CloseWorkbook wb

Pronto.... A forma mais facil de referenciar um objeto no Excel.
Espero que gostem

domingo, 29 de julho de 2007

Reiniciar Campo auto-numerador

[Exemplo]

Por muito tempo, procurei em Fóruns, sites, livros uma forma de reinicar um capo auto-numerador.

Hoje, admito que dificilmente usaria, pois, geralmente oculto essa informação.

Mas está aí.

Colaboração de Luiz Cláudio C. V. Rocha, no Fórum MSDN.

------------------------------------------------------------
Function ChangeSeed(strTbl As String, strCol As String, lngSeed As Long) As Boolean
'You must pass the following variables to this function.
'strTbl = Table containing autonumber field
'strCol = Name of the autonumber field
'lngSeed = Long integer value you want to use for next AutoNumber.

Dim cnn As ADODB.Connection
Dim cat As New ADOX.Catalog
Dim col As ADOX.Column

'Set connection and catalog to current database.
Set cnn = CurrentProject.Connection
cat.ActiveConnection = cnn

Set col = cat.Tables(strTbl).Columns(strCol)
col.Properties("Seed") = lngSeed

cat.Tables(strTbl).Columns.Refresh

If col.Properties("seed") = lngSeed Then
ChangeSeed = True
Else
ChangeSeed = False
End If

Set col = Nothing
Set cat = Nothing
Set cnn = Nothing

End Function
------------------------------------------------------------
Assinale a biblioteca Microsoft ADO Ext. for DDL and Security.

Add-In - Customizando tempo

Ao conhecermos novas ferramentas de trabalho, vemos que algumas melhorias são significativas.

Meu primeiro contato com o VSTO foi muito confuso, pois, sempre trabalhei com MS Access e senti algumas dificuldades, ainda estou estudando a ferramenta.

Uma dentre centenas de facilidades é a indentação automática do código. No entando, descobri duas ferramentas que, hoje em dia não consigo trabalhar sem elas.

[Smart Indenter]: Responsável por Indentar meu código, um simples Ctrl + M, indenta o módulo todo, vale a pena instalar.

[MZ-Tools] - Dentre muitas funcionabilidades, como armazenar templates de códigos, revisão (encontra, por exemplo, variáveis declaradas e não utilizadas), nenhuma delas me ajuda tanto quanto o tratamento de erros automaticamente. Antes deste Add-In, perdia tempo escrevendo o tratamento de erros, hoje basta um clique ou um um [Ctrl + Alt + E] (Minha tecla de atalho para tratar Erros.

Com certeza, após a instalação destes Add-In, vocês não conseguirão trabalhar sem eles.

Atachando Arquivos como Binários

Exemplo

Por diversas vezes precisei montar templates de documentos (.doc, .xls, .html ou arquivo de imagem) para exportar dados, porém, sempre precisava salvar o documento em um local padrão e em algumas vezes havia o problema do usuário apagar, alterar nome, dentre outros problemas.

Então resolvi, anexar os documentos em um campo OLE e anexa-los no bando de dados.

Este procedimento é aconselhavel quando vamos atachar apenas templates, ou seja, poucos documentos. Seria inviável anexar fotos de produtos, por exemplo, para um cadastro de estoque.

Segue a função:

**** Importando o arquivo para banco de dados
----------------------------------------------------------
Public Sub ImportFile(FileName As String, Dest As field)
'Parâmetros: FileName = Nome, extensão e caminho completo do Arquivo
' Dest = Campo Tipo Ole que será armarezado o arquivo (obtenha através de uma RecordSet.

On Error GoTo ImportFile_Err

Dim buf

Open FileName For Binary As #1
buf = Input(LOF(1), 1)
Close #1

Dest.Value = Null
Dest.AppendChunk buf
Exit Sub


ImportFile_Err:
MsgBox Err.Description , vbExclamation + vbOKOnly, "Application Error"
Resume Next

End Sub
----------------------------------------------------------
**** Exportando para caminho específico

Public Sub DumpFile(OutFileName As String, FileData)

On Error GoTo DumpFile_Err

Open OutFileName For Output As #1
Print #1, FileData
Close #1
Exit Sub

DumpFile_Err:
MsgBox Err.Description, vbExclamation + vbOKOnly, "Application Error"
Resume Next
End Sub

----------------------------------------------------------
Criei um exemplo para vocês: