Arquivo da tag: Array

VBA – Preenchendo um listbox com mais de 10 colunas

Eis um tópico polêmico, como não poderia deixar de ser. E tem motivação melhor para gerar um artigo? Claro que não! Então vamos em frente!

Muitos que começam a explorar um pouco mais o uso do ListBox em seus formulários VBA percebe que ele tem muito mais a oferecer do que uma simples lista de dados. Pessoalmente, no VBA, eu uso ele como controle oficial até mesmo para grids. Os motivos eu explico outra hora.

Voltando ao assunto do título, muitos culpam o ListBox por ser um controle incompleto por ele não permitir adicionar mais de 10 colunas nele. Isso é verdade, mas também não é. Existe sim essa limitação, mas ela está atrelada ao como você coloca os dados no Listbox. Como tudo no mundo da programação, o melhor jeito de demonstrar isso é por um exemplo. Pois bem, considere a seguinte planilha:

VBA - Preenchendo um listbox com mais de 10 colunas

Aqui temos 10 colunas e algumas linhas. Sem enrolação, crie um userform, adicione um listbox nele (com uma largura suficiente para ver as colunas) e coloque o seguinte código:

Private Sub UserForm_Initialize()
    With Planilha1
        Me.ListBox1.ColumnCount = .UsedRange.Columns.Count
        For linha = 1 To .UsedRange.Rows.Count
            ListBox1.AddItem ""
            For coluna = 1 To .UsedRange.Columns.Count
                ListBox1.List(linha - 1, coluna - 1) = .Cells(linha, coluna)
            Next coluna
        Next linha
    End With
End Sub

Onde Planilha1 é o nome do objeto da sua planilha. Sem ir muito a fundo no código, ele faz dois laços For, um para as linhas da planilha e um para as colunas. A propriedade UsedRange define a área usada da planilha, ou seja, vai funcionar bem para planilha que só contenha dados como o exemplo.

Se rodar o codigo, o resultado será isso:

VBA - Preenchendo um listbox com mais de 10 colunas 2

O listbox funcionando. Lindo! Agora, vamos ao problema. Se adicionarmos mais uma coluna na nossa planlha, como mostra abaixo:

VBA - Preenchendo um listbox com mais de 10 colunas 3

Receberemos o seguinte erro:

VBA - Preenchendo um listbox com mais de 10 colunas 4

Se usado dessa forma, ou seja, adicionar itens através do método AddItem, o Listbox se limitará a no máximo 10 colunas.

Existem duas formas de contornar isso:

  1. Usar a propriedade RowSource (fuja!)
  2. Usar arrays (eba!)

Obviamente, vamos para a segunda. Sem alterar a planilha, altere o código do formulário para o seguinte:

Private Sub UserForm_Initialize()
    Dim arrayItems()
    With Planilha1
        ReDim arrayItems(1 To .UsedRange.Rows.Count, 1 To .UsedRange.Columns.Count)
        Me.ListBox1.ColumnCount = .UsedRange.Columns.Count
        For linha = 1 To .UsedRange.Rows.Count
            Me.ListBox1.AddItem
            For coluna = 1 To .UsedRange.Columns.Count
                arrayItems(linha, coluna) = .Cells(linha, coluna).Value
            Next coluna
        Next linha
        
        Me.ListBox1.List = arrayItems()
    End With
End Sub

Execute o formulário novamente e….

VBA - Preenchendo um listbox com mais de 10 colunas 5
Voilá! Um ListBox com mais de 10 colunas!

O que aconteceu? Ao invés de jogar os dados direto no listbox, alimento um array com os dados e depois jogo os dados no Listbox através da propriedade List. O ListBox é esperto para entender um Array, o que não é o caso do AddItem.  O Array, obviamente, tem as dimensões da área ocupada na planilha (mais uma vez , o UserRange é utilizado aqui).

É isso. Bom proveito!

Download do arquivo:

VBA – Preenchendo um listbox com mais de 10 colunas.zip (265.24 KiB)

VBA – Ordenando Arrays Multi Dimensionais

Mais uma do fórum, dessa vez, da autoria do colega André.

O código abaixo faz a ordenação de um array multidimensional, incrementando um exemplo já colocado aqui no blog que fazia o trabalho, mas somente com em arrays com uma dimensão. Bom, o código e seus comentários falam por si:

'@Sort ArrayMulti
'@Data: 04/08/2010
'@Autor: André Tonini
'   Esta função ordena um array multidimensional
'   Parametros
'       @TheArray - Array - Array que será ordenado
'       @Column - Integer - Por qual coluna o array será ordenado
'       @ColumnCount - Integer - O número de colunas do array
 
Public Function SortArrayMulti(ByRef TheArray As Variant, _
                                    Column, _
                                    ColumnCount)
    'Variaveis
    '----------
    Dim temp()
    Dim x, i, y As Integer
    Dim sorted As Boolean
 
    'Dimensões do array
    '------------------
    ReDim Preserve temp(1 To UBound(TheArray, Column), 1 To ColumnCount)
 
 
    'Repetição para ordenar até o final do array
    '--------------------------------------------
    Do While Not sorted
 
        'No inicio ele está ordenado
        '--------------------------
        sorted = True
 
        'Laço que percorre as linhas
        '----------------------------
        For x = linhaCabecalho + 1 To UBound(TheArray, Column) - 1
 
            'Faz a comparação
            '----------------
            If (TheArray(x, Column) > TheArray(x + 1, Column) And TheArray(x + 1, Column) <> Empty) Then
 
                'Ando por todas as colunas
                '-------------------------
                For y = 1 To ColumnCount
                    temp(x, y) = TheArray(x + 1, y)
                Next y
 
                'Ando por todas as colunas
                '-------------------------
                For y = 1 To ColumnCount
                    TheArray(x + 1, y) = TheArray(x, y)
                Next y
 
                'Ando por todas as colunas
                '-------------------------
                For y = 1 To ColumnCount
                    TheArray(x, y) = temp(x, y)
                Next y
 
                'Passou pelo if, então não está ordenado
                '---------------------------------------
                sorted = False
 
            End If
        Next x
    Loop
 
End Function

Valeu André!

ASP.NET – Preenchendo o controle Repeater com um Array de String

O controle Repeater tem um único defeito, que é também sua maior virtude. Peca pela simplicidade.

Entre algumas coisas que precisei fazer recentemente, uma era colocar os itens de um Array em uma página ASP.NET. Querendo fugir do Response.Write e da concatenação de itens dentro de um laço de repetição, decidi usar o bom e velho Repeater. O problema é que, após definir o DataSource do dito como sendo o Array de Strings, não há como informar o “Value” ou “Text” de um Array para o Eval() ou Bind(). Solução: Basta mencionar o Container.DataItem no código aspx que o Repeater se encarrega de efetuar o “Bind” com o Array:

1
2
3
4
5
6
7
8
9
10
11
12
13
	<asp:Repeater ID="RepeaterArray" runat="server">
	    <HeaderTemplate>
	    	 <ul>
	    </HeaderTemplate>
	    <ItemTemplate>
		<li>
		        <%# Container.DataItem %>
		</li>
	    </ItemTemplate>
	    <FooterTemplate>
                </ul>
	    </FooterTemplate>
	</asp:Repeater>
1
2
3
4
5
6
7
8
9
string[] meuArray = new string[] {
        "item 1",
        "item 2",
        "item 3",
        "item 4",
        "item 5" };
 
RepeaterArray.DataSource = meuArray;
RepeaterArray.DataBind();

Mais simples impossível. Bom proveito!

C# – Convertendo um Array de String em um List

Dica bacana do site DotNetSpider, segue um trecho de código que efetua a conversão de um array de strings em um List<string>:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
string[] mylist = new string[5]; // cria o array de strings;
 
// preenche com alguns valores
mylist[0] = "Olá";
mylist[1] = "como";
mylist[2] = "vai";
mylist[3] = "você";
mylist[4] = "?";
 
// criar uma lista tipada de strings (List),
// passando o tamanho do array de strings por parâmetro
List StringtoList = new List(mylist.Length);
 
// chama-se o método AddRange que aceita arrays convencionais
// como parâmetro para adicionar os itens do array no List
// e para efetuar a "conversão"
StringtoList.AddRange(mylist);

Os comentários são bem elucidativos para o entendimento do código. Como muitos métodos nativos do framework que retornar arrays de string, só para lembrar, Enum.GetNames e Directory.GetFiles, é útil em várias situações.

Bom proveito!