Category Archives: Outlook

VBA – Escrevendo números por extenso – Parte 2

Não tem coisa melhor do que a comunidade. A troca de informações gera mais informação, que por fim, acaba resultando em ajuda para muita gente, sem sequer percebermos.

O colega João Henrique Botelho de Amorim encontrou neste site a função em VBA que possibilitava escrever números por extenso. Utilizando-a, descobriu alguns bugs e melhorias, decidindo compartilhar conosco tais mudanças. Abaixo segue a versão disponibilizada pelo colega:

Public Function PorExtenso(ByVal n As Double) As String
' Excel VBA - Write numbers in full - Escrever números por extenso
' Macro adaptada, corrigida e comentada em 10/01/2011 por João Henrique Amorim 
' E-mail: jhbamorim@yahoo.com
' Fonte: http://www.tomasvasquez.com.br/
' Alguns problemas solucionados:
'-Problema com quatrocentos, seiscentos, setecentos (tudo que tenha "centos" no nome). "401" era escrito: "quatrocento e s um"
'-Espaço duplo sempre após ocorrência de "e": "um mil e  um"; "quinhentos e  um"
'-Falta um "e" em 1200, 1300, 1400,...2200,.... Escrevia: "dois mil duzentos"
'-Não escreve números maiores que 10.000 (10.005 é escrito como "cinco"). Já que isso não é um problema no meu caso, bastou usar um if inicial para impedir números maiores que esse.
Dim num As Double, Unid As Variant, Dezen As Variant, Centen As Variant
 
    Unid = Array("", "um", "dois", "três", "quatro", "cinco", _
                 "seis", "sete", "oito", "nove", "dez", "onze", "doze", _
                 "treze", "quatorze", "quinze", "dezesseis", "dezessete", _
                 "dezoito", "dezenove", "vinte")
    Dezen = Array("", "dez", "vinte", "trinta", "quarenta", _
                  "cinquenta", "sessenta", "setenta", "oitenta", "noventa")
    Centen = Array("", "cento", "duzentos", "trezentos", _
                   "quatrocentos", "quinhentos", "seiscentos", _
                   "setecentos", "oitocentos", "novecentos", "mil")
    'Essa função não escreve números maiores que 9.999
    If n > 9999 Then PorExtenso = "Número deve ser menor que 10.000": Exit Function
 
    num = n
    PorExtenso = ""
    If n = 0 Then
        PorExtenso = "zero"
    End If
    If (n \ 1000) > 0 And n \ 1000 < 10 Then 'O número possui milhares?
        PorExtenso = Unid(n \ 1000) & " mil " 'Então escreve a unidade seguida da palavra mil
    End If
    n = n - (n \ 1000) * 1000 'Agora n vai apenas até as centenas do número
 
    If n > 100 Then 'Possui centenas?
        PorExtenso = PorExtenso & Centen(n \ 100) 'Junta-as ao final da frase
    End If
    If n = 100 Then
        PorExtenso = PorExtenso & " cem" 'Se for 100 apenas junta "cem" ao final da frase
        GoTo Prossiga 'E vai para a concatenaçao final das coisas na string
    End If
    n = n - (n \ 100) * 100 'Agora pega apenas ate as dezenas.
 
    If n >= 20 And n < 100 Then 'Se as dezenas estiverem entre 20 e 99 junte-as ao fim da frase
        PorExtenso = PorExtenso & " " & Dezen(n \ 10)
    End If
    If n > 0 And n < 20 Then 'Entre 1 e 19 escreve a unidade no fim da frase
        PorExtenso = PorExtenso & " " & Unid(n)
        GoTo Prossiga 'E vai para a concatenaçao final das coisas na string
    End If
    n = n - (n \ 10) * 10 'Pega só a unidade
 
    If n > 0 Then 'Junta o nome da unidade ao fim da frase,
        PorExtenso = PorExtenso & " " & Unid(n)
    End If 'na qual ja deve constar os milhares e dezenas SE houver...
