Todo mundo deveria aprender a programar

Aprenda VBA. Aprenda a programar comigo com aulas presenciais ou a distância. Entre em contato.

Publicado em Desenvolvimento | Deixe o seu comentário

Sistema de Cotação de Mercadorias: diferença entre [Quantidade Demandada] e [Quantidade no Pedido] ?

O Programa de Cotação de Mercadorias permite que o comprador aceite comprar um mesmo produto de mais de um fornecedor (particionando a compra de um produto) desta forma, permitindo ajustes na cotação pelo motivo de, por exemplo, acordos comerciais, obediência a pedido mínimo e outras situações. Ao iniciar uma nova cotação define-se a quantidade dos produtos a serem comprados conforme demonstrado na tela abaixo:

Definindo as quantidades

Definindo as quantidades (Quantidade Demandada de um produto)

Quando o comprador conclui uma cotação ele poderá particionar a compra de um determinado produto em mais de um fornecedor conforme demonstrado abaixo. No exemplo, a quantidade demandada é de 30 unidades mas o comprador deseja comprar 20 unidades do primeiro fornecedor e 10 do segundo fornecedor:

Múltiplos aceites.

Múltiplos aceites.

Para múltiplos aceites, o comprador deverá selecionar todos os produtos que queira aceitar nas caixas de seleção destacadas a direita da tela.

Veja os detalhes sobre o Sistema de Cotação de Mercadorias clicando aqui

Publicado em Administração | Etiquetas , , | Deixe o seu comentário

Abrindo uma ADO.Recordset com dados de uma Planilha do MS Excel

Nesta postagem, venho demonstrar como é possível abrir uma ADO.Recordset com dados oriúndos de uma planilha do MS Excel.

Para esclarecer, ADO ou ActiveX Data Objects é uma biblioteca da Microsoft utilizada para acesso e atualização de dados, inclusive em bancos de dados corporativos tais como SQL Server, Oracle, Sybase, etc …  E também é possível manipular dados do MS Access. Nos dias atuais, com o surgimento da plataforma DOT.NET para programas desenvolvidos dentro desta tecnologia utiliza-se ADO.net. Já na linguagem Java, utiliza-se JDBC, Hibernate, JPA dentre outras tecnologias.

Voltando ao assunto deste artigo, a primeira coisa a se fazer é referenciar a biblioteca para que a utilizemos no VBA (Visual Basic for Applications):

referenciando ADO

Então podemos gerar alguns dados ilustrativos em uma planilha para servir de exemplo:

planilha de dados

Por fim, vamos ao código (os comentários ilustram o que está sendo feito):

Public Sub doRecordset()

 'Link interessante:
 'http://support.microsoft.com/kb/257819

 'DECLARAMOS VARIÁVEIS
 Dim rs As ADODB.Recordset
 Dim cn As ADODB.Connection
 
 'DECLARAMOS VARIÁVEIS EM LINHA
 Dim conStr As String, path As String, strSQL As String
 
 'CAMINHO COMPLETO DA PLANILHA (no diretório onde ela se encontra)
 path = ActiveWorkbook.path & "\" & ActiveWorkbook.Name
 
 'String de conexão para a planilha. Estou usando o MS Office 2007. Para outras versões deveremos variar o número 12
 conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & path & "';" & _
 "Extended Properties=""Excel 12.0;HDR=YES;IMEX=1;"";"
 
 'Instrução SQL que retorna apenas as pessoas cuja idade é > 30 anos.
 strSQL = "SELECT Nome, Sobrenome, Nascimento, CInt((Now - Nascimento)/365.25) as Idade " & _
 "FROM [Plan1$A:C] " & _
 "where (Now - Nascimento)/365.25 > 30"
 
 'Instanciamos objeto connection na variável declarada acima
 Set cn = New ADODB.Connection
 
 'Abrimos a conexão
 cn.Open conStr
 
 'Instanciamos objeto recordset na variável declarada acima
 Set rs = New ADODB.Recordset
 
 'Abrimos recordset utilizando conexão aberta acima e instrução SQL
 rs.Open strSQL, cn, adOpenStatic, adLockOptimistic, adCmdText
 
 
 'Fazemos um looping por todos os registros da recordset e imprimimos no console
 Do Until rs.EOF = True
   Debug.Print rs!Nome, rs.Fields(1).Value, rs!Nascimento, rs!Idade
   rs.MoveNext
 Loop
 
 'LIMPEZA: (MUITO IMPORTANTE) Desalocamos espaço em memória fechando os objetos e os desalocando.
 If Not rs Is Nothing Then
   rs.Close
   Set rs = Nothing
 End If
 
 If Not cn Is Nothing Then
   cn.Close
   Set cn = Nothing
 End If
