Uso do VBA no PowerPoint é raro, lembro de ter visto uma única vez, um colega de trabalho utilizar.
Eu mesmo utilizei somente para uma demonstração, depois nunca mais.
Sinceramente não vejo muita utilidade, mas é bom saber que existem publicações sobre o assunto.
Powerfull Powerpoint For Educators.
;-)
Eventualmente dicas sobre outros programas, Windows e hardware.
domingo, 20 de março de 2016
quarta-feira, 10 de fevereiro de 2016
Operador LIKE no VBA
Interessante como alguns recursos do VBA quase não são utilizados, porém são extremamente úteis.
É o caso do LIKE que costumeiramente é utilizado em instruções SQL.
Eu não sabia que existia no VBA e descobri por acaso olhando o help.
Confesso que já criei diversas funções para contornar o uso do LIKE e teria economizado tempo se soubesse que a instrução existia.
Abaixo os exemplos do próprio help do VBA.
;-)
É o caso do LIKE que costumeiramente é utilizado em instruções SQL.
Eu não sabia que existia no VBA e descobri por acaso olhando o help.
Confesso que já criei diversas funções para contornar o uso do LIKE e teria economizado tempo se soubesse que a instrução existia.
Abaixo os exemplos do próprio help do VBA.
;-)
Exemplo do operador Like
Este exemplo usa o operador Like para comparar uma seqüência
de caracteres com um padrão.
Dim MyCheck
MyCheck = "aBBBa" Like "a*a" ' Retorna True.
MyCheck = "F" Like "[A-Z]" ' Retorna True.
MyCheck = "F" Like "[!A-Z]" ' Retorna False.
MyCheck = "a2a" Like "a#a" ' Retorna True.
MyCheck = "aM5b" Like "a[L-P]#[!c-e]" ' Retorna True.
MyCheck = "BAT123khg" Like "B?T*" ' Retorna True.
MyCheck = "CAT123khg" Like "B?T*" ' Retorna False.
sábado, 26 de setembro de 2015
sábado, 19 de setembro de 2015
Atualização da planilha ao usar funções personalizadas
Sempre achei que funções personalizadas (aquelas que a gente escreve no VBA) necessitavam de comandos para atualizar os valores, normalmente F2 para editar e para o recálculo.
Para contornar essa característica, basta acrescentar no início o comando:
Application.Volatile
Assim, em qualquer alteração nos valores envolvidos na função personalizada, a atualização será automática, da mesma forma como funcionam as funções do Excel.
;-)
Para contornar essa característica, basta acrescentar no início o comando:
Application.Volatile
Assim, em qualquer alteração nos valores envolvidos na função personalizada, a atualização será automática, da mesma forma como funcionam as funções do Excel.
;-)
domingo, 13 de setembro de 2015
Caixa de diálogo "Selecionar Arquivo"
Código completo.
Tempos atrás eu tinha postado um código mais enxuto que usava no Word, este está completo com todas as opções.
Original em: https://msdn.microsoft.com/pt-br/library/office/ff196794.aspx
;-)
Tempos atrás eu tinha postado um código mais enxuto que usava no Word, este está completo com todas as opções.
Original em: https://msdn.microsoft.com/pt-br/library/office/ff196794.aspx
;-)
Private Sub cmdFileDialog_Click() ' Requires reference to Microsoft Office 11.0 Object Library. Dim fDialog As Office.FileDialog Dim varFile As Variant ' Clear listbox contents. Me.FileList.RowSource = "" ' Set up the File Dialog. Set fDialog = Application.FileDialog(msoFileDialogFilePicker) With fDialog ' Allow user to make multiple selections in dialog box .AllowMultiSelect = True ' Set the title of the dialog box. .Title = "Please select one or more files" ' Clear out the current filters, and add our own. .Filters.Clear .Filters.Add "Access Databases", "*.MDB" .Filters.Add "Access Projects", "*.ADP" .Filters.Add "All Files", "*.*" ' Show the dialog box. If the .Show method returns True, the ' user picked at least one file. If the .Show method returns ' False, the user clicked Cancel. If .Show = True Then 'Loop through each file selected and add it to our list box. For Each varFile In .SelectedItems Me.FileList.AddItem varFile Next Else MsgBox "You clicked Cancel in the file dialog box." End If End With End Sub
sábado, 18 de julho de 2015
Anexando arquivos em campos de tabelas no Access
Um recurso muito interessante do Access é a possibilidade de gravar arquivos em campos.
Alguém já deve estar se perguntando qual a utilidade disto, mas imagine por exemplo, poder catalogar e guardar fotos ou imagens.
Obviamente o recurso deve ser utilizado com moderação para não aumentar o tamanho do mdb.
Bem, como sempre, pensando em automação para tornar simples as tarefas rotineiras, segue abaixo um código VBA para executar a operação de anexar arquivos.
;-)
Alguém já deve estar se perguntando qual a utilidade disto, mas imagine por exemplo, poder catalogar e guardar fotos ou imagens.
Obviamente o recurso deve ser utilizado com moderação para não aumentar o tamanho do mdb.
Bem, como sempre, pensando em automação para tornar simples as tarefas rotineiras, segue abaixo um código VBA para executar a operação de anexar arquivos.
;-)
Option Compare Database Option Explicit Sub AnexaArquivo() Dim rs As DAO.Recordset Dim rsAnexo As DAO.Recordset Dim db As DAO.Database Set db = CurrentDb() db.Execute "DELETE FROM tabela1" Set rs = db.OpenRecordset("tabela1") rs.AddNew Set rsAnexo = rs.Fields("CampoAnexo").Value rsAnexo.AddNew rsAnexo.Fields("FileData").LoadFromFile "c:\teste.txt" rsAnexo.Update rs.Update rs.Close Set rs = Nothing Set db = NothingEnd Sub
terça-feira, 14 de julho de 2015
Código para apagar tabelas no Access
A fim de evitar mensagens de erro, é conveniente sempre verificar se a tabela existe antes de comandar um DROP.
Segue abaixo um exemplo.
Obs.: marcar a referência no VBA – ActiveX Data Objects
Sub ApagaTabela()
On Error GoTo Erro
Dim rst As New ADODB.Recordset
rst.Open "SELECT name FROM MSysObjects where type = 1 AND name = 'Tabela3'", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
'type 6 = tabela vinculada
If rst.RecordCount > 0 Then
CurrentProject.Connection.Execute "DROP TABLE Tabela3"
End If
Saida:
rst.Close
Set rst = Nothing
Exit Sub
Erro:
MsgBox Err.Description, vbOKOnly
Resume Saida
End Sub
quarta-feira, 13 de maio de 2015
Mais um código para encerrar processos no TaskManager
Public Function KillProcess(Processo As String)
'O nome do processo é case sensitive
'Exemplo: WINWORD.EXE / EXCEL.EXE / wordpad.exe / etc
Dim oServ As Object
Dim cProc As Variant
Dim oProc As Object
Set oServ = GetObject("winmgmts:")
Set cProc = oServ.ExecQuery("Select * from Win32_Process")
For Each oProc In cProc
If oProc.Name = Processo Then errReturnCode = oProc.Terminate()
Next
End Function
domingo, 26 de abril de 2015
Dica para melhorar seus textos
Uma das dicas para escrever bem é não repetir palavras dentro da mesma frase.
Vale até utilizar sinônimos, mas sempre evite a repetição.
Para isso, o Microsoft Word é um grande aliado: ALT + click do mouse em cima da palavra e os dicionários se abrem, dentre eles o de sinônimos.
Maravilha!
A dica serve também para o Outlook, desde que o Word tenha sido definido como editor padrão.
Outra dica: não acredite piamente no corretor ortográfico. Se é um texto importante, leia, releia, peça para alguém revisar, enfim, corretor não acerta em 100% das revisões.
;-)
Vale até utilizar sinônimos, mas sempre evite a repetição.
Para isso, o Microsoft Word é um grande aliado: ALT + click do mouse em cima da palavra e os dicionários se abrem, dentre eles o de sinônimos.
Maravilha!
A dica serve também para o Outlook, desde que o Word tenha sido definido como editor padrão.
Outra dica: não acredite piamente no corretor ortográfico. Se é um texto importante, leia, releia, peça para alguém revisar, enfim, corretor não acerta em 100% das revisões.
;-)
domingo, 12 de abril de 2015
O Access é bom para desenvolvimento?
Esta é uma questão que normalmente gera bastante discussão, principalmente entre desenvolvedores, DBA's (Data Base Administrator) e usuários.
Vou deixar aqui meu comentário:
Access é uma ferramenta completa, talvez a melhor da Microsoft para desenvolvimento de aplicações desktop.Possui gerador de relatórios e telas, módulos de programação em VBA, conectividade com praticamente todos os banco de dados e a maioria dos aplicativos da Microsoft.
Não vou entrar no mérito quanto ao Access ser considerado ou não um "banco de dados", isso já foi exaustivamente discutido em vários fóruns e a última que presenciei foi na pós-graduação que fiz onde o professor afirmou que o Access não é um banco de dados. Não entrei na briga por assim dizer, porque tenho meu conceito e o que importa para mim, é o que eu penso e não o que os outros acham.
Num antigo grupo de discussão que eu participava, tem um tópico muito interessante chamado "Até onde podemos ir com o Access?" e lá está as mais variadas opiniões, vale a pena ler:
http://comunidade.itlab.com.br/eve/forums/a/tpc/f/273606921/m/614608921
Até que me provem o contrário, o que faz a diferença é o programador e não a ferramenta que utiliza.
Exemplificando, um banco de dados mal estruturado, é mal estruturado seja em Access ou SQL Server (este sim, um grande banco de dados com estrutura cliente-servidor), o problema está em que o fez. O mesmo conceito se aplica quando tratamos de Front End.
A ideia vale para qualquer outra ferramenta de desenvolvimento.
Se só o fato do "novo ser melhor", não existiram aplicações por aí rodando até hoje em Clipper, Cobol, Delphi, etc.
;-)
Vou deixar aqui meu comentário:
Access é uma ferramenta completa, talvez a melhor da Microsoft para desenvolvimento de aplicações desktop.Possui gerador de relatórios e telas, módulos de programação em VBA, conectividade com praticamente todos os banco de dados e a maioria dos aplicativos da Microsoft.
Não vou entrar no mérito quanto ao Access ser considerado ou não um "banco de dados", isso já foi exaustivamente discutido em vários fóruns e a última que presenciei foi na pós-graduação que fiz onde o professor afirmou que o Access não é um banco de dados. Não entrei na briga por assim dizer, porque tenho meu conceito e o que importa para mim, é o que eu penso e não o que os outros acham.
Num antigo grupo de discussão que eu participava, tem um tópico muito interessante chamado "Até onde podemos ir com o Access?" e lá está as mais variadas opiniões, vale a pena ler:
http://comunidade.itlab.com.br/eve/forums/a/tpc/f/273606921/m/614608921
Até que me provem o contrário, o que faz a diferença é o programador e não a ferramenta que utiliza.
Exemplificando, um banco de dados mal estruturado, é mal estruturado seja em Access ou SQL Server (este sim, um grande banco de dados com estrutura cliente-servidor), o problema está em que o fez. O mesmo conceito se aplica quando tratamos de Front End.
A ideia vale para qualquer outra ferramenta de desenvolvimento.
Se só o fato do "novo ser melhor", não existiram aplicações por aí rodando até hoje em Clipper, Cobol, Delphi, etc.
;-)
domingo, 5 de abril de 2015
Bel Pesce
Embora este tópico não tenha a ver com escopo geral do blog, trata-se de uma super dica para quem quer aprender muito sobre empreendedorismo com a Bel Pesce.
São links onde vocês poderão encontrar farto material sobre o empreendedorismo e dicas de diversos assuntos para o dia a dia.
A Bel Pesce é uma profissional fantástica que foge ao padrão dos "super profissionais" na minha opinião, seus ensinamentos vão muito além do âmbito profissional e são uma verdadeira lição de vida.
O material em vídeo é muito abundante, dá para passar horas e horas assistindo, se divertindo, refletindo e principalmente aprendendo sem se cansar (pesquisem no YouTube).
Destaque para o e-book gratuito "A Garota do Vale", disponível para download no site da Bel.
Aproveitem!
;-)
http://cbn.globoradio.globo.com/comentaristas/bel-pesce/BEL-PESCE.htm
http://www.fazinova.com.br/
http://belpesce.com.br/
São links onde vocês poderão encontrar farto material sobre o empreendedorismo e dicas de diversos assuntos para o dia a dia.
A Bel Pesce é uma profissional fantástica que foge ao padrão dos "super profissionais" na minha opinião, seus ensinamentos vão muito além do âmbito profissional e são uma verdadeira lição de vida.
O material em vídeo é muito abundante, dá para passar horas e horas assistindo, se divertindo, refletindo e principalmente aprendendo sem se cansar (pesquisem no YouTube).
Destaque para o e-book gratuito "A Garota do Vale", disponível para download no site da Bel.
Aproveitem!
;-)
http://cbn.globoradio.globo.com/comentaristas/bel-pesce/BEL-PESCE.htm
http://www.fazinova.com.br/
http://belpesce.com.br/
sexta-feira, 6 de fevereiro de 2015
Macro de dados - Access 2010
Um recurso interessante que foi introduzido no Access 2010 são as macros de dados que executam comandos em determinados eventos como inserção, alteração ou exclusão de dados.
Obviamente com programação conseguem-se as mesmas ações, talvez até com mais flexibilidade, mas não deixa de ser um recurso bem interessante.
Usuários do SQL Server lembraram de trigger???
;-)
Obviamente com programação conseguem-se as mesmas ações, talvez até com mais flexibilidade, mas não deixa de ser um recurso bem interessante.
Usuários do SQL Server lembraram de trigger???
;-)
sábado, 3 de janeiro de 2015
Programas antigos
Às vezes a gente precisa de versões antigas de programas, seja lá qual for o motivo...
Segue um site com muito material para download:
http://www.oldversion.com/
;-)
Segue um site com muito material para download:
http://www.oldversion.com/
;-)
sexta-feira, 19 de dezembro de 2014
Bug do Access VBA 2013
Num dia desta semana, nos deparamos com um problema já visto antes mas sem uma explicação exata...
Quando programava no Office 2003, em determinados computadores meus códigos simplesmente paravam como se tivesse um ponto de interrupção - breakpoint, mas não havia. Estranhamente a execução parava ali e ao teclar F5 o programa terminava a execução normalmente.
Naquela época, descobrimos por tentativa e erro que o Service Pack 3 do Office 2003 resolvia o problema. Até hoje não sabemos exatamente o que ocasionava tal comportamento.
Muitos anos depois, o mesmo problema volta a acontecer, só que agora no Access 2013 num ponto do programa onde o código é muito simples: uma abertura de um recordset para contagem de registros apenas. O programa simplesmente para na linha do Recordset.Recordcount e em seguida trava o Access.
O acesso utilizado era o ADO.
Num verdadeiro "chute", mudamos a programação para DAO e funcionou sem travar.
Continuaremos sem saber a causa exata do problema, mas fica a dica: tentar acessar as bases com ADO ou DAO alternando quando houver uma ocorrência estranha como essa.
O texto não é conclusivo, mas escrevo-lhes para compartilhar a experiência e um palpite feliz (a troca para o DAO).
;-)
Naquela época, descobrimos por tentativa e erro que o Service Pack 3 do Office 2003 resolvia o problema. Até hoje não sabemos exatamente o que ocasionava tal comportamento.
Muitos anos depois, o mesmo problema volta a acontecer, só que agora no Access 2013 num ponto do programa onde o código é muito simples: uma abertura de um recordset para contagem de registros apenas. O programa simplesmente para na linha do Recordset.Recordcount e em seguida trava o Access.
O acesso utilizado era o ADO.
Num verdadeiro "chute", mudamos a programação para DAO e funcionou sem travar.
Continuaremos sem saber a causa exata do problema, mas fica a dica: tentar acessar as bases com ADO ou DAO alternando quando houver uma ocorrência estranha como essa.
O texto não é conclusivo, mas escrevo-lhes para compartilhar a experiência e um palpite feliz (a troca para o DAO).
;-)
quarta-feira, 19 de novembro de 2014
Site muito bom sobre banco de dados - modelagem
Dica do amigo André R. Fernandes.
Vejam a página "Models", tem muito material praticamente pronto para uso!
http://www.databaseanswers.org/index.htm
;-)
Vejam a página "Models", tem muito material praticamente pronto para uso!
http://www.databaseanswers.org/index.htm
;-)
terça-feira, 18 de novembro de 2014
Como obter o último dia do mês
Dando continuidade na dica anterior... esta é velha, mas vou deixar registrado aqui, caso algum visitante esteja procurando.
Para obter o ultimo dia do mês por programação:
- Basta pegar o primeiro dia do mês seguinte menos um dia!
- Como definir se um ano é bissexto ou não?
Basta dividir o ano por 4 e verificar se o resto da divisão é zero ou não.
Se for zero, o ano é bissexto!
No exemplo do Excel abaixo, 2016 será um ano bissexto.
;-)
Atualização de valores - exemplo com IGP-M no VBA do Access
Olá!
Há tempos não publico uma nova dica... então dando continuidade, vai um código para atualizar valores pelo IGP-M (índice geral de preços - mercado).
Antes de mais nada, vale levar em consideração alguns aspectos importantes desta atualização (o cálculo em si é simples):
- Embora o IGP-M seja publicado sempre no final do mês, eu coloquei na minha tabela o primeiro dia apenas para facilitar o SELECT. Poderia criar uma função para entrar sempre com o último dia do mês que é o mais usual nestes casos, foi só uma opção mesmo;
- No site da FVG - http://fgv.br é difícil encontrar as tabelas de índices, geralmente estão em arquivos PDF. No site do Debit é mais fácil e tem uma URL fixa: https://www.debit.com.br/consulta30.php?&indice=igpm;
- Cuidado com as variações negativas: contratos de aluguel por exemplo, costumam ter cláusulas do tipo "correção pela variação positiva do IGP-M" o que equivale a dizer que, caso o índice seja negativo, não haverá redução do valor atualizado, o que pelo cálculo ocorre. Nos meses onde a variação é negativa, o valor "atualizado" é simplesmente mantido. Muito cuidado nesta questão;
- Para conferir os cálculos utilize a calculadora do cidadão no site do Banco Central: https://www3.bcb.gov.br/CALCIDADAO/publico/exibirFormCorrecaoValores.do?method=exibirFormCorrecaoValores
- Como sempre, não esqueçam de marcar a referência Microsoft Activex Data Objects (a versão mais recente que tiver, eu utilizo a 2.8)
Bem, abaixo segue o código e uma imagem da minha tabela para melhor entendimento.
;-)
Há tempos não publico uma nova dica... então dando continuidade, vai um código para atualizar valores pelo IGP-M (índice geral de preços - mercado).
Antes de mais nada, vale levar em consideração alguns aspectos importantes desta atualização (o cálculo em si é simples):
- Embora o IGP-M seja publicado sempre no final do mês, eu coloquei na minha tabela o primeiro dia apenas para facilitar o SELECT. Poderia criar uma função para entrar sempre com o último dia do mês que é o mais usual nestes casos, foi só uma opção mesmo;
- No site da FVG - http://fgv.br é difícil encontrar as tabelas de índices, geralmente estão em arquivos PDF. No site do Debit é mais fácil e tem uma URL fixa: https://www.debit.com.br/consulta30.php?&indice=igpm;
- Cuidado com as variações negativas: contratos de aluguel por exemplo, costumam ter cláusulas do tipo "correção pela variação positiva do IGP-M" o que equivale a dizer que, caso o índice seja negativo, não haverá redução do valor atualizado, o que pelo cálculo ocorre. Nos meses onde a variação é negativa, o valor "atualizado" é simplesmente mantido. Muito cuidado nesta questão;
- Para conferir os cálculos utilize a calculadora do cidadão no site do Banco Central: https://www3.bcb.gov.br/CALCIDADAO/publico/exibirFormCorrecaoValores.do?method=exibirFormCorrecaoValores
- Como sempre, não esqueçam de marcar a referência Microsoft Activex Data Objects (a versão mais recente que tiver, eu utilizo a 2.8)
Bem, abaixo segue o código e uma imagem da minha tabela para melhor entendimento.
;-)
Option Compare Database Option Explicit Dim rst As ADODB.Recordset Dim ssql As String Dim acumulador As Double Dim i As Integer Public Function Atualiza_IGPM(MesInicio As Integer, _ AnoInicio As Integer, _ MesFim As Integer, _ AnoFim As Integer, _ valor As Double) As Double ssql = "SELECT * FROM tabela1 WHERE " ssql = ssql & "DataIndice >= #" & MesInicio & "/1/" & AnoInicio & "#" ssql = ssql & "ORDER BY DataIndice" Set rst = New ADODB.Recordset rst.Open ssql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic rst.MoveFirst 'Primeiro índice acumulador = 0 acumulador = (rst!indice / 100) + 1 rst.MoveNext Do While Not rst.EOF 'Acumular taxas acumulador = acumulador * ((rst!indice / 100) + 1) If rst!mes = MesFim And rst!ano = AnoFim Then Exit Do Else rst.MoveNext End If Loop Atualiza_IGPM = Round(valor * ((acumulador - 1) * 100), 5) rst.Close Set rst = Nothing End Function
sábado, 18 de outubro de 2014
Excluindo partes do nome de um arquivo
Quem me conhece, sabe que sou fã do mp3 e gosto de ter meus arquivos organizados.
Às vezes ao baixar algum arquivo, me deparo com nomes dos arquivos acrescidos do nome do site de onde estou baixando ou mesmo o nome de quem "ripou" o CD.
Por exemplo:
ABBA - When I Kissed The Teacher [NomeDeQuemRipou].mp3
Para excluir esse "[NomeDeQuemRipou]" resolvi criar um código muito simples, mas que ajuda bastante.
Cansei de fazer um por um ... :-)
Segue o código:
Option Compare Database
Option Explicit
Public Sub RenomeiaArquivos()
Dim caminho As String
Dim origem As String
Dim destino As String
Dim eliminar As String
Dim arquivo As String
caminho = "C:\Documents and Settings\Kazu\Meus documentos\Downloads\Bee Gees\"
eliminar = "[NomeDeQuemRipou]"
arquivo = Dir(caminho & "*.mp3")
Do Until arquivo = ""
DoEvents
origem = arquivo
arquivo = Replace(arquivo, eliminar, "")
FileCopy caminho & origem, caminho & arquivo
Kill caminho & origem
arquivo = Dir
Loop
MsgBox "OK", vbOKOnly
Exit Sub
End Sub
Provider no VBA do Access
Na empresa onde trabalho, temos diversas versões do Access em uso e além disso, vários bancos de dados que ainda estão no formato .mdb.
Ao alterar um código onde estava acessando um mdb, precisei ajustar o provider para JET.OLEDB.4.0 e resolvi tentar o seguinte: por que não colocar o provider do Access 2010 em todos?
Ficou assim:
Provider=Microsoft.ACE.OLEDB.12.0
Ficou mais fácil, aí não precisamos se o acesso vai ser num arquivo accdb ou mdb.
;-)
Ao alterar um código onde estava acessando um mdb, precisei ajustar o provider para JET.OLEDB.4.0 e resolvi tentar o seguinte: por que não colocar o provider do Access 2010 em todos?
Ficou assim:
Provider=Microsoft.ACE.OLEDB.12.0
Ficou mais fácil, aí não precisamos se o acesso vai ser num arquivo accdb ou mdb.
;-)
quarta-feira, 1 de outubro de 2014
Colocar senha em arquivo ZIP no Windows 7
Uma das (boas) funcionalidades do Windows XP que era a possibilidade de colocar senha em arquivos compactados pelo próprio sistema operacional (através do comando Enviar Para > Pasta Compactada) simplesmente sumiu no Windows 7.
Numa breve pesquisa no site da Microsoft, é recomendado utilizar um compactador de terceiros que, segundo o site custa a partir de U$ 30.
Sabemos que existem vários compactadores “free” como o 7Zip, mas era interessante ter no próprio Windows, pois nem todas as empresas que utilizam softwares licenciados costumam instalar programas gratuitos por motivos diversos.
Uma pena...
L
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.