quarta-feira, 15 de agosto de 2012

Como utilizar a planilha enquanto o UserForm está na tela

Dica boba e super simples, mas talvez alguém ainda não saiba:
Quanto tiver um UserForm aberto na tela e necessitar navegar pela planilha, altere a propriedade "Modal" do formulário para FALSE e veja o resultado.
É como se fosse uma tela "flutuando" sobre a planilha...

;-)

domingo, 12 de agosto de 2012

Desproteger planilhas via VBA

Este é um dos códigos mais "manjados" da internet.
Não sei a autoria, estou deixando aqui apenas para futuras consultas.


Sub DesprotegerPlanilhaAtiva()
Dim i, i1, i2, i3, i4, i5, i6 As Integer, j As Integer, k As Integer, l As Integer, m As Integer, n As Integer
On Error Resume Next
For i = 65 To 66
For j = 65 To 66
For k = 65 To 66
For l = 65 To 66
For m = 65 To 66
For i1 = 65 To 66
For i2 = 65 To 66
For i3 = 65 To 66
For i4 = 65 To 66
For i5 = 65 To 66
For i6 = 65 To 66
For n = 32 To 126
ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If ActiveSheet.ProtectContents = False Then
MsgBox "Planilha desprotegida com sucesso!!!"
Exit Sub
End If
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
Next
End Sub

segunda-feira, 16 de julho de 2012

O drive de CD/DVD sumiu...

Demorou mas aconteceu comigo também: o drive de cd/dvd aparece no setup... mas nem sinal dele no Windows Explorer.
Encontrei na internet diversas soluções alterando o registro do Windows, o que não é indicado para principiantes pois um erro no procedimento pode causar mais problemas do que ajudar.
Felizmente no site da Microsoft tem um programa que faz isso automaticamente, bem do jeito que o usuário gosta: alguns click's e pronto!
Segue o link abaixo:

http://support.microsoft.com/kb/314060/pt-br

;-)

terça-feira, 26 de junho de 2012

Outlook - enviando e-mail numa determinada data

Outro dia precisei agendar o envio de um e-mail e procurei no Outlook alguma opção para esta finalidade.
Depois de muito pesquisar no help como "agendamento" e coisas semelhantes, acabei descobrindo que, na verdade a coisa é tratada meio que na "contramão".
Em vez de agendar para enviar em tal data, a regra é ... atrasar o envio até tal data!
Tudo muito simples, depois que você criar a mensagem, clique em Opções > atrasar o envio da mensagem até... e depois é só enviar o e-mail. Ele ficará parado na caixa de saída até a data determinada.
Simples não?
Sim, simples depois que se aprende como fazer!
;-)

sábado, 21 de abril de 2012

Mais informações sobre programação no Outlook VBA e quem diria... no site da Microsoft! Pesquisar no site da Microsoft é um verdadeiro trabalho de garimpagem, haja vista a imensa quantidade de informações disponíveis. Material sobre programação no Outlook ainda é escasso em relação aos outros aplicativos do pacote Office, assim qualquer descoberta merece ser divulgada. ;-)


 http://msdn.microsoft.com/en-us/library/gg537298(v=office.12).aspx

domingo, 26 de fevereiro de 2012

Macetes com o ListBox no Access

Utilizando o ListBox num formulário Access, me deparei com alguns problemas e o primeiro deles, quase imperceptível: dependendo da quantidade de dados, o carregamento não é completo.
Por exemplo, carregar apenas uma coluna, o método "AddItem" do ListBox vai na boa, o detalhe é que se a quantidade de linhas é muito grande, as últimas não são carregadas!
Pior de tudo é que o Access nem dá mensagem de erro, simplesmente não carrega.
O número de linhas diminui a medida em que o número de colunas aumenta.

Em tempo, considerando uma quantidade muito grande de registros, talvez o ListBox não seja a melhor solução.
Tenho um aplicativo em que a quantidade de registros varia normalmene de 1 a 20, mas existem situações que podem ultrapassar a 3 mil. São exceções, mas podem ocorrer, por isso mantive a solução do ListBox.

Bem, continuando com a ajuda do amigo Gib@, mudei o carregamento do ListBox, apenas alterando a fonte de dados para uma tabela (sem carregamento por VBA).