End Sub

Se você está se perguntando: “Qual a utilidade disto?” a resposta é simples: serve para manipular dados. Podemos, de maneira alternativa, manipular dados no MS Excel utilizando-se dos objetos existentes no próprio Excel, mas, desta forma acima, cria-se a possibilidade de utilizar instruções SQL que são bastante poderosas para a finalidade de consultar e manipular dados.

Outra coisa, na instrução SQL:

SELECT Nome, Sobrenome, Nascimento, CInt((Now - Nascimento)/365.25) as Idade FROM [Plan1$A:C] where (Now - Nascimento)/365.25 > 30

Plan1$A:C determina a planilha (aba) que estamos consultando e subsequentemente a faixa de valores (Range => A:C). A:C significa que a tabela vai da coluna A até a coluna C. Se quisermos restringir a range basta substituir A1:C6  por exemplo.

O DOWNLOAD  desta planilha está disponível. Se gostou, deixe seu comentário.

Veja outros posts sobre VBA.

Fale comigo.

Publicado em Visual Basic 6.0 e VBA | Etiquetas , , , | Deixe o seu comentário

ByVal e ByRef. Sabe a diferença entre esses tipos de parâmetros no VBA ?

No VBA podemos codificar Sub e Function sendo que ambas permitem a passagem de parâmetros. Ex:

Public Sub realizaOperacoes(ByVal a As Integer, ByRef b As Integer)

Esses parâmetros podem ser passados ByVal (por valor) ou ByRef (por referência). A diferença entre esses casos é que ao passarmos um parâmetro ByRef a função receberá a referência do endereço de memória do mesmo. Já os parâmetros ByVal na verdade são uma cópia do que foi passado externamente a função.

Vamos imaginar que, ao declararmos uma variável, criamos um pequeno “baldinho” na memória do computador que poderá aceitar um tipo de valor. Ex:

Dim x as Integer

declaramos, então, um “baldinho” que aceita valores inteiros e apenas inteiros. Agora vamos atribuir um valor dentro deste “baldinho”:

x =  11

Ao passar x para outra Function ou Sub que aceitem um parâmetro inteiro, se o parâmetro for ByRef estaremos passando a referência ao endereço deste “baldinho” na memória. Caso seja ByVal, a Sub ou Function que detém o parâmetro tirará uma cópia deste baldinho e alterará o valor desta cópia. Vamos ver um exemplo prático:

1) Declaramos a seguinte SUB com dois parâmetros ‘a’ e ‘b':

Public Sub realizaOperacoes(ByVal a As Integer, ByRef b As Integer)
 '3) Para parâmetros ByVal, é realizada a CÓPIA do baldinho.
 'Para parâmetros ByRef (padrão do VBA) usa-se o próprio baldinho
 'que veio de fora.
 a = 1
 b = 3
End Sub

2) Agora declaramos uma SUB que chama a outra SUB realizaOperacoes:

Public Sub teste()
 'EXECUTAR ESSA SUB NA JANELA IMEDIATA PARA TESTAR
 '1) Ao declarar variáveis, cria-se BALDINHOS que aceitam tipos específicos.
 Dim x As Integer
 Dim y As Integer
 
 '2) Colocamos valores dentro dos baldinhos
 x = 11
 y = 33


 'Estou chamando a sub acima (teste1) passando-lhe seus dois parâmetros.
 realizaOperacoes x, y
 
 'QUANTO VOCÊ ACHA QUE SERÁ O VALOR DE X E Y NO FINAL DA EXECUÇÃO ?
 'Debug.Print --> Imprime no console [Ctrl + G]
 Debug.Print "x=", x, "y=", y
End Sub

A ideia é entender qual será o valor de X e de Y no final da execução.

No console serão  impressos os valores de X e Y:

x=             11           y=             3

Isso por que X foi passado por um parâmetro ByVal. Dentro da SUB realizaOperacoes é feito uma cópia deste “baldinho” com seu valor original. Já o y como foi passado ByRef o VBA entende que queremos alterar o mesmo baldinho de y.

Há que se saber que o padrão do VBA é ByRef, ou seja, se declararmos uma SUB ou Function desta forma:

Public Sub realizaOperacoes(a As Integer, b As Integer)

ambos os parâmetros são ByRef.

Publicado em Visual Basic 6.0 e VBA | Etiquetas , , | 1 Comentário

Implementando validade de aplicação MS Access ou MS Excel com VBA

inadimplenteSe você possui uma aplicação MS Access ou MS Excel e deseja que, periodicamente, seja bloqueada automaticamente caso seu usuário não pague a conta então entre em contato, pois possuo uma solução para este problema.

 

Publicado em MS Access | Etiquetas , | Deixe o seu comentário

Ao tentar registrar uma DLL ou OCX com o comando REGSVR32 no windows 7 obtemos um erro 0X80004005

Para utilizar-se de componentes ActiveX desenvolvidos por terceiros no MS Office temos que primeiramente registrá-lo na máquina em que ele será utilizado utilizando o comando regsvr32 no prompt de comando:

tentando registrar regsvr32

Porém, ao executar este comando no console de uma máquina com Windows 7 64 bits obtemos o seguinte erro:

erro regsvr32

Para contornar este problema devemos abrir o console no modo administrador. Para tanto: (a) abra a caixa de pesquisa do Windows 7 e digite “cmd”, (b) mantendo as teclas “Ctrl + Shift” pressionadas aperte “Enter”:

console administrador

Após isso ter sido feito e executarmos novamente o comando regsvr32 obtemos a mensagem de sucesso:

sucesso ao registrar regsvr32

Então podemos começar a utilizar o controle ActiveX, por exemplo, na planilha do MS Excel. Para tanto, selecionamos a opção [Mais Controles]:

selecionando um novo controle activex

Achamos o referido controle registrado:

achando o controle Recem Registrado

E o utilizamos:

controle exibido

Faça o download desta ocx e registre-a em sua máquina para testar no MS Excel.

Veja também:
Código fonte de várias OCX e DLL que desenvolvi em VB6

Publicado em Visual Basic 6.0 e VBA | Etiquetas , , , , , | 1 Comentário

Você recebe uma mensagem de erro “Falha no logon do Serviço de Perfil de Usuário”

Outro dia não conseguia me autenticar em meu computador. E, para piorar a vida, tinha apenas o meu usuário  (Administrador) criado em minha máquina porém com falha de logon…

Para começar, re-iniciei meu computador em MODO DE SEGURANÇA COM PROMPT DE COMANDO e usei os comandos abaixo:

Adiciona um usuário: net user nome-da-conta /add

Coloca usuário existente em um grupo:  net localgroup administrators nome-da-conta /add

Você talvez tenha de substituir o nome do grupo de ADMINISTRATORS para ADMINISTRADORES.

Para corrigir o perfil de conta de usuário, siga estas etapas:

Importante Essa seção, método ou tarefa contém etapas que descrevem como modificar o Registro. No entanto, sérios problemas poderão ocorrer caso você modifique o Registro incorretamente. Portanto, execute essas etapas cuidadosamente. Para ter mais proteção, faça um backup do Registro antes de modificá-lo. Assim, se ocorrer algum problema, você poderá restaurar o Registro. Para obter mais informações sobre como fazer backup e restaurar o Registro, clique no número abaixo para exibir o artigo da Base de Dados de Conhecimento Microsoft:

322756 Como fazer o backup e restaurar o Registro no Windows. Como fazer o backup e restaurar o Registro no Windows
  1. Clique em Iniciar, digite regedit na caixa Pesquisar e pressione ENTER.
  2. No Editor do Registro, localize e clique na seguinte subchave do Registro:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
  3. No painel de navegação, localize a pasta que começa com S-1-5 (chave SID) seguido por um número longo.
  4. Clique em cada pasta S-1-5, localize a entrada ProfileImagePath no painel de detalhes e clique duas vezes para certificar-se de que este é o perfil de conta de usuário que tem um erro.
     
    2805029
    • Se houver duas pastas cujo nome comece com S-1-5 seguido pelos mesmos números longos e um deles terminar com .bak, você tem que renomear a pasta .bak. Para fazer isto, siga estas etapas:
      1. Clique com o botão direito do mouse na pasta sem .bak e clique em Renomear. Digite .ba e pressione ENTER.
         
         

        2805041

      2. Clique com o botão direito do mouse na pasta com o nome .bak e clique em Renomear. Remova .bakno final do nome da pasta e pressione ENTER.
         
         

        2805042

      3. Clique com o botão direito do mouse na pasta com o nome .ba e clique em Renomear. Altere o .bapara .bak no final do nome da pasta e pressione ENTER.
         
         

        2805043

    • Se houver apenas uma pasta cujo nome comece com S-1-5 seguido por um número longo e terminando com.bak. Clique com o botão direito do mouse na pasta e clique em Renomear. Remova o .bak no final do nome da pasta e pressione ENTER.
    • Se houver duas pastas cujo nome comece com S-1-5 seguido pelos mesmos números longos e um deles terminar com .bak, você tem que renomear a pasta .bak. Para fazer isto, siga estas etapas:
      1. Clique com o botão direito do mouse na pasta sem .bak e clique em Renomear. Digite .ba e pressione ENTER.
         
         

        2805044

      2. Clique com o botão direito do mouse na pasta .bak e clique em Renomear. Remova .bak no final do nome da pasta e pressione ENTER.
         
         

        2805045

      3. Clique com o botão direito do mouse na pasta .ba e clique em Renomear. Altere o .ba para .bak no final do nome da pasta e pressione ENTER.
         
         

        2805046

    • Se houver apenas uma pasta cujo nome comece com S-1-5 seguido por um número longo e terminando com.bak. Clique com o botão direito do mouse na pasta e clique em Renomear. Remova o .bak no final do nome da pasta e pressione ENTER.
  5. Clique com o botão direito na pasta sem .bak no painel de detalhes, clique duas vezes em RefCount, digite 0 e clique em OK.
     
     

    2805047

  6. Clique na pasta sem o .bak, clique duas vezes em Estado no painel de detalhes, digite 0 e clique em OK.
     
     

    2805048

  7. Feche o Editor do Registro.
  8. Reinicie o computador.
  9. Faça logon novamente com sua conta.

Referências deste artigo:

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

http://tutoriaispc.com.br/criar-gerenciar-contas-usuario-utilizando-prompt-comandos-windows-7/

Publicado em Dicas, Microsoft | Etiquetas | Deixe o seu comentário

Abrindo planilhas do MS Excel em uma nova janela (para Windows XP)

Transcrevi este artigo do site oficial da Microsoft, pois no final dele faltou uma informação que irei destacar em vermelho. Se necessitar saber em outras versões do Windows pode-se encontrar as informações no link abaixo.

Site:

http://support.microsoft.com/kb/2551928/pt-br#xp

 

Para o Windows XP

  1. Clique em Iniciar e, a seguir, em Meu computador.

    2657982

  2. Clique em Ferramentas e depois em Opções de pasta.

    2657983

  3. Na janela Opções de pasta, clique na guia Tipos de arquivo.

    2658027

  4. Procure o formato de arquivo XLSX (folha de cálculo Microsoft Office Excel), selecione-o e clique em Avançado.

    2658028

  5. Na janela Editar tipo de arquivo, clique em Novo.

    2658029

  6. No campo Ação, digite um nome qualquer (no exemplo, Abrir em Nova Janela) e no campo Aplicativo usado para executar a ação: digite “C:\Arquivos de programa\Microsoft Office\Office12\EXCEL.EXE” “%1″

(observação importante: após clicar no botão OK na janela abaixo (Nova Ação) clique no botão [Definir Padrão] a para a nova ação criada na janela [Editar tipo  de Arquivo].)

 2658030



Observação: se estiver usando o Excel 2010 no campo Aplicativo usado para executar a ação, você deverá digitar“C:\Arquivos de programa \Microsoft Office\Office14\EXCEL.EXE” “%1″.

7. Volte a abrir um arquivo do Excel para que se abra numa nova janela.

Publicado em Dicas | Etiquetas , , , , | Deixe o seu comentário

Método para fazer log em arquivo texto em projetos MS Access

Public Sub log(Optional ByVal s1 As String, Optional ByVal s2 As String, Optional ByVal s3 As String, _
Optional ByVal s4 As String, Optional ByVal s5 As String, Optional ByVal s6 As String, Optional ByVal s7 As String, _
Optional ByVal s8 As String, Optional ByVal s9 As String, Optional ByVal s10 As String, Optional ByVal s11 As String, _
Optional ByVal s12 As String, Optional ByVal s13 As String, Optional ByVal s14 As String, Optional ByVal s15 As String, _
Optional ByVal s16 As String, Optional ByVal s17 As String, Optional ByVal s18 As String, Optional ByVal s19 As String, _
Optional ByVal s20 As String, Optional ByVal s21 As String, Optional ByVal s22 As String, Optional ByVal s23 As String, _
Optional ByVal s24 As String, Optional ByVal s25 As String)
 'http://msdn.microsoft.com/en-us/library/office/gg264278(v=office.15).aspx
 Dim folder As String
 folder = Application.CurrentProject.path & "\"
 
 
 Dim file As String
 file = Dir(folder & "*.txt")
 
 Open folder & "log.txt" For Append As #1
 Print #1, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25
 Close #1
End Sub
Publicado em MS Access, Visual Basic 6.0 e VBA | Etiquetas , | Deixe o seu comentário

Substituindo o nome do arquivo com VBA

Imagine que você tem um endereço de arquivo armazenado em uma variável String e necessita substituir apenas o nome do arquivo:

“d:\meus documentos\projeto1\outra sub pasta\cadastro cliente.xlsx

Ai você apenas quer que o nome do arquivo seja de [cadastro cliente.xlsx] para [cadastro do pedro.xlsx].

Public Function ReplaceFileName(ByVal path As String, ByVal filename As String)
 Dim parts() As String
 Dim newPath As String
 parts = Split(path, "\", , vbTextCompare)
 Dim i As Integer
 For i = 0 To UBound(parts) - 1
    newPath = newPath & Trim(parts(i)) & "\"
 Next i
 ReplaceFileName = newPath & filename
End Function

Veja o resultado na janela imediata:

?ReplaceFileName(“d:\meus documentos\projeto1\outra sub pasta\cadastro cliente.xlsx”,”cadastro do pedro.xlsx”)
d:\meus documentos\projeto1\outra sub pasta\cadastro do pedro.xlsx

Publicado em Visual Basic 6.0 e VBA | Etiquetas | Deixe o seu comentário