domingo, 31 de outubro de 2010

Preço de software


Sempre fui um crítico dos preços de software no Brasil.
Continuo achando caríssimo um Windows ou um Office com Access para pessoa física.
Se o Windows é o sistema operacional mais vendido no mundo inteiro, por que é o mais caro?
Vejam na imagem por exemplo, a versão de desenvolvedor do SQL Server, um super banco de dados corporativo. Coloquei a imagem para que ninguém pense que eu errei na digitação...
Lembro-me quando eu comprei o Windows 95 Update (para atualizar a partir do Win 3.11) e paguei algo em torno do que seria hoje uns R$ 70,00.
Isso sim era um preço justo, ainda mais considerando que naquela época, os PC's eram extremamente caros e com preços em dólar!
Será que o Windows e Office precisam ser tão caros assim?

;-)



domingo, 10 de outubro de 2010

Contrato de desenvolvimento de software

Esta é uma dúvida frequente na comunidade, principalmente para quem está começando ou está deixando de desenvolver para a empresa onde trabalha ou ainda está fazendo um "extra" paralelamente ao seu emprego.
Seguem links interessantes, onde o colega Avelino Sampaio do fórum ExpertAccess nos indica links muito interessantes, vale a pena dar uma olhada:




;-)

terça-feira, 5 de outubro de 2010

Utilitários para o Excel


Título estranho, mas é isso mesmo: utilitários para o Excel.
Várias ferramentas para quem não quer ser aventurar em macros/VBA e precisa de coisas simples do tipo "clica no botão e pronto".
Obviamente precisa pagar, mas os preços não são tão altos.
O que eu achei mais interessante pela descrição é o Excel Tool SQL Query por U$ 28.
Vale a pena dar uma olhada, apenas a título de curiosidade.

http://www.excel-tool.com/

;-)

sexta-feira, 1 de outubro de 2010

O que há de novo no Excel 2010

Sinceramente ainda não vi nada que merecesse algum comentário mais detalhado, exemplos ou demonstrações.
O Office 2010 acrescentou vários recursos que, apesar de interessantes, vão atender apenas a minoria dos usuários.
Continuo com a opinião de que, para grande parte das pessoas, o Excel 97 ainda é mais que suficiente. A migração para versões mais recentes ocorreram por uma questão de compatibilidade de arquivos ou por curiosidade pela novidade.
Eu mesmo sou usuário do Office 2007 no trabalho e em casa uso o 2003.
Para contornar a questão da compatibilidade, instalei o suplemento oferecido pela Microsoft no seu site de downloads.

Enfim, futuramente devo comentar alguma coisa sobre o Excel 2010.
O único comentário direto é o preço: em torno dos R$ 1.500,00 (versão Professional, outubro/2010), ainda é extremamente caro para o usuário doméstico.


Conectando o Access 2007 via VBA

Vou deixar um código aqui que postei em outro fórum, onde um colega queria saber como conectar o ADO numa base Access 2007.
Basta trocar o Provider, que até o 2003 era o Jet.

;-)

Option Compare Database
Option Explicit
Dim rst As ADODB.Recordset
Dim cnn As ADODB.Connection

Sub teste()
Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\banco.accdb"

rst.Open "Select * FROM TABELA1", cnn, adOpenKeyset, adLockOptimistic

MsgBox rst(0)

rst.Close
cnn.Close
End Sub


domingo, 25 de julho de 2010

"Fernando (Alonso) é mais rápido que você, confirme que você entendeu a mensagem!

Mensagem do engenheiro de Felipe Massa, Rob Smedley, no GP da Alemanha neste domingo, 25/07/2010.

O Massa entendeu, nós entendemos, o mundo inteiro entendeu.

Infelizmente.


sábado, 10 de julho de 2010

Blog de vagas e oportunidades

Blog do grande amigo Gian Carlos, sempre disposto a ajudar as pessoas.
Recomendo!


;-)

sexta-feira, 9 de julho de 2010

Criar email via VBA no Outlook - late binding

Mais óbvio e simples impossível.
Não esquecer:
- Que na hora do "Send", o Outlook vai dar um aviso de que outro programa está tentando enviar mensagens;
- O Outlook deve estar aberto na hora da execução do código.


;-)



Sub email()

Set olapp = CreateObject("Outlook.Application")
olapp.Session.Logon

