domingo, 26 de fevereiro de 2012

Macetes com o ListBox no Access

Utilizando o ListBox num formulário Access, me deparei com alguns problemas e o primeiro deles, quase imperceptível: dependendo da quantidade de dados, o carregamento não é completo.
Por exemplo, carregar apenas uma coluna, o método "AddItem" do ListBox vai na boa, o detalhe é que se a quantidade de linhas é muito grande, as últimas não são carregadas!
Pior de tudo é que o Access nem dá mensagem de erro, simplesmente não carrega.
O número de linhas diminui a medida em que o número de colunas aumenta.

Em tempo, considerando uma quantidade muito grande de registros, talvez o ListBox não seja a melhor solução.
Tenho um aplicativo em que a quantidade de registros varia normalmene de 1 a 20, mas existem situações que podem ultrapassar a 3 mil. São exceções, mas podem ocorrer, por isso mantive a solução do ListBox.

Bem, continuando com a ajuda do amigo Gib@, mudei o carregamento do ListBox, apenas alterando a fonte de dados para uma tabela (sem carregamento por VBA).

Carregando uma grande quantidade de registros, o problema que surge é a navegação.
Pela barra de rolagem vertical, demora para se chegar até o último registro.
Um Requery aqui não funciona obviamente.

Após um tempinho tentando descobrir a causa dessa péssima navegabilidade, criei um "quebra-galho" mas que funciona: selecionar o último registro da lista e em seguida selecionar o primeiro.
Dessa forma, ao navegar pela barra de rolagem vertical todos os registros são exibidos mais rapidamente.

Essa questão na navegabilidade é mais facilmente verificada se montar ume exemplo, colocar aqui em palavras fica meio abstrato.

Uma outra forma de carregar o ListBox com uma quantiade grande de registros é clonar o RecordSet, veja exemplo mais abaixo.
Aí aparece outro problema: as colunas são colocadas em ordem alfabética.
Se o carregamento é por VBA, o ListBox.ColumnOrder não funciona,o que força a outro "quebra-galho": utilizar alias para as colunas no SQLÇ de forma que fiquem na ordem desejada e não colocar cabeçalhos de coluna no ListBox.
Para isso, basta utilizar Labels acima do ListBox, o resultado visual é bem melhor, visto que podemos trabalhar as propriedades de modo bem flexível.


Option Compare Database
Option Explicit

Private Sub carrega_lista()

Dim rst As New ADODB.Recordset
Dim ssql As String

Me.lst_teste.RowSource = ""

ssql = "SELECT cod as a_001, "
ssql = ssql & "Empresa as a_001,"
ssql = ssql & "Contato as a_002,"
ssql = ssql & "Cargo as a_003,"
ssql = ssql & "FROM fornecedores "

rst.Open ssql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
rst.MoveFirst

Set Me.lst_teste.Recordset = rst.Clone

Me.lst_teste.Selected(rst.RecordCount) = True
Me.lst_teste.Selected(1) = True

rst.Close
Set rst = Nothing

MsgBox "fim"

End Sub

;-)

sábado, 11 de fevereiro de 2012

Onde buscar informações e ajuda sobre o Access

Às vezes não é preciso ter um monte de links para buscar ajuda na programação do Access.
Minhas fontes de consultas são poucas, mas nesses sites quase sempre encontro o que preciso e sempre que possível, procuro ajudar também quem necessita.
Abaixo os links que estão sempre nos meus favoritos:

http://www.expertaccess.com.br/forumnew/default.asp
http://comunidade.itlab.com.br/eve
http://usandoaccess.com.br/index.htm
http://ativoaccess.com.br/
http://www.mvps.org/
http://www.accessfaq.com.br/webroot/

No mvps.org tem material para todos os aplicativos do pacote Office.

;-)

sexta-feira, 3 de fevereiro de 2012

Listar arquivos de uma pasta

Não me lembro se publiquei anteriormente outra planilha com a mesma função, mas eu precisei novamente e como o prompt do DOS é bloqueado no meu trabalho, escrevi este código.
Quem puder usar o prompt, basta dar um DIR c:\pasta *.* > lista.txt e depois editar o TXT.

;-)



Option Explicit
Dim caminho As String
Dim arquivo As String
Dim i As Integer


Private Sub cmd_lista_Click()
On Error GoTo erro

With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = Application.DefaultFilePath & "\"
.Title = "Selecione a pasta"
.Show
If .SelectedItems.Count = 0 Then
Exit Sub
Else
caminho = .SelectedItems(1)
End If
End With

Range("A:A").Clear
Range("A1").Value = "Lista dos arquivos"

arquivo = Dir(caminho & "\*.*")

i = 2
Do Until arquivo = ""
Cells(i, 1) = arquivo
i = i + 1
arquivo = Dir
Loop

Worksheets("Plan1").Columns("A:A").AutoFit

Range("A2").Select
ActiveWindow.FreezePanes = True

Exit Sub

erro:
MsgBox Err.Description, vbOKOnly
Exit Sub


End Sub

Pesquisar este blog

Arquivo do blog

Quem sou eu

Minha foto
Administrador de Empresas/Técnico em Processamento de Dados. Microsoft Office User Specialist - Excel Proficient. Pós-graduado em Business Intelligence.