Tag Archives: ListBox

VBA – Transferindo os dados de um ListBox para uma Planilha

Por falta de muitos controles no VBA, o ListBox é quase uma unanimidade para fazer a apresentação dos dados de forma tabular. Ele funciona bem, permite adicionar múltiplas colunas, adicionar valores de cabeçalho, mudar o formato da seleção, enfim.

O fato é que, códigos de exemplo para alimentar um listBox com os dados de uma planilha há de monte, mas o contrário nem tanto. Bom, atendendo a pedidos, coloco aqui uma alternativa de código que faz exatamente o trabalho de copiar os dados de um ListBox para uma planilha.

Para não começar totalmente do zero, tomei como base o arquivo do site Ozgrid, disponível neste link:

http://www.ozgrid.com/FreeDownloads/ListBoxTransfer.zip

O código está bem bacana, porém, muito amarrado a planilha que foi produzida, sendo totalmente dependente da sua implementação. Abaixo segue o código com algumas mudanças de tal forma que, possa ser facilmente adaptado para qualquer planilha:

Sub Copiar_ListBox_Para_Planilha(ByVal NomePlanilhaDestino As String, ByRef listBoxControl As MSForms.ListBox)
    Dim iListCount As Integer, iColCount As Integer, iColListCount As Integer
    Dim iRow As Integer
    Dim linhaInicial As Integer
    Dim planilhaDestino As Worksheet
 
    Set planilhaDestino = ThisWorkbook.Worksheets(NomePlanilhaDestino)
    linhaInicial = planilhaDestino.Cells(65536, 2).End(xlUp).Row + 1
 
    If listBoxControl.RowSource <> "" Then
        iColListCount = Range(listBoxControl.RowSource).Columns.Count
    Else
        iColListCount = listBoxControl.ColumnCount - 1
    End If
 
    If listBoxControl.ColumnHeads Then
        iRow = 1
    End If
 
    'faz o loop para todos os itens do ListBox
    For iListCount = 0 To listBoxControl.ListCount - 1
        If listBoxControl.Selected(iListCount) = True Then  'testa se o item está selecionado
            listBoxControl.Selected(iListCount) = False
            iRow = iRow + 1
            'faz o loop pelas colunas
            For iColCount = 0 To iColListCount - 1
                'copia os dados do controle para a planilha
                planilhaDestino.Cells(iRow, iColCount + 1).Value = listBoxControl.List(iListCount, iColCount)
            Next iColCount
        End If
    Next iListCount
 
End Sub

Para fazer a chamada a esse método na mesma planilha disponibilizada, bastaria colocar o seguinte código:

Call Copiar_ListBox_Para_Planilha("Data Transfer Sheet", Me.ListBox1)

Ou seja, ele permite você definir o nome da planilha para qual será copiado o conteúdo e qual o controle ListBox será a fonte dos dados. O código faz várias considerações, prevendo que seus dados sejam baseados em adição manual ou através de RowSource. Copie o código abaixo e faça o teste em um ListBox existente!

Bom proveito!

VBA – Filtrar dados no ListBox (Tela de Pesquisa) – Parte 2

Há algum tempo, publiquei um exemplo de código VBA que permitia efetuar um filtro em uma lista de itens em um ListBox (UserForm), mas especificamente neste link:

https://www.tomasvasquez.com.br/blog/microsoft-office/vba-como-filtrar-dados-no-listbox

Bom, nas discussões no nosso fórum, acabamos por aperfeiçoar o código para algo mais abrangente. A boa notícia é que o código continua bem genérico, pode ser facilmente acoplado em qualquer planilha. A notícia ótima é que os critérios de filtro ficaram bem mais completos.

O código agora permite selecionar o campo no qual será aplicado o filtro, o valor do filtro e mostra todos as colunas da tabela. Abaixo segue como ficou a aparência do formulário:

O código VBA

Entrando um pouco em detalhes a respeito do funcionamento do código e como adaptá-lo a sua planilha, seguem algumas considerações.

Variáveis

Private Const NomePlanilha As String = “Fornecedores”
Private Const LinhaCabecalho As Integer = 1

NomePlanilha contempla o nome da planilha ao qual será aplicado o filtro. Altere para o nome da sua planilha.

LinhaCabecalho representa qual a linha da sua planilha contém o cabeçalho da tabela. É nele que se baseiam todos as outras funções.

Funções