Carregando uma grande quantidade de registros, o problema que surge é a navegação.
Pela barra de rolagem vertical, demora para se chegar até o último registro.
Um Requery aqui não funciona obviamente.

Após um tempinho tentando descobrir a causa dessa péssima navegabilidade, criei um "quebra-galho" mas que funciona: selecionar o último registro da lista e em seguida selecionar o primeiro.
Dessa forma, ao navegar pela barra de rolagem vertical todos os registros são exibidos mais rapidamente.

Essa questão na navegabilidade é mais facilmente verificada se montar ume exemplo, colocar aqui em palavras fica meio abstrato.

Uma outra forma de carregar o ListBox com uma quantiade grande de registros é clonar o RecordSet, veja exemplo mais abaixo.
Aí aparece outro problema: as colunas são colocadas em ordem alfabética.
Se o carregamento é por VBA, o ListBox.ColumnOrder não funciona,o que força a outro "quebra-galho": utilizar alias para as colunas no SQLÇ de forma que fiquem na ordem desejada e não colocar cabeçalhos de coluna no ListBox.
Para isso, basta utilizar Labels acima do ListBox, o resultado visual é bem melhor, visto que podemos trabalhar as propriedades de modo bem flexível.


Option Compare Database
Option Explicit

Private Sub carrega_lista()

Dim rst As New ADODB.Recordset
Dim ssql As String

Me.lst_teste.RowSource = ""

ssql = "SELECT cod as a_001, "
ssql = ssql & "Empresa as a_001,"
ssql = ssql & "Contato as a_002,"
ssql = ssql & "Cargo as a_003,"
ssql = ssql & "FROM fornecedores "

rst.Open ssql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
rst.MoveFirst

Set Me.lst_teste.Recordset = rst.Clone

Me.lst_teste.Selected(rst.RecordCount) = True
Me.lst_teste.Selected(1) = True

rst.Close
Set rst = Nothing

MsgBox "fim"

End Sub

;-)

sábado, 11 de fevereiro de 2012

Onde buscar informações e ajuda sobre o Access

Às vezes não é preciso ter um monte de links para buscar ajuda na programação do Access.
Minhas fontes de consultas são poucas, mas nesses sites quase sempre encontro o que preciso e sempre que possível, procuro ajudar também quem necessita.
Abaixo os links que estão sempre nos meus favoritos:

http://www.expertaccess.com.br/forumnew/default.asp
http://comunidade.itlab.com.br/eve
http://usandoaccess.com.br/index.htm
http://ativoaccess.com.br/
http://www.mvps.org/
http://www.accessfaq.com.br/webroot/

No mvps.org tem material para todos os aplicativos do pacote Office.

;-)

sexta-feira, 3 de fevereiro de 2012

Listar arquivos de uma pasta

Não me lembro se publiquei anteriormente outra planilha com a mesma função, mas eu precisei novamente e como o prompt do DOS é bloqueado no meu trabalho, escrevi este código.
Quem puder usar o prompt, basta dar um DIR c:\pasta *.* > lista.txt e depois editar o TXT.

;-)



Option Explicit
Dim caminho As String
Dim arquivo As String
Dim i As Integer


Private Sub cmd_lista_Click()
On Error GoTo erro

With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = Application.DefaultFilePath & "\"
.Title = "Selecione a pasta"
.Show
If .SelectedItems.Count = 0 Then
Exit Sub
Else
caminho = .SelectedItems(1)
End If
End With

Range("A:A").Clear
Range("A1").Value = "Lista dos arquivos"

arquivo = Dir(caminho & "\*.*")

i = 2
Do Until arquivo = ""
Cells(i, 1) = arquivo
i = i + 1
arquivo = Dir
Loop

Worksheets("Plan1").Columns("A:A").AutoFit

Range("A2").Select
ActiveWindow.FreezePanes = True

Exit Sub

erro:
MsgBox Err.Description, vbOKOnly
Exit Sub


End Sub

domingo, 22 de janeiro de 2012

Criar um compromisso no Outlook


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

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.



;-)

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:

http://office.microsoft.com/pt-br/access-help/coleta-de-dados-por-meio-de-mensagens-de-email-HA010015427.aspx

;-)



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

;-)

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.


Option Compare Database
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.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.





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

;-)


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

Carro personalizado


Este não podia ficar de fora do blog!!!

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

;-)

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.