Prossiga:
    If num Mod 10 <> 0 Then
        If InStr(1, PorExtenso, "vinte", 1) = 0 Then
            If InStr(1, PorExtenso, "trinta", 1) = 0 Then
                If InStr(1, PorExtenso, "enta", 1) > 0 Then
                    'Sempre lembrando de suprimir todos os espaços após o "e"
                    PorExtenso = Application.Substitute(PorExtenso, "enta", "enta e")
                End If
            End If
        End If
    End If
    If num Mod 10 <> 0 Then
        If InStr(1, PorExtenso, "vinte", 1) > 0 Then
            If InStr(1, PorExtenso, "trinta", 1) = 0 Then
                If InStr(1, PorExtenso, "enta", 1) = 0 Then
                    PorExtenso = Application.Substitute(PorExtenso, "vinte", "vinte e")
                End If
            End If
        End If
    End If
    If num Mod 10 <> 0 Then
        If InStr(1, PorExtenso, "vinte", 1) = 0 Then
            If InStr(1, PorExtenso, "trinta", 1) > 0 Then
                If InStr(1, PorExtenso, "enta", 1) = 0 Then
                    PorExtenso = Application.Substitute(PorExtenso, "trinta", "trinta e")
                End If
            End If
        End If
    End If
    'Troca-se de "cento" para "cento e" apenas se o nome NAO contiver "centos" para não destruir quatroCentos, seisCentos...etc
    If num Mod 100 <> 0 And InStr(1, PorExtenso, "centos", 1) <= 0 Then
        If InStr(1, PorExtenso, "ento", 1) > 0 Then
            PorExtenso = Application.Substitute(PorExtenso, "cento", "cento e")
        End If
    End If
    'Troca-se de "entos" para "entos e" apenas se o nome NAO contiver "centos" para não destruir quatroCentos, seisCentos...etc
    If num Mod 100 <> 0 And InStr(1, PorExtenso, "centos", 1) <= 0 Then 'Aqui mora o problema!
        If InStr(1, PorExtenso, "entos", 1) > 0 Then
            PorExtenso = Application.Substitute(PorExtenso, "entos", "entos e")
        End If
    End If
    'Agora que os "entos" já foram resolvidos, resolvamos os centos de quatrocentos, seiscentos, etc
 
    If num Mod 100 <> 0 And InStr(1, PorExtenso, "centos", 1) > 0 Then
        If InStr(1, PorExtenso, "centos", 1) > 0 Then
            PorExtenso = Application.Substitute(PorExtenso, "centos", "centos e")
        End If
    End If
 
    'E continua testando os milhares...Tendo agora o cuidado de procurar pelo espaço após o "mil" para que ele não fique duplicado
    If num Mod 1000 <> 0 Then
        'A troca de "mil" por "mil e" está ocorrendo quando após o milhar vier número de 1 a 99
        If (num - (num \ 1000) * 1000) <= 100 Then
            If InStr(1, PorExtenso, "mil ", 1) > 0 Then
                PorExtenso = Application.Substitute(PorExtenso, "mil ", "mil e")
            End If
        End If
 
        'Mas a troca de "mil" por "mil e" também deve ocorrer quando após o milhar vier 200, 300,...,900. Mas não 100! Pois foi tratado no if anterior.
        If (num - (num \ 100) * 100) = 0 And (num - (num \ 1000) * 1000) <> 100 Then
            If InStr(1, PorExtenso, "mil ", 1) > 0 Then
                PorExtenso = Application.Substitute(PorExtenso, "mil ", "mil e ")
            End If
        End If
    End If
 
End Function

De quebra, ainda acrescentou vários comentários úteis para o entendimento do código. Valeu João!

Abraços a todos

VBA – Abrindo o Microsoft Outlook

