web 2.0


FUNÇÃO ALEATÓRIO_ENTRE

No Excel 2003 não existe a função ALEATÓRIOENTRE() onde podemos gerar numeros aleatórios entre dois numero maior que 1, apenas por meio do Analises Tool Pack.
Ja no Excel 2007 a função foi incorporada na biblioteca de funções builtin.
No VBA, no entanto, esse função ainda não existe, embora possamos usar a função do Excel por meio do WorksheetFunction.
mas há como montar um função UDF para essa tarefa. é bem simples e útil.

 

Código:

Function ALEATORIO_ENTRE(NumInferior,NumSuperior) As Double
ALEATORIO_ENTRE = Int((NumSuperior - NumInferior+ 1) * Rnd + NumInferior)
End Function

Tags: , ,

Microsoft Office | VBA

Automação OLE em VBA – Parte 1

Introdução:

 

Um dos principais recursos que a linguagem Visual Basic nos fornece é o suporte à tecnonogia COM, a qual podemos usar programas “dentro” de programas por meio de suas API.

Para quem quer saber mais sobre o assunto pode conferir um ótimo artigo na Wikipedia

Component Object Model (Wikipedia)

Muitas dessas API´s estão disponíveis para uso nos aplicativos do Office por meio do VBA. Outras, no entanto, não funcionam em VBA apesar de estarem listadas na caixa de dialogo Ferramentas > Referencias.

Apresento na lista a seguir algumas das bibliotecas de objetos disponiveis, as quais podemos usar.

Biblioteca Descrição
Windows Scripting Runtime Contém objetos de manipulação do sistema de arquivos do Windows.
Ler arquivos txt, criar, excluir, listar arquivos em pasta são alguns dos seus recursos.
Microsoft Shell Controls And Automation Idem ao Scripting Runtime, porem com recursos de manipulação do Windows Explorer
Microsoft Internet Controls Usado para automatizar objetos no Internet Explorer
Windows Script Host Object Model Usado para usar os mesmos objetos que o processador de scrips do windows usa.
Com essa API é possível criar atalhos para arquivos no Windows
Windows Media Player Automatiza o Windows Media Playe
Microsoft Office [xx] Type Library Automatiza qualquer programa do Office
   

 

Nos proximos artigos apresentarei alguns macetes de como aproveitar o poder desse recurso.

Até a proxima !

Att. Adelson RM Silva

Tags: , , ,

Microsoft Office | VBA

RibbonX – Adicionando conteúdo dinâmico

Neste breve artigo discutirei a criação de um menu dinâmico na nova interface de usuário do Excel 2007. Este artigo é um excerto do material de treinamento sobre programação do RibbonX o qual pode ser adquirido na loja do site em: http://loja.msofficegurus.com No Treinamento, o leitor aprenderá todo o processo de programação e implementação das soluções desenvolvidas.

Para aqueles que se acostumaram com o antigo método de personalização das barras de ferramentas o novo método pode parecer horrível. Não obstante a nova complexidade introduzida no RibbonX, a flexibilidade e novas possibilidades de personalização vão muito além do que é possível fazer no antigo sistema. Por exemplo:
 

  • Você alguma vez precisou desabilitar um comando no Excel (digamos, o comando “Imprimir”)? Se sim, o leitor recordará das implicações disso. Na nova interface, podemos fazê-lo globalmente evitando brechas na impressão;
     
  • Precisou remover o menu principal pelo seu? Lembra da implicação disso para outras sessões do Excel?
     
  • Alguma vez precisou adicionar imagens em grupos? Agora, podemos fazê-lo rapidamente como mostra a figura:


Figura 1: Criando galerias de imagens

Ao passo que é verdadeiro que requererá um pouco mais de tempo nosso no XML, é muito mais verdadeiro que as possibilidades mais do que compensam tal trabalho. Além do que para os que desenvolvem em VS.NET o trabalho é facilitado pelos “schemas” XML que adicionam “Intellisense” durante a criação.

Portanto, vamos supor o seguinte cenário: existe uma determinada interface que deve somente ser mostrada quando algo é clicado (como as guias sensíveis ao contexto). Em situações como estas, nós queremos criar o conteúdo dinâmicamente para que o mesmo seja mostrado somente nas situações determinadas.

Obtemos tal resultado utilizando o atributo getContent. O valor do atributo é, na verdade, um callback (um procedimento VBA) que deve ser executado para determinar o conteúdo.

Vejamos um exemplo simples de como isso pode ser feito. A figura abaixo mostra a nossa guia com um menu sem conteúdo:


Figura 2: Menu de conteúdo dinâmmico

O conteúdo do menu deve ser mostrado quando a célula A1 da primeira planilha for diferente de vazio. Aqui, teremos dois trabalhos distintos envolvendo XML (os quais podem ser feitos no CustomUI Editor ou outro editor de XML qualquer): 

·         Criar o XML para definir a guia conforme mostrado acima;

·         Criar o XML para ser inserido dinamicamente no VBA o qual será retornado pelo callback especificado no atributo getContent.

 
Vamos iniciar pelo XML que criará a guia, grupo e botão conforme a figura anterior:
 

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="setRib">
   <ribbon startFromScratch="false">
    <tabs>
     <tab
    id="idGuia"
    insertBeforeMso="TabHome"
    label="Minha Guia"> 

      <group
     id="idGrp"
     label="Meu Grupo">

 

          <dynamicMenu id="idDMnu"
          getContent="conteudoDin"
          imageMso="Spelling"
          label="Meu Menu Dinâmico"/>
      </group>
     </tab>
    </tabs>
   </ribbon>
</customUI>


Note o atributo
getContent do menu dinâmico no XML acima. É este callback que será utilizado para escrever o conteúdo dinamicamente.

Note também o atributo onLoad. Aqui, utilizamos tal atributo para podermos invalidar a Faixa de Opções e forçar a chamada do callback conteudoDin.

O próximo passo requer a criação do conteúdo dinâmico. Neste caso, o ideal é criar um novo arquivo Excel e criar toda a interface e testá-la. Uma vez que tal interface esteja pronta, nós precisamos transformá-la em uma string que será utilizado no VBA.

Tags: , , , ,

Microsoft Office | VBA

Procv com Imagens

Neste curto artigo irei demonstrar como utilizar a função PROCV com imagens. Para realizar esta tarefa é bem simples.
Primeiro selecione as imagens que serão exibidas e as cole em uma planilha

Neste caso peguei as fotos de 3 presidentes.
Coloque como legenda o nome do presidente. Feito isto crie um intervalo nomeado para selecionar estes nomes..

Para isto na guia Fórmulas , selecione definir nome

Defina o nome como presidentes , coloque a seguinte fórmula

=DESLOC(Plan1!$A$2;0;0;1;CONT.VALORES(Plan1!$2:$2))

 

Assim o intervalo irá ser redimensionado de acordo com a inserção de novos dados. Criado este nome, em outra planilha, crie uma validação de dados à partir do intervalo nomeado criado. Para criar a validação , selecione a guia Validação de Dados, e insira à partir de uma lista o intervalo que acabamos de criar.

 

Agora a última etapa, use a ferramenta câmera e tire uma foto de qualquer local da planilha (esta ferramenta não é exibida por padrão, procure por ela em todos os comandos na guia de opções) Esta ferramenta exibe uma imagem a partir de um intervalo, para que a imagem seja alterada, iremos criar um novo nome dinâmico à partir da seleção feita na nossa validação. Para este nome use a seguinte fórmula, e defina o nome como Foto

=DESLOC(Plan1!$A$1;0;CORRESP(Plan2!$C$3;Plan1!$A$2:$C$2;0)-1)

Pronto agora selecione sua imagem, e defina o intervalo como =Foto. Você já tem um procv feito com imagens!

Baixe aqui o arquivo com exemplo

Bruno Leite

Office Developer

Set/09

Tags: , , ,

Microsoft Office | VBA

Criando um Ribbon Dinâmico

Neste artigo tratarei da criação dinâmica de ribbons utilizando-se de dados disponíveis na planilha ativa.
Isto é útil em casos em que haja a necessidade dos controles serem alterados, sem necessidade de alterações no código xml.
Estes controles também permitem que sejam passados paramêtros para qualquer rotina.

Primeiro é necessário editar o arquivo xml, do arquivo, para isto abra o arquivo no Office no Office 2007 Custom UI Editor

Neste arquivo xml, criei 2 grupos, cada um deles contendo um combobox

 

 

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">

  <ribbon startFromScratch="true">

 

    <tabs>

 

      <tab id="MeuRibbon" label=" Meu Ribbon Dinâmico" insertBeforeMso="TabHome">

 

        <group id="Grupo1" label="Grupo 1">

          <comboBox id="Cb1"

          label="Selecione a Opção:"

          onChange="MyCombo1_Click"

          getItemCount="CountGrupo1"

          getItemLabel ="LabelGrupo1"

          sizeString="123456789012345678901234567890"

>

          </comboBox>

        </group>

 

        <group id="Grupo2" label="Grupo 2">

          <comboBox id="Cb2"

          label="Selecione a Opção:"

          onChange="MyCombo2_Click"

          getItemCount="CountGrupo2"

          getItemLabel = "LabelGrupo2"

          sizeString="123456789012345678901234567890"

>

          </comboBox>

        </group>

 

      </tab>

 

    </tabs>

  </ribbon>

</customUI>


 

 

As definições xml do combobox são as seguintes:

 

 

comboBox id="Cb2" - definindo o ID do controle

label="Selecione a Opção:"  - definindo o label que será apresentado ao usuário

onChange="MyCombo2_Click" - definindo qual será a ação executada na alteração do controle pelo usuário

getItemCount="CountGrupo2" - retorna a quantidade de itens que serão exibidos no combo

getItemLabel = "LabelGrupo2" - preenche o combobox com os valores 

sizeString="123456789012345678901234567890" - definindo o tamanho do combobox

 

 

 

Pronto o nosso arquivo xml já está pronto para receber os dados em tempo de execução, para que o código funcione , é necessário a criação das rotinas no nosso arquivo xlsm.

 

O código necessário par ao arquivo .xlsm é o seguinte:

 

 

'Intervalo para o Combo1

Dim cb1rg As Range

'Intervalo para o Combo2

Dim cb2rg As Range

 

'Rotinas para o grupo1

Sub MyCombo1_Click(control As IRibbonControl, text As String)

    Call Minharotina("Grupo 1", text)

End Sub

 

Sub CountGrupo1(control As IRibbonControl, ByRef returnedVal)

    Set cb1rg = Plan1.Range("A2:A" & Plan1.Range("A2").End(xlDown).Row)

    returnedVal = cb1rg.Rows.Count

End Sub

 

Sub LabelGrupo1(control As IRibbonControl, index As Integer, ByRef returnedVal)

    returnedVal = cb1rg.Cells(index + 1).Value

End Sub

 

'Rotinas para o Grupo 2

Sub MyCombo2_Click(control As IRibbonControl, text As String)

    Call Minharotina("Grupo 1", text)

End Sub

 

Sub CountGrupo2(control As IRibbonControl, ByRef returnedVal)

    Set cb2rg = Plan1.Range("B2:B" & Plan1.Range("B2").End(xlDown).Row)

    returnedVal = cb2rg.Rows.Count

End Sub

 

Sub LabelGrupo2(control As IRibbonControl, index As Integer, ByRef returnedVal)

    returnedVal = cb2rg.Cells(index + 1).Value

End Sub

 

 

Sub MinhaRotina(Plan As String, Item As String)

    MsgBox "Você selecionou o item " & Item & " de " & Plan

End Sub



Pronto , para testar feche e abra o arquivo novamente, os dados constantes na coluna A serão exibidos no grupo 1, os dados constantes na coluna B serão exibidos no Grupo 2.


 

 

 

Como este é meu primeiro Post por aqui, dúvidas e sugestões são bem vindas. Caso tenha algum problema com formatação corrigirei assim que possível.

baixe aqui o arquivo de exemplo -> Exemplo RibbonDinamico.xlsm (17,50 kb)



Bruno Leite
Office Developer

 

 

Tags: , , , , ,

Microsoft Office | VBA

RibbonX – Adicionando conteúdo dinâmico

Neste breve artigo discutirei a criação de um menu dinâmico na nova interface de usuário do Excel 2007. Este artigo é um excerto do material de treinamento sobre programação do RibbonX o qual pode ser adquirido na loja do site em: http://shop.linhadecodigo.com.br/treinamento.asp?id=2778. No Treinamento, o leitor aprenderá todo o processo de programação e implementação das soluções desenvolvidas.

Para aqueles que se acostumaram com o antigo método de personalização das barras de ferramentas o novo método pode parecer horrível. Não obstante a nova complexidade introduzida no RibbonX, a flexibilidade e novas possibilidades de personalização vão muito além do que é possível fazer no antigo sistema. Por exemplo:

 

  • Você alguma vez precisou desabilitar um comando no Excel (digamos, o comando “Imprimir”)? Se sim, o leitor recordará das implicações disso. Na nova interface, podemos fazê-lo globalmente evitando brechas na impressão;
     
  • Precisou remover o menu principal pelo seu? Lembra da implicação disso para outras sessões do Excel?
     
  • Alguma vez precisou adicionar imagens em grupos? Agora, podemos fazê-lo rapidamente como mostra a figura:


Figura 1: Criando galerias de imagens

Ao passo que é verdadeiro que requererá um pouco mais de tempo nosso no XML, é muito mais verdadeiro que as possibilidades mais do que compensam tal trabalho. Além do que para os que desenvolvem em VS.NET o trabalho é facilitado pelos “schemas” XML que adicionam “Intellisense” durante a criação.

 

Portanto, vamos supor o seguinte cenário: existe uma determinada interface que deve somente ser mostrada quando algo é clicado (como as guias sensíveis ao contexto). Em situações como estas, nós queremos criar o conteúdo dinâmicamente para que o mesmo seja mostrado somente nas situações determinadas.

 

Obtemos tal resultado utilizando o atributo getContent. O valor do atributo é, na verdade, um callback (um procedimento VBA) que deve ser executado para determinar o conteúdo.

 

Vejamos um exemplo simples de como isso pode ser feito. A figura abaixo mostra a nossa guia com um menu sem conteúdo:


Figura 2: Menu de conteúdo dinâmmico

 O conteúdo do menu deve ser mostrado quando a célula A1 da primeira planilha for diferente de vazio. Aqui, teremos dois trabalhos distintos envolvendo XML (os quais podem ser feitos no CustomUI Editor ou outro editor de XML qualquer):

 

·         Criar o XML para definir a guia conforme mostrado acima;

·         Criar o XML para ser inserido dinamicamente no VBA o qual será retornado pelo callback especificado no atributo getContent.

 

Vamos iniciar pelo XML que criará a guia, grupo e botão conforme a figura anterior:

 

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="setRib">

 

   <ribbon startFromScratch="false">

    <tabs>

     <tab

    id="idGuia"

    insertBeforeMso="TabHome"

    label="Minha Guia">

      <group

     id="ifGrp"

     label="Meu Grupo">

 

          <dynamicMenu id="idDMnu"

          getContent="conteudoDin"

          imageMso="Spelling"

          label="Meu Menu Dinâmico"/> 

      </group>

     </tab>

    </tabs>

   </ribbon>

</customUI>

 

Note o atributo getContent do menu dinâmico no XML acima. É este callback que será utilizado para escrever o conteúdo dinamicamente.

 

Note também o atributo onLoad. Aqui, utilizamos tal atributo para podermos invalidar a Faixa de Opções e forçar a chamada do callback conteudoDin.

 

O próximo passo requer a criação do conteúdo dinâmico. Neste caso, o ideal é criar um novo arquivo Excel e criar toda a interface e testá-la. Uma vez que tal interface esteja pronta, nós precisamos transformá-la em uma string que será utilizado no VBA.

Este processo requererá um pouco de paciência e cuidado. Lembre-se que usamos as aspas (“”) para abrir e fechar uma string. Não obstante, o código XML já conterá aspas que envelopam os valores dos atributos (por exemplo, getContent="conteudoDin").

 

Neste caso, precisamos duplicar as aspas para que não haja erro na string durante o callback.

Vejamos então uma string contendo o código XML:

 

xml = "<menu xmlns=""http://schemas.microsoft.com/office/2006/01/customui"">" & _

      "<button id=""btn1"" imageMso=""FileOpen"" label=""Abrir doc"" onAction=""callbackDin"" />" & _

      "<button id=""btn2"" imageMso=""ChartTypeAllInsertDialog"" label=""Criar gráfico"" onAction=""callbackDin"" />" & _

      "<button id=""btn3"" imageMso=""XmlDataRefresh"" label=""Atualizar Dados XML"" onAction=""callbackDin"" />" & _

      "</menu>"

 

Finalmente, precisamos gerar os callbacks e exportá-los para o VBA onde escreveremos o miolo. Iniciaremos pelo VBE da pasta de trabalho onde inseriremos o código a seguir:

 

Option Explicit

 

Private Sub Workbook_Open()

'   Ao abrir, determina se a célula A1 possui

'   algo escrito

    If Sheet1.Range("A1") <> "" Then

'       Variável global declarada no módulo

'       como sendo pública

        blnConteudo = True

    End If

End Sub

 

Agora, inseriremos o código no VBE da planilha 1 (sheet1) para checar se o valor em A1 é diferente de vazio. A checagem ocorrerá sempre que algo for modificado na planilha:

 

Option Explicit

 

Private Sub Worksheet_Change(ByVal Target As Range)

'   O valor booleano para determinar se o conteúdo

'   é ou nao mostrado é definido de início como "False" (falso)

    blnConteudo = False

 

'   Checar para saber se há algo na célula A1

    If Sheet1.Range("A1") <> "" Then

'       Se sim, modificar o valor booleano para "True"

        blnConteudo = True

    End If

'   Chamar a rotina que invalida o RibbonX

    Call invalidarRib

End Sub

 

Finalmente, adicione um módulo onde inseriremos os callbacks como segue:

 

Option Explicit

'Variável booleana pública para determinar

'Se o conteúdo é ou nao mostrado

Public blnConteudo  As Boolean

 

'Variável global representando o nosso RibbonX

Dim mRib            As IRibbonUI

 

'Rotina a ser chamada para invalidar o RibbonX

Sub invalidarRib()

    mRib.Invalidate

End Sub

 

'Callback executado quando o ribbon é carregado

'(refere-se ao atributo onLoad)

Sub setRib(ribbon As IRibbonUI)

'   Instancia a variável global como sendo o ribbon

    Set mRib = ribbon

 

'   Invalida o Ribbon forçando a reexecução dos callbacks

    mRib.Invalidate

End Sub

 

'Callback para gerar o conteúdo dinâmica

Sub conteudoDin(control As IRibbonControl, ByRef returnedVal)

'   Variável do tipo string para armazenar o código xml

    Dim xml As String

 

'   Código xml do conteúdo dinâmico. Note que podemos definir

'   callbacks dentro deste conteúdo xml. Porém, não esqueça de

'   adicionar tais callbacks ao seu conteúdo VBA.

    xml = "<menu xmlns=""http://schemas.microsoft.com/office/2006/01/customui"">" & _

      "<button id=""btn1"" imageMso=""HappyFace"" label=""Smile"" onAction=""callbackDin"" />" & _

      "<button id=""btn2"" imageMso=""FormatPainter"" label=""Paint"" onAction=""callbackDin"" />" & _

      "<button id=""btn3"" imageMso=""AutoFilter"" label=""Filter"" onAction=""callbackDin"" />" & _

      "</menu>"

 

'   Checar o valor booleano e determinar o que deve ser mostrado

    If blnConteudo = True Then

'       Se verdadeiro, mostrar conteúdo dinâmico

        returnedVal = xml

    Else:

'       Caso contrário, mostrar nada.

        returnedVal = False

    End If

End Sub

 

Sub callbackDin(control As IRibbonControl)

    MsgBox "Você clicou no botão de id: " & control.ID, vbInformation

End Sub

 

Salve, feche o arquivo e abra-o novamente. A interface dinâmica está pronta para uso, bastando apenas modificar o valor contido na célula A1 da planilha 1:


Figura 3: Resultado do conteúdo criado dinamicamente

 

Conclusão

Neste curto artigo mostro como modificar a nova interface de usuário do Excel utilizando conteúdo dinâmico.

Este artigo é excerto do material de Treinamento encontrado em http://shop.linhadecodigo.com.br/treinamento.asp?id=2778 o qual trata exclusivamente da programação e personalização da interface do RibbonX. No Treinamento, o leitor aprenderá todo o processo de programação e implementação das soluções desenvolvidas.

O material é desenvolvido sobre o Excel 2007 português e não é compatível com a versão Beta 2 do Excel. Os interessados podem obter um cópia do Office 2007 Trial em http://us1.trymicrosoftoffice.com/ para acompanhar o Treinamento.

Robert Friedrick Martim, Expert da Comunidade Excel
Robert Martim é Economista, Formado e Pós-Graduado em Finanças pela Universidade de Londres, Microsoft MVP Excel.

Conheça alguns dos e-books do autor sobre Excel e Access:

 

Tags: , , , ,

Microsoft Office | VBA