Set mensagem = olapp.CreateItem(0)
With mensagem
.To = ""
.CC = ""
.BCC = ""
.Subject = ""
.Body = ""
.display
.Send
End With

End Sub

segunda-feira, 14 de junho de 2010

Sobre o limite de 2Gb no Access

Muita gente se apavora quando o seu mdb chega perto dos 2Gb e logo vai pensando em migrar para outro banco de dados.
Meu recado para os colegas:
O limite de 2Gb é para 1(um) mdb. Nada impede que se coloque tabelas em outros mdb's e se trabalhe com as mesmas vinculadas.
Utilizando-se esse recurso do Access, o limite praticamente deixa de existir, pois basta distribuir as tabelas de forma que cada mdb fique dentro dos 2Gb.
Importante lembrar que os 2Gb são para os dados e os objetos de sistema.
Na prática, o que se tem de espaço para dados são 2Gb menos os objetos de sistema.
Recomendo nunca ultrapassar 1,5Gb de mdb. Pode parecer conservador demais, mas já tive mdb's que quando chegaram a 1,9Gb começaram a dar problemas, desde então, passei a trabalhar tranquilamente dentro dos 1,5Gb.
Ainda penso que SQL Server Express + Access é uma dupla imbatível para desenvolver aplicações com bancos de dados.
O Access é uma ferramenta de desenvolvimento praticamente completa, só faltava gerar executáveis. Além disso, não tem outro aplicativo no mercado com um gerador de relatórios tão completo como o do Access.
VBA então nem se fala, muito fácil de usar.
Front End feito no Access e banco de dados no já sabidamente estável, confiável e robusto SQL Server atendem muito bem as aplicações corriqueiras de pequeno/médio porte.

;-)

p.s. Nem pensem em fazer banco de dados em Excel, ele não foi criado para essa finalidade!!!

Office 2010

Creio que até o momento desta postagem, o Office 2010 ainda não foi lançado aqui no Brasil, mas dando uma olhada geral pela internet, notei que o botão "Office" (aquele redondo no canto superior esquerdo da tela do Office 2007) ... sumiu!
No lugar dele, agora temos de volta o item de menu "Arquivo" ou "File".
Após o lançamento oficial, eu volto a comentar sobre o assunto, pois pelo que sei, as versões que estão por aí, são beta's e portanto passíveis de mudanças.
Você já devem ter visto um comentário que postei aqui no blog, falando sobre a complicação que é a nova "faixa de opções", que até agora não vejo lógica nenhuma no agrupamento de comandos.
Quem sabe o "sumiço" do botão Office não seja uma volta às origens, afinal o que há de mal em voltar atrás numa idéia infeliz???

;-))))

Comentários no código VBA

Comentar o código é sempre uma boa prática para auxiliar em futuras manutenções, sejam elas feitas por você mesmo ou por terceiros.
O usual é usar um apóstrofe antes da linha do comentário, mas relembrando do bom e velho Visual Basic do meu TK 83, vi que o comando REM ("remarks") funciona também!
Único porém é que ele só serve quando está no início da linha (o apóstrofe funciona em comnetários na mesma linha após o código).
Exemplo:

'Este é um comentário
REM segunda linha do comentário

;-)

sábado, 5 de junho de 2010

CASE no SQL do Access

Estranho escrever "sql do Access", pois SQL deveria ser uma linguagem comum aos banco de dados...
Enfim, outro dia eu precisei usar um CASE no Access e depois de algumas tentativas vi que não funcionava.
Após uma pesquisa pela net, descobri que não funciona mesmo e que é preciso usar um "Switch".
Dá mais trabalho para escrever, mas funciona.
Alguns dirão "é óbvio, você não sabia disso?".
Pois é, eu não sabia e agora estou sabendo!
;-)


SELECT
SWITCH
(
PRODUTO = 1, 'PRIMEIRO',
PRODUTO = 2, 'SEGUNDO'
) AS PRODUTO,
FROM TABELA

quinta-feira, 20 de maio de 2010

Manipulando a área de transferência do Windows (ClipBoard)

Requisito:
Marcar a referência "Microsoft Forms Object Library".
Se tiver um form no VBA, a referência estará automaticamente marcada.

;-)




Dim area As DataObject
Dim texto As String

Sub colar_da_area_de_transferencia()

Dim temp_area As New DataObject
temp_area.GetFromClipboard
MsgBox temp_area.GetText

End Sub

Sub limpa_area_transferencia()