Resolvendo uma dúvida no fórum recentemente, fui questionado de como abrir o Microsoft Outlook pelo VBA. A dúvida inicial era o envio de email, cujo exemplo abaixo pode ser visto:

http://www.tomasvasquez.com.br/downloads/e-mail_VBA_Outlook.xls

O problema é que este código segue a mesma lógica da criação de um email quando se clica em um link em uma página de internet, quando é aberto um novo email do Outlook e ao clicar em enviar, ele vai para a caixa de saída, sendo enviado somente quando o Outlook é aberto normalmente.

Pois bem, para forçar a abertura do Microsoft Outlook, o código abaixo é necessário:

Sub AbreOutlook()
    Dim Olook As Outlook.Application
    Set Olook = CreateObject("Outlook.Application")
 
    Dim ns As Outlook.Namespace
    Dim Folder As Outlook.MAPIFolder
 
    Set ns = Olook.GetNamespace("MAPI")
    Set Folder = ns.GetDefaultFolder(olFolderInbox)
 
    Olook.Explorers.Add Folder
 
    'faz o que tem que fazer
 
    Olook.Quit
    Set Olook = Nothing
 
End Sub

Estranhamente, criar a instância do “Outlook.Application” não suficiente, já que o método Show ou Visible não existem no objeto, da mesma forma que acontece quando manipulamos um “Excel.Application” ou mesmo “Word.Application”.

Na linha:

‘faz o que tem que fazer

É o código para manipular ou trabalhar com os objetos do Outlook, como a criação do email citada acima. O restante das linhas fecha o Outlook, e podem ser omitidas conforme a necessidade, o que manterá o Outlook aberto.

É importante frisar que o código não vai garantir a abertura do Outlook corretamente caso ele requisite credenciais ou senha de acesso, muito comum em redes empresariais.

Bom, está aí. Bom proveito!

VBA – Retornando o nome do usuário logado

No VBA, a opção mais trivial para obter o nome do usuário logado na máquina é através de uma chamada a API advapi32.dll.  Nada contra APIs, mas sempre que puder evitar de usá-las, eu prefiro, já que suas chamadas são feitas em baixo nível e requerem um nível de conhecimento bem avançado desta.

Abaixo segue um exemplo que efetua a tarefa sem a necessidade de API no VBA:

'Function que retorna o nome do usuário de rede logado
 
Function UsuarioRede() As String
    Dim GetUserN
    Dim ObjNetwork
    Set ObjNetwork = CreateObject("WScript.Network")
    GetUserN = ObjNetwork.UserName
    UsuarioRede = GetUserN
End Function
 
Sub Mostra()
    MsgBox UsuarioRede
End Sub

O código faz uso do objeto WScript.Network, comumente encontrado nas versões mais atuais do Windows, dispensando referências manuais. Se não me engano, obtive este código em uma edição revista da FórumAccess. Quanto a autoria, ela é do Luiz Cláudio Vieira da Rocha, renomado especialista em Office no Brasil.

Bom proveito a todos!

Office – Área útil maior nas telas do Office

Fonte: INFO

Minimize a Faixa de Opções e ganhe espaço extra para trabalhar com documentos, planilhas e apresentações

Para trabalhar bem, nada melhor do que ter espaço. Se você quiser aumentar a área útil na tela do seu computador nos programas do Office, clique no botão Personalizar e selecione Minimizar a Faixa de Opções. É o que basta para que desapareçam. Para operar com uma faixa de opções, clique em seu título. Para voltar a exibir a faixa de opções, clique novamente em Personalizar e desmarque o comando Minimizar ou, então, ganhe tempo e use um duplo clique em qualquer uma das guias.

Do autor

A dica é básica, mas vale muito a pena principalmente com a chegada dos netbooks, cujas telas são de tamanho bem reduzido e as barras de ferramenta podem ser um tormento na hora de realizar os trabalhos.

Bom proveito!