Visual Basic em Português

VB.NET, ASP.NET, VB6 e VBA

VB.NET: Microsoft Reports – Formatações

Os Microsoft Reports permitem formatar diversas propriedades através da criação de expressões. Estas propriedades têm de ser alteradas desta forma, caso os resultados sejam dinâmicos, uma vez que não é possíveis de o fazer através do código. São diversas propriedades como BackgroundColor, ForeColor, BorderColor, FontFamily, FontStyle, TextAlign, etc, etc.

Tudo junto, e com algum bom gosto, podem-se criar relatórios bastante profissionais e de uma forma relativamente simples.

Quando seleccionamos algumas dessas propriedades, está disponível uma opção para construir uma expressão. Isso indica que é possível alterar essa propriedade de acordo com o resultado de um campo, com o número da linha, ou com outra condição qualquer. O resultado da expressão é uma String.

Depois, no Expression Editor, existem algumas constantes especificas para a propriedade, que escolhemos definir através de uma expressão. Neste caso a propriedade Color.

Finalmente, na expressão, podemos utilizar condições simples ou complexas. Este é um exemplo que verifica se o campo “ID1” tem o valor “AAA” e coloca a cor Gainsboro caso esta expressão seja verdadeira, e White caso seja falsa.

=IIF(Fields!ID1.Value="AAA","Gainsboro", “White")


Com algumas condições e manipulando diferentes propriedades, podemos obter resultados com este, onde um plano anual, tem diferentes cores para diferentes códigos.

Outro exemplo, e também para um plano anual, usando um objecto Table, pode-se seleccionar a TableRow e definir a seguinte expressão:

=IIF(RowNumber(Nothing) MOD 2 = 0,"White","LightBlue")

Isto fará com que as linhas tenham cores alternadas para uma mais fácil distinção.

São alguns exemplos de formatação em Microsoft Reports, que espero que ajudem a melhorar o resultado final dos relatórios.


VB.NET: Comentário numa DataGridViewCell

O Microsoft Excel permite colocar comentários nas células, de modo a guardar informações não visíveis(escondidas), mas que quando o ponteiro do rato está sobre a respectiva célula, o comentário é exibido sobre a forma de Tooltip.

Este comentário é representado por um pequeno triângulo, de cor vermelha, ao canto superior direito da célula.

A DataGridView é um controlo muito semelhante às células do Microsoft Excel, mas como é natural, esta possibilidade não está contemplada. A DataGridView não é uma folha de calculo!

No entanto, poderá ser útil, reproduzir esta funcionalidade em uma DataGridView, para guardar alguns comentários, notas pessoais, etc.

Para implementarmos este tipo de funcionalidade, podemos criar um novo tipo de coluna – DataGridViewColumnComment - e um novo tipo de célula -DataGridViewCellComment. Depois, no evento Paint(), criamos o polígono ao canto superior direito da respectiva célula.

O resultado, será uma classe como esta:


''' <summary>
''' Cria um novo tipo de coluna
''' </summary>
<System.Diagnostics.DebuggerStepThrough()> _
Public Class DataGridViewColumnComment
    Inherits DataGridViewColumn

    Public Sub New()
        MyBase.New(New DataGridViewCellComment())
    End Sub

End Class

''' <summary>
''' Cria uma nova TextBoxCell que irá permitir
''' adicionar comentários e mostrar como ToolTipText
''' </summary>
<System.Diagnostics.DebuggerStepThrough()> _
Public Class DataGridViewCellComment
    Inherits DataGridViewTextBoxCell

    Private m_Comment As String

    ''' <summary>
    ''' Guarda a informação dos comentários
    ''' </summary>
    Public Property Comment() As String
        Get
            Return m_Comment
        End Get
        Set(ByVal value As String)
            m_Comment = value

            ' Define o texto para a tooltip
            If m_Comment IsNot Nothing AndAlso m_Comment.Length <> 0 Then
                Me.ToolTipText = m_Comment
            Else
                Me.ToolTipText = String.Empty
            End If

        End Set
    End Property


    Protected Overrides Sub Paint(ByVal graphics As System.Drawing.Graphics, _
          ByVal clipBounds As System.Drawing.Rectangle, _
          ByVal cellBounds As System.Drawing.Rectangle, _
          ByVal rowIndex As Integer, _
          ByVal cellState As System.Windows.Forms.DataGridViewElementStates, _
          ByVal value As Object, _
          ByVal formattedValue As Object, _
          ByVal errorText As String, _
          ByVal cellStyle As System.Windows.Forms.DataGridViewCellStyle, _
          ByVal advancedBorderStyle As  _
                System.Windows.Forms.DataGridViewAdvancedBorderStyle, _
          ByVal paintParts As System.Windows.Forms.DataGridViewPaintParts)

        ' Desenha a célula (processo normal)
        MyBase.Paint(graphics, clipBounds, cellBounds, rowIndex, _
                    cellState, value, formattedValue, errorText, _
                    cellStyle, advancedBorderStyle, paintParts)

        ' Caso tenha algum comentário, desenha o triângulo
        If Me.Comment IsNot Nothing AndAlso Me.Comment.Length <> 0 Then

            Dim rect As Rectangle = cellBounds
            Dim points As New List(Of Point)
            points.Add(New Point(rect.Right - 8, rect.Top))
            points.Add(New Point(rect.Right, rect.Top + 8))
            points.Add(New Point(rect.Right, rect.Top))

            graphics.FillPolygon(Brushes.Red, points.ToArray)

        End If

    End Sub

End Class

Depois, para adicionar colunas à DataGridView:

        Dim col As New DataGridViewColumnComment
        col.Name = "Nova Coluna"
        col.HeaderText = "Nova Coluna"
        Me.DataGridView1.Columns.Add(col)


Finalmente, para inserir ou remover comentários, é apenas necessário altera a propriedade Comment. Colocando qualquer String, o comentário é definido, caso contrário, é removido.

        ' Posição na DataGridView
        Dim row As Integer = 0
        Dim col As Integer = 0

        ' Converte a célula para o tipo criado
        Dim cell As DataGridViewCellComment = _
            DirectCast(Me.DataGridView1(col, row), DataGridViewCellComment)

        ' Define um comentário para a célula. Para remover era necessário
        ' apenas definir como String.Empty ou ""
        cell.Comment = "http://vbtuga.blogspot.com/"

        ' Obriga a célula, agora com comentário, a actualizar
        Me.DataGridView1.InvalidateCell(cell)


Um exemplo simples, que mostra como colocar um comentário numa célula, mas acima de tudo como podemos criar células personalizadas, e adiciona-las à DataGridView.


Excel: Dicas de VBA - Ciclos

Os ciclos nas folhas de cálculo são bastante comuns quando se usa VBA. O objectivo é percorrer uma lista de valores e executar determinada acção ou validação enquanto este percorre todas as linhas ou colunas.

A execução de um ciclo simples pode ser feito da seguinte forma:

        Dim x As Integer
        For x = 1 To 100
            Cells(x, "A").Value = x
        Next


Isto irá escrever em todas as células da coluna A, da linha 1 à linha 100, um número sequencial. Mas este é um exemplo simples onde definimos onde começa e onde termina.

Para se fazer um ciclo numa lista de dados já existente, devemos sempre saber onde começar e onde terminar. Não tem lógica percorrer todas as linhas de uma folha de cálculo se estão apenas a ser utilizadas 20 ou 30.

Para se determinar a última linha usada em uma lista, devemos utilizar o seguinte método:

        Dim lastRow As Long
        lastRow = Cells(Cells.Rows.Count, "A").End(xlUp).Row


Isto é semelhante a seleccionar a ultima linha da coluna A e pressionar as teclas CTRL + UP ARROW, que fará saltar a selecção para a primeira célula com dados.

Só assim podemos saber com exactidão, qual a última linha utilizada, pois mesmo que existam linhas em branco na lista, todas as linhas serão percorridas.

No entanto, algumas considerações:

  1. Caso existam várias colunas na lista, devemos definir a coluna que tem mais dados;
  2. A variável utilizada para a última linha deverá ser do tipo Long e não Integer, pois uma variável do tipo Integer suporta apenas números até  32,768, sendo este inferior ao total de linhas disponível na folha de calculo.

Depois, é só utilizar a variável para limitar o ciclo:

        Dim lastRow As Long
        Dim x As Integer
        lastRow = Cells(Cells.Rows.Count, "A").End(xlUp).Row
        For x = 1 To lastRow
            Debug.Print(Cells(x, "A").Value)
        Next


Isto irá listar o valor de todas as células na coluna A. Para verificar qual a última coluna utilizada, o método é semelhante:

        Dim lastColum As Integer
        lastColum = Cells(1, Cells.Columns.Count).End(xlToLeft).Column


Mas existem outros métodos de verificar a última linha ou coluna utilizada, usando, por exemplo, o método SpecialCells:

        Dim lastCellRow As Long
        Dim lastCellColumn As Long

        ' Informação da ultima linha
        lastCellRow = ActiveSheet.Cells.SpecialCells(xlLastCell).Row

        ' Informação da ultima coluna
        lastCellColumn = ActiveSheet.Cells.SpecialCells(xlLastCell).Column


No entanto, existem vários registos de que este método não é fiável, e basta apagar algumas linhas para verificar que não o é, e por isso não é recomendado.

Existe ainda uma especial atenção para ciclos onde são eliminadas linhas ou colunas, onde o ciclo deverá ser efectuado do fim para o principio, ou seja, da última linha/colunas para a primeira. Deste modo, um ciclo para eliminar linhas, por exemplo, deverá ser feito da seguinte forma:
 

        Dim lastRow As Long
        Dim x As Integer

        lastRow = Cells(Cells.Rows.Count, "A").End(xlUp).Row

        ' Ciclo que irá percorrer da última para a primeira linha
        For x = lastRow To 1 Step -1

            ' Caso a célula esteja vazia
            If Len(Cells(x, "A").Value) = 0 Then
                Rows(x).Delete()
            End If

        Next

 

Estes são alguns exemplos simples de como fazer ciclos em células e como verificar qual a última linha ou coluna utilizada.


NOTICIA: MSDN Outubro 2009

Já está disponível a MSDN Magazine de Outubro de 2009.

Nesta edição podem-se ler alguns artigos como:

Entre muitos outros!

ee532478.oct_cover(en-us,MSDN.10)[1]

Para os leitores de VB.NET, um artigo sobre Collection and Array Initializers In Visual Basic 2010, de Adrian Spotty Bowles , onde são abordadas as inicializações de arrays e colecções, em Visual Basic 2010, com diversas demonstrações, explicando ainda os novos sintaxes.


Tags

Twitter Updates

Seguidores