Dim temp_area As New DataObject
temp_area.SetText ""
temp_area.PutInClipboard

End Sub

Sub copiar_para_area_de_transferencia()

Dim temp_area As New DataObject
temp_area.SetText "Texto"
temp_area.PutInClipboard

End Sub


segunda-feira, 17 de maio de 2010

Desvio padrão em VBA

Escrito no Excel, mas facilmente adaptável aos outros aplicativos do Office.

;-)


Option Explicit

' variáveis para cálculo do desvio padrão
'========================================
Dim valores() As Double
Dim desvio_padrao As Double
Dim qtd_valores As Integer
Dim soma As Double
Dim soma_1 As Double
Dim i As Integer
Dim media As Double
'========================================

'Cálculo de desvio padrão
'Exemplo para valores na coluna A a partir de A1
'Os valores devem estar em células contíguas
'Resultado em B1


Sub calcular()

qtd_valores = Range("A1").CurrentRegion.Rows.Count
ReDim valores(qtd_valores)

For i = 1 To qtd_valores
valores(i) = Sheets("plan1").Cells(i, 1)
Next i

desvio_padrao = f_desvio_padrao(qtd_valores, valores)
Sheets("plan1").Cells(1, 4) = "Desvio Padrão = " & desvio_padrao

End Sub

Function f_media(ByVal x As Long, valores() As Double)

soma = 0
For i = 1 To x
soma = soma + valores(i)
Next i

f_media = soma / x

End Function

Function f_desvio_padrao(ByVal qtd_valores As Integer, valores() As Double)

soma_1 = 0
media = f_media(qtd_valores, valores)
For i = 1 To qtd_valores
soma_1 = soma_1 + (valores(i) - media) ^ 2
Next i

f_desvio_padrao = Sqr(soma_1 / (qtd_valores - 1))

End Function


domingo, 16 de maio de 2010

Selecionar arquivo via caixa de diálogo - WORD VBA

É... de vez em quando eu faço alguma coisa no VBA do Word...


Dim fd As FileDialog
dim arquivo As String

Private Sub Abrir()

Set fd = Application.FileDialog(msoFileDialogFilePicker)
If fd.Show = -1 Then
arquivo = fd.SelectedItems(1)
MsgBox "O arquivo selecionado é " & arquivo
Else
arquivo = ""
Exit Sub
End If
Set fd = Nothing

End Sub


;-)

quinta-feira, 13 de maio de 2010

Inserindo assinatura no Outlook - VBA

Ultimamente o Outlook tem sido o "alvo" das minhas necessidades de automatização...
Segue código para inserir assinatura numa mensagem criada via VBA.
Detalhe importante: o formato do e-mail deve ser HTML.

;-)



Option Explicit
Dim assinatura As Variant

Public Function pega_assinatura(ByVal sFile As String) As String
'Dick Kusleika
Dim fso As Object
Dim ts As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2)
pega_assinatura = ts.readall
ts.Close
End Function

Sub Cria_mensagem_HTML()
'Creates a new e-mail item and modifies its properties.

Dim olapp As Outlook.Application
Dim objMail As MailItem
Set olapp = Outlook.Application
'Create mail item
Set objMail = olapp.CreateItem(olMailItem)

assinatura = pega_assinatura("C:\Documents and Settings\" & _
Environ("username") & "\AppData\Roaming\Microsoft\Assinaturas\Paulo.htm")

With objMail
'Set body format to HTML
'a tag
quebra linha
'a tag formata o texto para negrito
.BodyFormat = olFormatHTML
.HTMLBody = "Texto " & assinatura
.Display
End With

End Sub

sábado, 8 de maio de 2010

Navegando num formulário contínuo do Access...

... com a mesma facilidade do Excel.
Este código é de autoria do Jaques Zetune da ForumAccess.
Estou deixando aqui mais para consultas, pois as vezes eu preciso e não tenho à mão.
Não esquecer de colocar um checkbox com o nome chkNavegLoop, valor padrão 1.


;-)




Option Explicit

Const cDataSheet = 2, cContinuous = 1

Private Sub Form_Load()
Me.KeyPreview = True
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
DoKeys Me, KeyCode, Shift
End Sub