PreencheCampos – Preenche o ComboBox com o nome dos cabeçalhos

PreencheCabecalho – Função auxiliar para colocar no ListBox de resultado o cabeçalho dos valores

PreencheLista – Preenche o ListBox de resultado considerando os valores de filtro

Download da planilha

Filtra_ListBox_VBA_Custom.zip

Bom proveito!

VBA – Como Filtrar dados no ListBox

VBA - Como Filtrar dados no ListBox

Este é um código de exemplo que tenho a muito tempo, mas como o pessoal tem pedido muito, vou deixá-lo em uma forma mais visível.

Como o VBA carece de controles de apresentação de dados mais avançados, como Grids e Listas complexas, acabamos apelando para o controle ListBox para apresentação de dados vindos de ResultSets (particularmente, prefiro apresentar os dados em uma planilha). Bom, como os dados já estão na LisBox, porque não aplicar o filtro nele mesmo?

Para ver um exemplo, proceda da seguinte forma:

  • Em um novo arquivo, crie uma lista de dados na Plan1, na coluna A a partir da célula A1
  • Abra o VBA (Alt+F11)
  • Adicione um UserForm ao projeto
  • No UserForm, adicione um controle TextBox e um ListBox (mantenha os nomes padrão dos controles)
  • Cliquem em F7 para exibir o código e adicione o seguinte:
  • Option Explicit
    'Autor: Tomás Vásquez.
    '       www.tomasvasquez.com.br/blog
    '       www.tomasvasquez.com.br/forum
    '       www.tomasvasquez.com.br/cursocsharp
    'Data:  15 de Janeiro de 2007.
    'Versão: 1.00 - Em VBA Microsoft Excel 2003 e 2007
    Private TextoDigitado As String
     
    Private Sub TextBox1_Change()
        TextoDigitado = TextBox1.Text
        Call PreencheLista
    End Sub
     
    Private Sub UserForm_Initialize()
        Call PreencheLista
    End Sub
     
    Private Sub PreencheLista()
        Dim ws As Worksheet
        Dim i As Integer
        Dim TextoCelula As String
        Set ws = ThisWorkbook.Worksheets(1)
        i = 1
        ListBox1.Clear
        With ws
            While .Cells(i, 1).Value &lt;&gt; Empty
                TextoCelula = .Cells(i, 1).Value
                If UCase(Left(TextoCelula, Len(TextoDigitado))) = UCase(TextoDigitado) Then
                    ListBox1.AddItem .Cells(i, 1)
                End If
                i = i + 1
            Wend
        End With
    End Sub

Execute o UserForm e digite valores válidos de filtro no TextBox e veja o efeito.

Trocando em miúdos, primeiro o UserForm carrega os dados da Plan1 no ListBox. Depois, o evento TextChange é mapeado para que toda digitação provoque a refiltragem dos dados. A forma de comparação é simples, mas poderia ter sido feita também com o operador Like.

Download do arquivo

http://www.tomasvasquez.com.br/forum/download/file.php?id=2142

ASP.NET – Ordenando o controle Lisbox

Funções utilitárias sempre quebram um bom galho. Sem muito rodeio, o código abaixo efetua a ordenação dos itens de um controle ASP.NET ListBox:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/// <summary>
/// Ordena um listbox em ordem Ascendente
/// </summary>
/// <param name="ListBox">O controle ListBox a ser ordenado</param>
/// <param name="ByValue">True se a ordenação deve ser feita pelo Valor(Value)
/// ou False para orndenar pelo Texto (Text)</param> 
public static void sortListBox(ref ListBox ListBox, bool ByValue)
{
	SortedList ListItems = new SortedList();
 
	// adicionar os items do ListBox ao SortedList 
	foreach (ListItem Item in ListBox.Items)
	{
		if (ByValue) ListItems.Add(Item.Value, Item);
		else ListItems.Add(Item.Text, Item);
	}
 
	// limpa o controle
	ListBox.Items.Clear();
 
	// adicionar o itens ordenados
	for (int i = 0; i < ListItems.Count; i++)
	{
		ListBox.Items.Add((ListItem)ListItems[ListItems.GetKey(i)]);
	}
}

Como menciona o comentário, o segundo parâmetro define se os itens serão ordenados pela propriedade Value ou Text. Dei uma “brasileirada” no código. A referência original pode ser vista neste link:

http://forums.asp.net/p/1202130/2094935.aspx

Bom proveito!