Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

Excel: Utilização de UserForms

O userform é um formulário personalizável que o Microsoft Excel tem disponível para interagir com a folha de cálculo. Aparece sobre a forma modal, ou seja, fica sobreposto à folha cálculo não permitindo qualquer selecção enquanto este estiver aberto. Podem-se colocar nos userforms uma grande quantidade de controlos como textbox, listbox, image, combobox, entre muitos outros ou utilizar alguns activex.

Estes userforms permitem melhorar a utilização das folhas de cálculo quer visualmente quer funcionalmente. Por exemplo, podem utilizar-se no arranque para mostrar informações importantes e/ou permitir seleccionar a folha(worksheet) a abrir ou, como no seguinte exemplo, utilizar para inserir dados.

 

No seguinte exemplo será mostrado como abrir um userform ao ser seleccionada uma determinada área e como inserir dados/comentários através deste.

Para adicionarmos um userform a uma folha de Excel devemos fazer o seguinte:

1 – Menu Tools – Macros – Visual Basic Editor ou ALT+F11 na folha de calculo
2 – Adicionar um novo userform clicando com o botão direito do rato ou através do menu Insert

Ao aparecer o userform e por defeito, aparece uma nova janela toolbox onde estão disponíveis alguns controlos que se podem adicionar a este. É possível ainda adicionar mais como vamos fazer para este exemplo.

3 – Menu Tools – Additional Controls e seleccionar da lista o Microsoft MonthView Control 6.0 (mscomct2.ocx)

4 – Adicionar da Toolbox um MonthView, uma TextBox, duas Labels e dois Botões. Clicando no controlo e seleccionado Properties pode-se alterar o nome, textos, etc (Figura 1). O nome dos botões, ou seja a propriedadename, deverá ficar da seguinte forma:


Limpar = btnLimpar
Inserir = btnInserir

 
   (Figura 1)

5 – Utilizar o seguinte código para os objectos “Sheet1” e “UserForm1”. (Figura 2)


    (Figura 2)


Código para a WorkSheet “Sheet1”

' Quando a selecção/célula é alterada da workcell "Sheet1"
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    ' Verifica se a célula está entre a B2 e B8
    If Not Intersect(Target, Me.[B2:B8]) Is Nothing Then

        ' Cria uma nova instância do nosso UserForm
        Dim frm As New UserForm1

        ' Caso a célula não esteja em branco e seja uma data
        If Target.Text <> "" And IsDate(Target.Text) Then

            ' Define que a data é a que está na célula
            frm.MonthView1.Value = Target.Text

        Else

            ' Define que a data actual do mês é a de hoje
            frm.MonthView1.Value = Date

        End If

        ' Caso tenha algum comentário, coloca-o na textbox
        If Not Target.Comment Is Nothing Then
            frm.TextBox1.Text = Target.Comment.Text
        End If

        ' Mostra o UserForm
        frm.Show

    End If

End Sub

 

Código para o “UserForm1”

' Botão Inserir (ao ser clicado)
Private Sub btnInserir_Click()

    ' Caso exista algum comentário na célula apaga-o
    If Not ActiveCell.Comment Is Nothing Then
        ActiveCell.Comment.Delete
    End If

    ' Caso exista algum texto na textbox insere-o como comentário
    If Me.TextBox1.Text <> "" Then
        ActiveCell.AddComment Me.TextBox1.Text
    End If

    ' Coloca o mês seleccionado na célula
    ActiveCell.Value = Me.MonthView1.Value

    ' Fecha o userform
    Unload Me

End Sub


' Botão Limpeza (ao ser clicado)
Private Sub btnLimpar_Click()

    ' Limpa o texto da textbox
    Me.TextBox1.Text = ""

    ' Coloca a data actual
    Me.MonthView1.Value = Date

End Sub

 

' Quando o UserForm é activado
Private Sub UserForm_Activate()

    ' Coloca uma scrollbar vertical na textbox que será
    ' visível caso o texto seja muito extenso
    Me.TextBox1.ScrollBars = fmScrollBarsVertical

    ' Define que a textbox terá a selecção (focus)
    Me.TextBox1.SetFocus

End Sub

Este exemplo mostra como utilizar os userforms de uma forma geral e como a utilização destes poderá melhor as folhas de cálculo, tornando-as um pouco mais do que uma simples folha de cálculo. As aplicações dos userforms são muitas e simples de conseguir e o limite é a imaginação e criatividade de cada um.

 

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!


VB.NET: Dicas de Programação #3

Converter Texto para ProperCase

 

Quando se inserem registos em bases de dados é necessário ter algum cuidado como a informação se encontra e o que se grava. Muitos utilizadores finais, quer por falta de conhecimentos informáticos, quer por falta de cuidado, não regista a informação correctamente sendo pois muito usual encontrar registos (como nome próprios, moradas, etc) escritos a maiúsculas ou sem elas.

 

Os exemplos de “JORGE PAULINO” ou “jorge paulino” são por isso normais em muitos casos, e a existência de diversos registos com diversos formatos também. A solução de alguns programadores passa por converter tudo para maiúsculas, mas não é sem dúvida uma solução agradável.

 