Public Sub DoKeys(wForm As Form, KeyCode As Integer, Shift As Integer)
Dim wCtl As Control, wIgnore As Integer
'a tecla Shift está pressionada ?
If Shift <> 0 Then Exit Sub
'o formulário está sendo visualizado em modo contínuo?
If wForm.CurrentView <> cDataSheet And wForm.DefaultView <> cContinuous Then Exit Sub

On Error Resume Next

Set wCtl = Screen.ActiveControl
'testa o comportamento da tecla Enter no controle
wIgnore = (wCtl.EnterKeyBehavior <> 0)
'verifica se a barra de rolagem está ativada If Not wIgnore Then wIgnore = (wCtl.ScrollBars <> 0)
'verifica se o controle em questão está com o texto “Ignore Setas” na propriedade Tag
'indicando que a intercepção de teclas deve ser ignorada no mesmo
If Not wIgnore Then wIgnore = (InStr(wCtl.Tag, "Ignore Setas") > 0)
If wIgnore Then Exit Sub
'sincroniza o registro corrente do formulário com o seu RecordsetClone
Me.RecordsetClone.Bookmark = Me.Bookmark

Select Case KeyCode
Case vbKeyDown
If Me.RecordsetClone.AbsolutePosition + 1 = Me.RecordsetClone.RecordCount And Me!chkNavegLoop Then
'tentou ir além do topo e a navegação em loop está ativa
DoCmd.GoToRecord , , acFirst
Else
DoCmd.GoToRecord , , acNext
End If
KeyCode = 0
Case vbKeyUp
If Me.RecordsetClone.AbsolutePosition = 0 And Me!chkNavegLoop Then
'tentou ir além do final e a navegação em loop está ativa
DoCmd.GoToRecord , , acLast
Else
DoCmd.GoToRecord , , acPrevious
End If
KeyCode = 0
End Select
End Sub



Ajustar um UserForm para o tamanho da tela

E também não deixar o usuário clicar no "X" para fechar o UserForm.
Muito bom para quem gosta de mexer na interface do Excel via VBA, assim é possível voltar todas as configurações colocando o código no botão SAIR.

;-)


Private Sub CommandButton2_Click()
Application.WindowState = xlMaximized
Me.Height = Application.Height
Me.Width = Application.Width
Me.Left = Application.Left
Me.Top = Application.Top
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Cancel = True
MsgBox "clicar no botão sair!!!"
End Sub

Executar um processo quando o e-mail chegar

Esta é bem interessante: toda vez que chegar um e-mail com um determinado título, executar um processo.
Vamos usar como título, "executa_processo".
Assim, caso eu queira disparar um processo, basta que o meu computador esteja ligado e o Outlook aberto. Quando chegar uma mensagem com o título acima, o processo "minha_rotina" é executado.

;-)



Evento new_mail:

Private Sub Application_NewMail()
Call Procura
End Sub


Sub Procura()
'Procura mensagem na caixa de entrada
'Critério: Assunto da mensagem

Dim mySearch As Search
Dim myResults As Results
Dim intCounter As Integer
Dim strMessages As String

Set mySearch = AdvancedSearch(Scope:="Inbox", Filter:="urn:schemas:mailheader:subject = 'executa_processo'")
Set myResults = mySearch.Results
If myResults.Count > 0 Then
Call minha_rotina
Else
Exit Sub
End If


End Sub

Copiar informações de um e-mail no Outlook - VBA

Vou deixar registrado aqui vários trechos de códigos em VBA, para facilitar a consulta. Afinal, basta ter uma conexão com a internet, certo?
Segue abaixo, um exemplo para copiar dados de um e-mail selecionado no Outlook para qualquer outro aplicativo Office.
Detalhes:
- Referenciar o Outlook no projeto VBA;
- O e-mail precisa estar selecionado na caixa de entrada (para este exemplo).

;-)



Option Explicit

Dim oApp As Outlook.Application
Dim oNS As Outlook.NameSpace
Dim oWindow As Object
Dim omail As Outlook.MailItem

Private Sub Comando12_Click()

Set oApp = New Outlook.Application
Set oNS = oApp.GetNamespace("MAPI")
Set oWindow = oApp.ActiveWindow
Set omail = oApp.ActiveExplorer.Selection.Item(1)

txt_remetente = omail.SenderName 'Remetente
txt_cc = omail.CC 'Com cópia
txt_assunto = omail.Subject 'Assunto
txt_mensagem = omail.Body 'Mensagem
txt_para = omail.To 'Destinatário
txt_data = omail.ReceivedTime

End Sub

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.