Menu
 
 
 
 
 
 


Valid XHTML 1.0 Transitional
Valid CSS!

Visual Basic for Application:

Criação de menus simples - JJoão (06/2005)

Deixo-vos aqui algumas rotinas para criação de menus, na barra de menu e no menu de célula.
O código abaixo é parte de um suplemento onde conjugo as rotinas que considero mais úteis, mantendo-as assim sempre à mão. Não irei colocar aqui todas, só as mais simples, que servirão para teste dos itens de menus, considero que a parte importante aqui é a criação dos menus.
As rotinas permitem criar os itens de menu com imagem e texto, analise os parametros das macros abaixo:
Sub CriarItemsCell(xOrdem, xId, xItem, xMacro, xTag, xBeginGroup)
Sub CriarItemsTools(xOrdem, xId, xItem, xMacro, xTag, xBeginGroup)


Variável Descrição
xOrdem = Posição no menu
xId = Numero do FaceId, imagem 
xItem = Titulo do item 
xMacro = Macro a executar
xTag = Nome destinado a identificar o item
xBeginGroup = Ínicio de grupo, verdadeiro ou falso 

Estas rotinas são utilizadas pela macro:

Sub CriarMenus()
Ex. para o menu de celulas:

CriarItemsCell posicao, _
      364, _
      "Zona de impressão", _
      "set_Area_de_Impressao", _
      "jjTools", _
      False

Ex. para o menu na barra de menus:

CriarItemsTools posicao,_
        351, _
        "2º Item", _
        "NomeDaMacro", _
        "jjTools", _
        False


Para que o menus sejam criados sempre que abrir o livro(Workbook) a macro "Sub CriarMenus() " deve ser chamada através do evento:

PrivateSub Workbook_Open()
    Call CriarMenus 
End Sub 

Para que o menus sejam eliminados sempre que fechar o livro (workbook) a macro "Sub EliminarMenus()" deve ser chamada através do evento :

Private  Sub Workbook_BeforeClose(Cancel As Boolean)
         Call EliminarMenus
End Sub 

estes eventos estão disponíveis no código de "EsteLivro" (ThisWorkbook).

'
'O código seguinte deve ser colocado num modulo
'
Dim xlMenuBar As CommandBar
Dim jjMenuCell As CommandBarPopup
Dim jjMenuTools As CommandBarPopup
Dim jjMenuBar As CommandBarPopup

'Criar menu celula
Sub Criar_jjMenuCell()
    Set jjMenuCell = Application.CommandBars _
           ("Cell").Controls.Add _
            (Type:=msoControlPopup, _
            before:=1, _
            temporary:=True)
    'definir nome do menu e respectiva tag, podem ser alterados
    'não esquecer que a tag deve ser igual á tag definida na "Sub EliminarMenus()"
    'se alterar aqui terá que alterar lá também
    With jjMenuCell
         .Caption = "JJTools V1.0"
         .Tag = "xpto"
         .BeginGroup = True
    End With
End Sub

'Criar menu na barra de menus
Sub Criar_jjMenuTools()
    'define a barra de menus
    Set xlMenuBar = Application.CommandBars("Worksheet Menu Bar")
    'estado
    xlMenuBar.Visible = True
    'adicionar um novo menu
    Set jjMenuBar = xlMenuBar.Controls.Add _
                    (Type:=msoControlPopup, temporary:=True)
    'definir nome do menu e respectiva tag, podem ser alterados
    'não esquecer que a tag deve ser igual á tag definida na "Sub EliminarMenus()"
    'se alterar aqui terá que alterar lá também
    With jjMenuBar
        .Tag = "jjMenuBar"
        .Caption = "&JJ-Menu"
    End With
    Set jjMenuTools = Application.CommandBars.FindControl _
                    (Type:=msoControlPopup, Tag:="jjMenuBar")
End Sub

'
' Rotina para criar items de menu de celulas,
' itens acessiveis através do clique direito
' dentro da worksheet

Sub CriarItemsCell(xOrdem, xId, xItem, xMacro, xTag, xBeginGroup)
  With jjMenuCell.Controls.Add _
       (Type:=msoControlButton, _
         before:=xOrdem, _
         temporary:=True)
              .Caption = xItem
              .OnAction = xMacro
              .FaceId = xId
              .Tag = xTag
              .BeginGroup = xBeginGroup
  End With
End Sub


'
' Rotina para criar item de menu
'
Sub CriarItemsTools(xOrdem, xId, xItem, xMacro, xTag, xBeginGroup)
    With jjMenuTools.Controls.Add _
       (Type:=msoControlButton, _
         before:=xOrdem, _
         temporary:=True)
              .Caption = xItem
              .OnAction = xMacro
              .FaceId = xId
              .Tag = xTag
              .BeginGroup = xBeginGroup
    End With
End Sub

'
'Rotina principal
'

Sub CriarMenus()

  Dim posicao As Single

  Call EliminarMenus
  Call Criar_jjMenuCell
  Call Criar_jjMenuTools
  posicao = 0
' Criar Items no menu Celula
  posicao = posicao + 1
  CriarItemsCell posicao, 485, "Linhas de Grelha", _
                "jjGridLinesOnOff", "jjTools", True

  posicao = posicao + 1
  CriarItemsCell posicao, 0, "Minusculas", "jjMinusculas", _
                "jjTools", False

  posicao = posicao + 1
  CriarItemsCell posicao, 0, "Maiusculas", "jjMaiusculas", _
                "jjTools", False

  posicao = posicao + 1
  CriarItemsCell posicao, 0, "1ª Maiuscula", "jj1aMaiuscula", _
                "jjTools", False

  posicao = posicao + 1
  CriarItemsCell posicao, 364, "Zona de impressão", _
                "set_Area_de_Impressao", "jjTools", False

  posicao = posicao + 1
  CriarItemsCell posicao, 1, "Formato da celula", "jjGetFormat", _
                "jjTools", False

' Criar Items no menu JJ-Menu
  posicao = 0
  posicao = posicao + 1
  CriarItemsTools posicao, 1695, "1º Item", "NomeDaMacro", _
                "jjTools", False
  posicao = posicao + 1
  CriarItemsTools posicao, 351, "2º Item", "NomeDaMacro", _
                "jjTools", False
  posicao = posicao + 1
  CriarItemsTools posicao, 0, "3ºItem", "NomeDaMacro", _
                "jjTools", False

  Set jjMenuCell = Nothing
  Set jjMenuTools = Nothing
  Set jjMenuBar = Nothing
  Set xlMenuBar = Nothing

End Sub

Sub EliminarMenus()
' Eliminar todos os jjItemsCell
  For Each cItem In Application.CommandBars("cell").Controls
      If cItem.Tag = "xpto" Or cItem.Caption = "" Then cItem.Delete
  Next cItem

' Eliminar o menu personalizado
  For Each cMenu In Application.CommandBars("Worksheet Menu Bar").Controls
      If cMenu.Tag = "jjMenuBar" Then cMenu.Delete
  Next cMenu
End Sub


'---------------------------------------------------------------------------
'Macros usadas pelos itens de menu
'---------------------------------------------------------------------------

'
'Macro de teste
'
Sub NomeDaMacro()
    MsgBox "Teste de macro", vbInformation, "Teste de item de menu"
End Sub

'
'Recolhe o formato da celula corrente
'
Sub jjGetFormat()
    Dim Formato As String
    Dim x As String
    Dim Texto As String
    Texto = "Para copiar o formato, " & _
            " basta selecionar o texto e pressione CTRL+C "
    Formato = ActiveCell.NumberFormatLocal
    x = InputBox(Texto, "Format de " & ActiveCell.Address, Formato)
End Sub

'
'Macro que torna a 1ª letra
'em maiusculas  em todas as palavras
'da zona selecionada
'
Sub jj1aMaiuscula()
    Dim Celula As Range
    Dim xSel As Long, x As Long
    xSel = Selection.Count
    For Each Celula In Selection
        x = x + 1
        stBar x, xSel
        Celula.Value = Application.WorksheetFunction.Proper(Celula.Text)
    Next
End Sub

'
'Macro que torna em maiusculas
'a zona selecionada
'
Sub jjMaiusculas()
    Dim Celula As Range
    Dim xSel As Long, x  As Long
    xSel = Selection.Count
    For Each Celula In Selection
        x = x + 1
        stBar x, xSel
        Celula.Value = UCase(Celula.Text)
    Next
End Sub

'
'Macro que torna em minusculas
'a zona selecionada
'
Sub jjMinusculas()
    Dim Celula  As Range
    Dim xSel As Long, x  As Long
    xSel = Selection.Count
    For Each Celula In Selection
        x = x + 1
        stBar x, xSel
        Celula.Value = LCase(Celula.Text)
    Next
End Sub

'
'Macro que vai dizendo ao utilizador
'em que % se encontra o processo em curso
'
Sub stBar(x1 As Long, x2 As Long)
     'Vai apresentado o evolução da operação em %
    Application.StatusBar = "Processo: " & _
            Format(x1 / x2, "#0%") & _
            " Concluído"

    'No final do processo restaura a barra de estado
    If x1 = x2 Then Application.StatusBar = False
End Sub
'
'Macro inverte o estado das linhas de grelha
'tornando-as visiveis ou não
'
Sub jjGridLinesOnOff()
    ActiveWindow.DisplayGridlines = _
             Not ActiveWindow.DisplayGridlines
End Sub
Utilidades
 
Transito em directo
 
O Tempo
 
Gerador de Chaves
 
Moedas - Taxas e Cambios
 
 
 
 
 
Classifique o nosso website
@ MUNDOPT.COM
 
Topo