Para prevenir isso pode-se utilizar uma pequena função que converte o texto para o chamado ProperCase, ou seja, a primeira letra de cada palavra a maiúsculas e as restantes a minúsculas. Para isso usamos a instrução StrConv() que permite efectuar a conversão para um formato definido. Como a conversão para ProperCase converte todas as palavras na frase, e existem algumas que se devem evitar (como é o caso de "e", "da", "do", "dos", "das" e outras variações), pode-se usar esta função que corrige este “problema”:

 

''' <summary>

''' Converte o nome para ProperCase e coloca algumas palavras

''' (menor ou igual a 3 caracteres) em minúsculas. Isto para evitar

'''  as palavras: "e", "da", "do", "dos", "das" e outras variações.

''' </summary>

''' <param name="str">Nome a converter</param>

Private Function ProperCase(ByVal str As String) As String

   Try

 

      ' Separa o nome convertido(através do StrConv) para uma variável

      Dim strSplit() As String = StrConv(str, VbStrConv.ProperCase).Split(" "c)

      Dim result As String = String.Empty

 

      ' Faz um ciclo em todas as palavras encontradas

      For x As Byte = 0 To strSplit.Length - 1

 

         ' Caso a dimenção seja igual ou inferior a 3 converte

         ' para minúsculas. Caso contrário apenas contrói o resultado

         If strSplit(x).Length <= 3 Then

            result &= strSplit(x).ToLower + Space(1)

         Else

            result &= strSplit(x) + Space(1)

         End If

      Next

 

      ' Retorna o nome convertido

      Return result

 

   Catch ex As Exception

      ' Em caso de erro retorna o texto em branco

      Return String.Empty

   End Try

 

End Function

 

 

Depois a utilização da função, por exemplo, no evento Click de um botão:

 

 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

 

   ' Nome a converter

   Dim strNomeCompleto As String = "antonio josé da silva oliveira"

 

   Mostra o resultado após conversão

   Debug.WriteLine(ProperCase(strNomeCompleto))

 

End Sub




DataGridView e ContextMenu

 

Na DataGridView não é possível normalmente, e sem utilizar qualquer código, seleccionar uma célula utilizando o botão direito do rato – o que é incomodo principalmente quando se mostrar um menu. Ou seja o que é necessário é seleccionar a célula com o botão do lado esquerdo do rato e depois mostrar o menu com o botão do lado direito do rato.

 

Como isto não é prático nem funcional, podemos ultrapassar isto utilizando este código:

 

 

' Executa quando algum item(ToolStripMenuItem) é seleccionado

Sub tsMenu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

 

   ' Mostra a informação com o texto do ToolStripMenuItem

   Debug.WriteLine(CType(sender, ToolStripMenuItem).Text)

 

End Sub

 

 

' No evento MouseDown da DataGridView

Private Sub DataGridView1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseDown

       

   ' Verifica se o botão usado é o direito

   If e.Button = Windows.Forms.MouseButtons.Right Then

       

      ' Verifica onde foi clicado com o ponteiro do rato

      Dim hti As DataGridView.HitTestInfo = DataGridView1.HitTest(e.X, e.Y)

       

      ' Caso tenha sido clicado numa célula e existam linhas

      If hti.Type = DataGridViewHitTestType.Cell And hti.RowIndex >= 0 Then

       

         ' Selecciona a célula onde se efectuou o clique

         DataGridView1.CurrentCell = DataGridView1(hti.ColumnIndex, hti.RowIndex)

       

         '  Caso não seja uma célula em branco (nova linha)

         If Not DataGridView1.CurrentCell.Value Is System.DBNull.Value Then


     
     
' Cria um novo ContextMenuStrip (texto, separador, texto), sem imagens,
             ' e define que ao se clicar num item corre o Sub "tsMenu_Click"

             Dim menustrip As New ContextMenuStrip

             menustrip.Items.Add("VBTuga Blog", Nothing, AddressOf tsMenu_Click)

             menustrip.Items.Add("-")

             menustrip.Items.Add(DataGridView1.CurrentCell.Value, Nothing, AddressOf tsMenu_Click)

       

            ' Mostra o ContextMenuStrip onde foi clicado com o rato

            menustrip.Show(Me.DataGridView1, New Point(e.X, e.Y))


          End If

      End If

   End If

       

End Sub



PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

VB6: Criação de Menus Dinâmicos

A utilização de menus permite navegar nas diversas opções de uma aplicação de uma forma organizada. É normal que as aplicações utilizem menus e, quando assim se justifique, menus de atalho. Estes menus (popupmenu) são normalmente específicos para um determinado objecto e resultam do clicar com o botão direito do rato (botão de opções).

 

Além de mais específicos estão próximos do(s) objecto(s) e utilizam muitas vezes opções personalizadas. Para isso é necessário criá-los dinamicamente, ou seja, criar o menu através de código no decorrer do programa. Por exemplo, ao seleccionarmos um item de uma lista podemos queres associar ao menu o texto dele.

 

