VBA - Um controle listbox transparente

Novembro 2016

Quando vemos as propriedades das listbox, vemos que a propriedade BackStyle não existe. Mas essa propriedade é, por exemplo, disponível para controles de marca, caixa de texto, etc. Ela nos permite, definindo a fmBackStyleTransparent, de tornar o nosso controle transparente.

Mas eu gosto da minha imagem de fundo e gostaria que ele aparecesse no final da minha lista. Então, vamos "trapacear" usando uma caixa de texto em vez da caixa de listagem (listbox).


I - Pré-requisitos:

  • Em primeiro lugar, vamos desenhar um UserForm (formulário de usuário) onde aplicaremos (graças à sua propriedade Picture) uma imagem de fundo.
  • Vamos desenhar, neste userform, um contrôle de caixa de texto

II - Dica:


Ela consiste em usar as propriedades MultiLine, BackStyle e ScrollBars das caixas de texto para dar-lhe a aparência de uma caixa de listagem. No "carregamento" de dados, basta delimitar cada linha com um caractere invisível (aqui: Chr (1)) para que possam ser selecionados. Para usar esses dados, basta percorrer todos os caracteres desta seleção.

III - Os códigos:

Na inicialização do UserForm:


Option Explicit

Private Sub UserForm_Initialize()
Dim i As Integer, texto As String

For i = 1 To 100
  'Preenche-se o texto que vai aparecer na caixa de texto como uma lista,
  com, à cada começo de linha invisível Chr(1)
  If i = 1 Then texto = Chr(1) & "Valor da lista 1" Else texto = texto & Chr(10) & Chr(1) & "Valor da lista " & i
Next i
With TextBox1
    .BackStyle = fmBackStyleTransparent
    .MultiLine = True
    .ScrollBars = fmScrollBarsVertical
    .Move 5, 5, Me.Width - 16, Me.Height - 40
    Adiciona-se, no fim da última linha, mais um caractere invisível para delimitar a última linha
    .Text = texto & Chr(1)
   `Se você quiser que, no início, a linha selecionada seja a primeira, desmarque as próximas duas linhas de código:
    '.SetFocus
    '.CurLine = 0
End With
End Sub

Durante o evento MouseDown da Caixa de Texto:


Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim debSel As Long, finSel As Long, texto As String, txtSel As String, i As Integer

'Os caracteres Chr(10) (pulos de linha) usados durante o preenchimento 
'da caixa de texto contam como um caractere.
'Consequentemente, não devemos leva rem conta este procedimento
'Assim sendo, os excluimos da nossa variável
texto = Replace(TextBox1.Text, Chr(10), "")
'nous posicionamos onde o usuário clicar
debSel = TextBox1.SelStart
finSel = TextBox1.SelStart
'As linhas começam sistematicamente pelo caractere : "Chr(1)", então, vamos procurá-lo:
' 1- Recuando => vai nos dar a posição do primeiro caractere da linha
Do While Mid(texto, debSel, 1) <> Chr(1)
  debSel = debSel - 1
Loop
' 2- Avançando => vai nos dar a posição do primeiro caractere da linha seguinte
If Mid(texto, finSel, 1) = Chr(1) Then finSel = finSel + 1
Do While Mid(texto, finSel, 1) <> Chr(1)
  finSel = finSel + 1
Loop
'Loop para armazenar em uma variável o conteúdo selecionado
For i = debSel + 1 To finSel - 1
  txtSel = txtSel & Mid(texto, i, 1)
Next i
'Posicionamento do cursor no começo da linha
TextBox1.SelStart = debSel
'Seleção da linha
TextBox1.SelLength = finSel - debSel - 1
'Envio do valor selecionado para uma célula da planilha
Sheets("Plan1").Range("A1") = Trim(txtSel)
End Sub

IV - Complemento:


Para facilitar o manuseio, também podemos colocar no userform uma caixa de listagem real que tornaremos invisível (ListBox1.Visible = False). Isso permitirá mais flexibilidade, usufruindo de todas as propriedades da listbox. Você só precisará usar a listbox para o processamento de dados e a caixa de texto para a exibição.

V - Download:


Link para o arquivo de exemplo (em francês).

Tradução feita por Lucia Maurity y Nouira

Veja também :
Este documento, intitulado « VBA - Um controle listbox transparente »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.