Получите значение щелчка в списке и напишите в текстовое поле
Ваш ОП заявляет: «Как я могу отображать и одновременно изменять данные в моем TextBox когда я нажимаю на столбец внутри списка ? "
На самом деле ваш вопрос спрашивает, как получить индекс clicked column в списке.Используя вспомогательную функцию getColIndex()
, вы получаете эту важную информацию и легко получаете значение данных по щелчку через свойство list
для текущего индекса списка.
В приведенном ниже примере кода я использую событие listbox MouseUp
, чтобы [1] получить индекс столбца, по которому щелкнули мышью, через аргумент x
, показывающий положение в точках в списке на основе накопленного столбца.массив widths создается при загрузке данных в список и [2] для изменения текстового поля FbSNtxt
со значением данных по щелчку dListBox.List(Me.dListBox.ListIndex, ColIndex)
.
Усиление примечания к хитрому методу
Чтобы получить правильный индекс столбца через позицию списка x
, необходимо отобразить► вся ширина списка и завертывание его в Рамку прокрутки (см. список и настройки кадров в процедуре загрузки Dloadbtn_Click()
)
ДекларацияГлава UserForm
Option Explicit
Dim cumulWidths() As Double ' cumulated column widths
Dim ColIndex As Integer ' current column index
A.Решение с помощью события Listbox MouseUp
IMO Лучше всего использовать событие ► MouseUp
для получения горизонтальной позиции (в точках) внутри списка с помощью аргумента ist x
поскольку вы получаете фактический индекс только там (а не в событии MouseDown
).Кроме того, оно срабатывает в любом случае, тогда как событие click
только один раз в пределах одной строки.
Private Sub dListBox_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
' Purpose: find search value in first column and write it to corresponding row in range (column B)
' Escape if no data
If dListBox.ListIndex < 0 Then Exit Sub
' [1] get the column index via helper function getColIndex
ColIndex = getColIndex(X)
' [2] get clicked data in column ColIndex and write it into textbox (i.e. modify latest value)
FbSNtxt.Text = Me.dListBox.List(Me.dListBox.ListIndex, ColIndex)
End Sub
►Помощь для получения текущего индекса столбца
Private Function getColIndex(ByVal X) As Integer
' Purpose: get column number analyzing your click position x
' Method: uses array cumulWidths (created by Dloadbtn_Click() calling initCumulWidths)
' Note: called by dListBox_MouseUp event
Dim i As Integer
For i = 0 To UBound(cumulWidths)
If X < cumulWidths(i) Then
getColIndex = i ' return value (listbox index is zero based)
Exit For
End If
Next i
End Function
B.Улучшены процедуры поиска
Private Sub DSearchbtn_Click()
' Purpose: find search value in first column and write it to corresponding row in range (column B)
' Method: calls procedure dSearch
dSearch
End Sub
Private Sub dSearch()
' Purpose: find value in first column and write it to corresponding row in range (column B)
' Note: called a) by dListBox_DblClick or b) DSearchbtn_Click()
If Me.dListBox.ListCount = 0 Then Exit Sub
Dim i As Long, bFound As Boolean
'Dim Colodbs As Worksheet
'Set Colodbs = ThisWorkbook.Worksheets("Colodbs")
For i = 0 To Me.dListBox.ListCount - 1
If Me.dListBox.List(i, 0) = FbSNtxt.Text Then
' write to cell in found row (i+1, Column B)
Colodbs.Cells(i + 1, 2).Value = FbSNtxt.Text
' correct ListBox value in Column B
Me.dListBox.List(i, 1) = FbSNtxt.Text
bFound = True: Exit For
End If
Next i
If Not bFound Then
MsgBox FbSNtxt.Text & " ColIndex " & ColIndex & " not found.", vbInformation
End If
End Sub
C.Процедуры загрузки
Улучшен код CommandButton для ускорения процесса загрузки путем назначения диапазона в одном операторе и использования подпрограммы initCumulWidths .
Private Sub Dloadbtn_Click()
'Purpose: Load Diret Colo data into Direct Colo Listbox data grid.
Dim ws As Worksheet
Dim rng As Range
Dim hd As Range
Dim Myarray As Variant
'~~> Change your sheetname here
Set ws = ThisWorkbook.Worksheets("Colodbs")
'~~> Set yourrelevant range here
Set rng = ws.Range("A1:N10000")
With Me.dListBox
.Clear
.ColumnHeads = False
.ColumnCount = rng.Columns.Count
' -----------------------------------------------------
' Variant a): assign data to array and array to listbox
' -----------------------------------------------------
' Myarray = rng
' .List = Myarray
' -----------------------------------------------------
' Variant b): assign data in one step to listbox
' -----------------------------------------------------
.List = rng.Value2
'~~> Set the column widths of the column here.
.ColumnWidths = "50;70;30;50;30;120;120;30;150;30;50;50;70;200"
.TopIndex = 0
' =====================================================
' calls subprocedure to cumulate column widths
' -----------------------------------------------------
initCumulWidths
' set total width of listbox to max as it gets shown within a frame
.Width = cumulWidths(UBound(cumulWidths)) + 16
' set scroll width within frame
Frame1.ScrollWidth = .Width ' Frame1.InsideWidth * 4
End With
End Sub
►Процедура, вызванная выше. Событие CommandButton Click, чтобы получить кумулятивную ширину
Эта подпроцедура считывает ширину столбцов, описанную в Точках, и присваивает кумулятивные значения массиву, определенному взаголовок объявления модуля Userform.
Private Sub initCumulWidths()
' Purpose: calculate cumulated widths and assign values to common userform variable cumulWidths
' Method: splits ColumnWidths property of listbox and sums converted Point values
' Note: called by above Dloadbtn_Click() event
Dim a: a = Split(Me.dListBox.ColumnWidths, ";")
Dim previous As Double, i As Integer
ReDim cumulWidths(UBound(a))
For i = 0 To UBound(a)
cumulWidths(i) = val(Replace(a(i), " Pt", "")) + previous
previous = cumulWidths(i)
Next i
If UBound(a) > 0 Then
Debug.Print cumulWidths(UBound(a))
End If
End Sub
Дополнительное примечание
Поскольку вы не объявили Colodbs
в качестве рабочего листа в своих процедурах поиска, я предполагаю, что вы используетесвойство CodeName
вместо объекта.