A criação de um menu através do “Menu Editor” e chama-lo através da instrução PopupMenu limita-nos ao itens predefinidos. Para a criação de menus dinamicamente pode-se utilizar alguns dos API’s disponíveis e tornar estes versáteis e mais próximos das necessidades do utilizador.

 




Vamos ver um exemplo simples da criação de menus e sub-menus utilizando API’s:

 

 

Option Explicit

 

 

' Declaração das funções API's

 

' Cria um novo menu vazio

Private Declare Function CreatePopupMenu Lib "user32" () As Long

' Elimina um específico menu, libertando a memória usada por ele

Private Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long

' Adiciona um novo item a um menu existente

Private Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long

' Permite verificar qual o menu que foi seleccionado

Private Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal X As Long, ByVal Y As Long, ByVal nReserved As Long, ByVal hwnd As Long, lprc As Any) As Long

 

' Verifica a posição do cursor no ecrã

Private Declare Function GetCursorPos Lib "user32" (lpPoint As PointAPI) As Long

 

' Declaração das constantes. Estas constantes não estão todas usadas

' mas são as disponíveis para a utilização de menus dinâmicos

Private Const MF_INSERT As Long = &H0&

Private Const MF_CHANGE As Long = &H80&

Private Const MF_APPEND As Long = &H100&

Private Const MF_DELETE As Long = &H200&

Private Const MF_REMOVE As Long = &H1000&

Private Const MF_BYCOMMAND As Long = &H0&

Private Const MF_BYPOSITION As Long = &H400&

Private Const MF_SEPARATOR As Long = &H800&

Private Const MF_ENABLED As Long = &H0&

Private Const MF_GRAYED As Long = &H1&

Private Const MF_DISABLED As Long = &H2&

Private Const MF_UNCHECKED As Long = &H0&

Private Const MF_CHECKED As Long = &H8&

Private Const MF_USECHECKBITMAPS As Long = &H200&

Private Const MF_STRING As Long = &H0&

Private Const MF_BITMAP As Long = &H4&

Private Const MF_OWNERDRAW As Long = &H100&

Private Const MF_POPUP As Long = &H10&

Private Const MF_MENUBARBREAK As Long = &H20&

Private Const MF_MENUBREAK As Long = &H40&

Private Const MF_UNHILITE As Long = &H0&

Private Const MF_HILITE As Long = &H80&

Private Const MF_SYSMENU As Long = &H2000&

Private Const MF_HELP As Long = &H4000&

Private Const MF_MOUSESELECT As Long = &H8000&

 

Private Const TPM_RETURNCMD As Long = &H100&

 

' Tipo para a posição do rato no ecrã

Private Type PointAPI

    X As Long

    Y As Long

End Type

 

Private menu As Long

Private submenu As Long

 

 

' No evento MouseDown do Form cria o menu

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

    Dim cursor As PointAPI

    Dim result As Long

 

    ' Caso tenha sido usado o botão direito do rato

    If Button = vbRightButton Then

                   

        ' Cria o sub popup menu

        submenu = CreatePopupMenu()

        Call AppendMenu(submenu, MF_STRING, 10, "Sub-Menu 1")

        Call AppendMenu(submenu, MF_STRING, 11, "Sub-Menu 2")

       

        ' Cria o popup menu

        menu = CreatePopupMenu()

        Call AppendMenu(menu, MF_STRING, 1, "Menu 1")

        Call AppendMenu(menu, MF_GRAYED, 2, "Menu 2")

        Call AppendMenu(menu, MF_SEPARATOR, 3, "")

         ' Insere o sub-menu no menu

        Call AppendMenu(menu, MF_POPUP, submenu, "Menu 3")

        Call AppendMenu(menu, MF_CHECKED, 4, "Menu 4")

     

        ' Recolhe a informação do cursor do rato

        Call GetCursorPos(cursor)

       

        ' Verifica o resultado seleccionado de acordo com o índice

        result = TrackPopupMenu(menu, TPM_RETURNCMD, cursor.X, cursor.Y, 0, Me.hwnd, 0)

       

        ' De acordo com o resultado (escolha) executa algo. Neste

        ' caso mostra apenas na janela “Immediate”

        Select Case result

            Case 1

               Debug.Print "Menu 1"

            Case 2

               Debug.Print "Menu 2"

            Case 4

               Debug.Print "Menu 4"

            Case 10

               Debug.Print "Sub-Menu 1"

            Case 11

               Debug.Print "Sub-Menu 2"

        End Select

   

    End If

End Sub

 

 

‘ No evento Unload do Form limpa os menus

Private Sub Form_Unload(Cancel As Integer)

 

    ' Limpa os menus criados da memória

    Call DestroyMenu(menu)

    Call DestroyMenu(submenu)

   

End Sub

 

 

Este exemplo pretende mostrar a simplicidade e utilidade deste menus e como melhorar as aplicações com a adição destes. Este código poderá ser adaptado e colocado num módulo ou classe para ser reutilizado na aplicação.

 

 

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!




Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico