<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Office System : Office Development</title><link>http://msmvps.com/blogs/officedev/archive/tags/Office+Development/default.aspx</link><description>Tags: Office Development</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Treeview no Access</title><link>http://msmvps.com/blogs/officedev/archive/2008/07/14/treeview-no-access.aspx</link><pubDate>Tue, 15 Jul 2008 00:22:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1640815</guid><dc:creator>Luiz</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/officedev/rsscomments.aspx?PostID=1640815</wfw:commentRss><comments>http://msmvps.com/blogs/officedev/archive/2008/07/14/treeview-no-access.aspx#comments</comments><description>Anos atr&amp;aacute;s escrevi um exemplo de Treeview no Microsoft Access para listar os diferentes tipos de objeto e abri-los com um duplo-click. Este exemplo foi bastante distribu&amp;iacute;do (ficava no antigo Sharepedia do MSDN), depois ficou sumido por n&amp;atilde;o...(&lt;a href="http://msmvps.com/blogs/officedev/archive/2008/07/14/treeview-no-access.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1640815" width="1" height="1"&gt;</description><enclosure url="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.64.08.15/bdTreeview_5F00_LC.zip" length="121780" type="application/x-zip-compressed" /><category domain="http://msmvps.com/blogs/officedev/archive/tags/Office+Development/default.aspx">Office Development</category><category domain="http://msmvps.com/blogs/officedev/archive/tags/treeview/default.aspx">treeview</category><category domain="http://msmvps.com/blogs/officedev/archive/tags/VBA/default.aspx">VBA</category><category domain="http://msmvps.com/blogs/officedev/archive/tags/Access/default.aspx">Access</category></item><item><title>Access - erro "A conexão de rede pode ter sido perdida"</title><link>http://msmvps.com/blogs/officedev/archive/2006/07/09/104280.aspx</link><pubDate>Sun, 09 Jul 2006 18:57:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:104280</guid><dc:creator>Luiz</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/officedev/rsscomments.aspx?PostID=104280</wfw:commentRss><comments>http://msmvps.com/blogs/officedev/archive/2006/07/09/104280.aspx#comments</comments><description>&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;EM&gt;&lt;FONT color=#000000&gt;&lt;FONT&gt;"Estou com um problema no Access 2000. Vez ou outra a seguinte mensagem é ativada:&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;DIV&gt;
&lt;P class=MsoNormal&gt;&lt;EM&gt;&lt;FONT face=Arial color=#000000 size=2&gt;&lt;SPAN&gt;"Erro ao acessar arquivo. A conexão de rede pode ter sido perdida."&lt;/SPAN&gt;&lt;/FONT&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/EM&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;DIV&gt;
&lt;P class=MsoNormal&gt;&lt;EM&gt;&lt;FONT face=Arial color=#000000 size=2&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Recordo de haver lido alguma coisa sobre o assunto aqui mesmo no AtivoAccess mas, agora&lt;/SPAN&gt;&lt;/FONT&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/EM&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;DIV&gt;
&lt;P class=MsoNormal&gt;&lt;EM&gt;&lt;FONT face=Arial color=#000000 size=2&gt;&lt;SPAN&gt;não consigo mais localizar.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/EM&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;DIV&gt;
&lt;P class=MsoNormal&gt;&lt;EM&gt;&lt;FONT face=Arial color=#000000 size=2&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Poderiam oferecer-me alguma indicação de como resolver esta situação?&lt;/SPAN&gt;&lt;/FONT&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/EM&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;DIV&gt;
&lt;P class=MsoNormal&gt;&lt;EM&gt;&lt;FONT face=Arial color=#000000 size=2&gt;&lt;SPAN&gt;Gratos&lt;/SPAN&gt;&lt;/FONT&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/EM&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;DIV&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=#000000 size=2&gt;&lt;SPAN&gt;&lt;EM&gt;Gerson Weiss"&lt;/EM&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/DIV&gt;&lt;/o:p&gt;&lt;/SPAN&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;Trata-se aqui do pior bug do Access 2000. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;Quando ocorre? Ocorre quando há duas versões incompatíveis do componente VBE.DLL na máquina de desenvolvimento (VB6 + Access 2000, por exemplo), e o desenvolvedor importa algum objeto com código (um formulário, relatório, módulo, ou mesmo um TXT com código) e fecha o MDB sem fazer a compilação do código.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;Apesar da mensagem falar em conexão de rede, o bug não tem nada a ver com isto. O que ocorre é a quebra do próprio código mesmo.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;O desenvolvedor precisa fazer duas coisas:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;a) Atualizar os Service Packs do Office 2000.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;b) Ter o hábito de compilar o código sempre que algum objeto for importado.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;Ambas são boas práticas, independente de haver bug do Access ou não.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;Estas medidas evitarão que o banco de dados volte a se corromper pelo mesmo motivo, mas o MDB corrompido não será recuperado. Aliás, a recuperação do MDB com o problema “conexão de rede perdida” costuma ser difícil (às vezes impossível). Eu já consegui reparar de duas formas:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;a)&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;Abrir o MDB usando uma versão mais recente do Access, ativar a janela do VBA e nela excluir o módulo do objeto corrompido (ou seja, aquele que você importou de uma fonte externa). Depois, vá à janela de banco de dados e exclua o próprio objeto. Compile, e se estiver OK, faça novamente a importação. Compile novamente antes de fechar o MDB.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;b)&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN&gt;Abra a janela do VBA e salve cada módulo do projeto em um arquivo texto. Entre na estrutura de cada formulário e relatório do banco de dados e ajuste a propriedade “Has module” (Tem módulo) para Não, a fim de quebrar todas as ligações com o VBA. Crie um novo MDB e importe todos os objetos (exceto os módulos). Vá em cada objeto, abra o módulo e cole os procedimentos salvos no TXT. É um trabalho e tanto, mas funciona.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=104280" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/officedev/archive/tags/Office+Development/default.aspx">Office Development</category></item><item><title>Licença para distribuição do Jet sem o MS-Access</title><link>http://msmvps.com/blogs/officedev/archive/2006/07/05/103870.aspx</link><pubDate>Wed, 05 Jul 2006 03:20:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:103870</guid><dc:creator>Luiz</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/officedev/rsscomments.aspx?PostID=103870</wfw:commentRss><comments>http://msmvps.com/blogs/officedev/archive/2006/07/05/103870.aspx#comments</comments><description>&lt;P&gt;Este é um assunto que não costuma gerar dúvidas. Se alguém desenvolve uma aplicação Visual Basic acessando uma base de dados Access (ou seja, o Jet), pode distribuir&amp;nbsp;o aplicativo&amp;nbsp;para máquinas que não tenham o MS-Access ou o MS-Office instalados.&lt;/P&gt;
&lt;P&gt;É óbvio, certo? Mas onde está escrito? Isto é difícil de se achar...&lt;/P&gt;
&lt;P&gt;Na Microsoft, após vasculhar bastante, encontrei este documento que afirma ser legal a distribuição do componente Jet a partir de aplicações Visual Basic e Visual C++: &lt;A href="http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/dnaraccessdev/html/ODC_JetDatabaseEngineLicensingandSolutionDistribution.asp"&gt;http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/dnaraccessdev/html/ODC_JetDatabaseEngineLicensingandSolutionDistribution.asp&lt;/A&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=103870" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/officedev/archive/tags/Office+Development/default.aspx">Office Development</category><category domain="http://msmvps.com/blogs/officedev/archive/tags/Other+development+technologies/default.aspx">Other development technologies</category></item><item><title>Transações em subform folha de dados no Access</title><link>http://msmvps.com/blogs/officedev/archive/2006/06/21/102458.aspx</link><pubDate>Wed, 21 Jun 2006 03:27:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:102458</guid><dc:creator>Luiz</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/officedev/rsscomments.aspx?PostID=102458</wfw:commentRss><comments>http://msmvps.com/blogs/officedev/archive/2006/06/21/102458.aspx#comments</comments><description>&lt;P&gt;&lt;FONT face=Arial&gt;Esta boa pergunta foi postada pelo Ira_boy no Fórum Access (&lt;A href="http://forumaccess.com/eve/forums?a=tpc&amp;amp;s=92260328&amp;amp;f=273606921&amp;amp;m=4321067051&amp;amp;r=6791048051#6791048051"&gt;http://forumaccess.com/eve/forums?a=tpc&amp;amp;s=92260328&amp;amp;f=273606921&amp;amp;m=4321067051&amp;amp;r=6791048051#6791048051&lt;/A&gt;):&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;"Estou com um dilema...&lt;BR&gt;Existe a possibilidade de criar formulario continuo sem uma tabela ou consulta de origem ?&lt;BR&gt;Explico.&lt;BR&gt;Tenho o frm_principal e dentro dele dois subformularios um não acoplado e outro com origem de dados a uma consulta. &lt;BR&gt;No primeiro sub eu atualizo os dados na tabela somente no final de todo o tramite, porém no sub2 eu não consigo fazer isso pq eu baseio o sub formulario em uma consulta e qdo eu digito ao passar para o campo de baixo automaticamente é salvo o registro...&lt;BR&gt;Qual é a melhor forma de implantar uma transação tendo em vista essa situação.&lt;BR&gt;Pois qdo alguém finalizar antes de efetivar algum procedimento fico com dados inconsistentes na tabela.&lt;BR&gt;Já pensei em usar consulta exclusão porém gostaria de aprender a utilizar metodos de transação. "&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;&lt;FONT face=Arial size=3&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;&lt;FONT face=Arial size=3&gt;Uma vez que os formulários do Access (a partir da versão 2000) têm a propriedade &lt;STRONG&gt;Recordset&lt;/STRONG&gt;, é possível sim&amp;nbsp;abrir uma transação, editar registros do subform (folha de dados, por exemplo), e ter um botão para salvar (Commit) e outro para desfazer as alterações (Rollback), mesmo que o usuário tenha mexido em vários registros diferentes.&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;&lt;FONT face=Arial size=3&gt;Neste código de exemplo, há um formulário principal (TeuForm),&amp;nbsp;um subform folha de dados (TeuSubform), e três botões no form principal: cmdEditar, cmdSalvar e cmdDesfazer.&lt;BR&gt;&lt;BR&gt;Posso editar vários registros do subform e só salvar quando clicar no "Salvar", ou desfazer todas as alterações. Há um exemplo anexo (link no final do artigo).&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000000 size=1&gt;Option Compare Database&lt;BR&gt;Option Explicit&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000000 size=1&gt;Private Wks As DAO.Workspace&lt;BR&gt;Private blnIsTrans As Boolean&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000000 size=1&gt;Private Sub Form_Open(Cancel As Integer)&lt;BR&gt;Dim rst As DAO.Recordset&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000000 size=1&gt;Set Wks = DBEngine.Workspaces(0)&lt;BR&gt;Set rst = Wks.Databases(0).OpenRecordset("SELECT * FROM Table1")&lt;BR&gt;Set Me.TeuSubform.Form.Recordset = rst&lt;BR&gt;Wks.BeginTrans&lt;BR&gt;blnIsTrans = True&lt;BR&gt;Call BloqueiaDesbloqueiaSubform&lt;BR&gt;End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000000 size=1&gt;Private Sub cmdEditar_Click()&lt;BR&gt;If blnIsTrans = False Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Wks.BeginTrans&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; blnIsTrans = True&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Call BloqueiaDesbloqueiaSubform&lt;BR&gt;End If&lt;BR&gt;End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000000 size=1&gt;Private Sub cmdSalvar_Click()&lt;BR&gt;If blnIsTrans = True Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Wks.CommitTrans&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; blnIsTrans = False&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Call BloqueiaDesbloqueiaSubform&lt;BR&gt;End If&lt;BR&gt;End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000000 size=1&gt;Private Sub cmdDesfazer_Click()&lt;BR&gt;If blnIsTrans = True Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Wks.Rollback&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; blnIsTrans = False&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Call BloqueiaDesbloqueiaSubform&lt;BR&gt;End If&lt;BR&gt;End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000000 size=1&gt;Private Sub Form_Close()&lt;BR&gt;If blnIsTrans = True Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If MsgBox("Deseja salvar as alterações?", vbYesNo) = vbYes Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Wks.CommitTrans&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Wks.Rollback&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;End If&lt;BR&gt;blnIsTrans = False&lt;BR&gt;Set Wks = Nothing&lt;BR&gt;End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;&lt;FONT face="Courier New" size=1&gt;Sub BloqueiaDesbloqueiaSubform()&lt;BR&gt;'Bloqueia ou desbloqueia os registros do subform&lt;BR&gt;Me.TeuSubform.Form.AllowAdditions = blnIsTrans&lt;BR&gt;Me.TeuSubform.Form.AllowEdits = blnIsTrans&lt;BR&gt;Me.TeuSubform.Form.AllowDeletions = blnIsTrans&lt;BR&gt;End Sub&lt;/FONT&gt;&lt;BR&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=102458" width="1" height="1"&gt;</description><enclosure url="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.10.24.58/Subform_5F00_com_5F00_Transacao.zip" length="17085" type="application/x-zip-compressed" /><category domain="http://msmvps.com/blogs/officedev/archive/tags/Office+Development/default.aspx">Office Development</category></item><item><title>Inputbox com máscara de senha no Office</title><link>http://msmvps.com/blogs/officedev/archive/2006/06/20/102089.aspx</link><pubDate>Tue, 20 Jun 2006 01:46:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:102089</guid><dc:creator>Luiz</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/officedev/rsscomments.aspx?PostID=102089</wfw:commentRss><comments>http://msmvps.com/blogs/officedev/archive/2006/06/20/102089.aspx#comments</comments><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;A Inputbox é a função mais prática para se capturar uma entrada do usuário durante a execução do aplicativo. Seu visual pode não ser lá essas coisas, mas em termos de praticidade é imbatível: com uma ou duas linhas de código, sem necessidade de um formulário, a janela com um textbox e dois botões (OK e Cancel) é exibida ao usuário.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;No excelente site &lt;A href="http://www.xcelfiles.com/"&gt;http://www.xcelfiles.com&lt;/A&gt;&amp;nbsp;há uma função personalizada no VBA, com chamada a APIs, que mostra uma Inputbox com máscara de senha (&lt;A href="http://www.xcelfiles.com/API_09.html"&gt;http://www.xcelfiles.com/API_09.html&lt;/A&gt;). &lt;/FONT&gt;&lt;FONT face=Arial size=2&gt;A autoria é do MVP inglês Daniel Klann. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Para usar, basta colar este código em um módulo padrão e chamar a função &lt;STRONG&gt;InputboxDK&lt;/STRONG&gt;:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;'////////////////////////////////////////////////////////////////////&lt;BR&gt;'Password masked inputbox&lt;BR&gt;'Allows you to hide characters entered in a VBA Inputbox.&lt;BR&gt;'&lt;BR&gt;'Code written by Daniel Klann&lt;BR&gt;'http://www.danielklann.com/&lt;BR&gt;'March 2003&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;'// Kindly permitted to be amended&lt;BR&gt;'// Amended by Ivan F Moala&lt;BR&gt;'// &lt;/FONT&gt;&lt;A href="http://www.xcelfiles.com/"&gt;&lt;FONT face="Courier New" size=1&gt;http://www.xcelfiles.com&lt;/FONT&gt;&lt;/A&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=1&gt;'// April 2003&lt;BR&gt;'// Works for Xl2000+ due the AddressOf Operator&lt;BR&gt;'////////////////////////////////////////////////////////////////////&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;'API functions to be used&lt;BR&gt;Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _&lt;BR&gt;ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" ( _&lt;BR&gt;ByVal lpModuleName As String) As Long&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" ( _&lt;BR&gt;ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) _&lt;BR&gt;As Long&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;Private Declare Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" ( _&lt;BR&gt;ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, ByVal wParam As Long, _&lt;BR&gt;ByVal lParam As Long) As Long&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, _&lt;BR&gt;ByVal lpClassName As String, ByVal nMaxCount As Long) As Long&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;'Constants to be used in our API functions&lt;BR&gt;Private Const EM_SETPASSWORDCHAR = &amp;amp;HCC&lt;BR&gt;Private Const WH_CBT = 5&lt;BR&gt;Private Const HCBT_ACTIVATE = 5&lt;BR&gt;Private Const HC_ACTION = 0&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;Private hHook As Long&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;Public Function NewProc(ByVal lngCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;Dim RetVal&lt;BR&gt;Dim strClassName As String, lngBuffer As Long&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;If lngCode &amp;lt; HC_ACTION Then&lt;BR&gt;NewProc = CallNextHookEx(hHook, lngCode, wParam, lParam)&lt;BR&gt;Exit Function&lt;BR&gt;End If&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;strClassName = String$(256, " ")&lt;BR&gt;lngBuffer = 255&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;If lngCode = HCBT_ACTIVATE Then 'A window has been activated&lt;BR&gt;RetVal = GetClassName(wParam, strClassName, lngBuffer)&lt;BR&gt;If Left$(strClassName, RetVal) = "#32770" Then 'Class name of the Inputbox&lt;BR&gt;'This changes the edit control so that it display the password character *.&lt;BR&gt;'You can change the Asc("*") as you please.&lt;BR&gt;SendDlgItemMessage wParam, &amp;amp;H1324, EM_SETPASSWORDCHAR, Asc("*"), &amp;amp;H0&lt;BR&gt;End If&lt;BR&gt;End If&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;'This line will ensure that any other hooks that may be in place are&lt;BR&gt;'called correctly.&lt;BR&gt;CallNextHookEx hHook, lngCode, wParam, lParam&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;End Function&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;'// Make it public = avail to ALL Modules&lt;BR&gt;'// Lets simulate the VBA Input Function&lt;BR&gt;Public Function InputBoxDK(Prompt As String, Optional Title As String, Optional Default As String, _&lt;BR&gt;Optional Xpos As Long, Optional Ypos As Long, Optional Helpfile As String, _&lt;BR&gt;Optional Context As Long) As String&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;Dim lngModHwnd As Long, lngThreadID As Long&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;'// Lets handle any Errors JIC! due to HookProc&amp;gt; App hang!&lt;BR&gt;On Error GoTo ExitProperly&lt;BR&gt;lngThreadID = GetCurrentThreadId&lt;BR&gt;lngModHwnd = GetModuleHandle(vbNullString)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;hHook = SetWindowsHookEx(WH_CBT, AddressOf NewProc, lngModHwnd, lngThreadID)&lt;BR&gt;If Xpos Then&lt;BR&gt;InputBoxDK = InputBox(Prompt, Title, Default, Xpos, Ypos, Helpfile, Context)&lt;BR&gt;Else&lt;BR&gt;InputBoxDK = InputBox(Prompt, Title, Default, , , Helpfile, Context)&lt;BR&gt;End If&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;ExitProperly:&lt;BR&gt;UnhookWindowsHookEx hHook&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;End Function&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=102089" width="1" height="1"&gt;</description><enclosure url="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.10.20.89/Input-com-mascara.xls" length="41472" type="application/vnd.ms-excel" /><category domain="http://msmvps.com/blogs/officedev/archive/tags/Office+Development/default.aspx">Office Development</category></item></channel></rss>