Как совместить список Excel в качестве сетки данных, используя кнопку поиска и показанную в текстовом поле? - PullRequest
0 голосов
/ 06 июня 2018

У меня есть этот код, чтобы показать все мои данные на листах и ​​загрузить их в список.Как я могу отображать и одновременно изменять данные в своем текстовом поле, когда я щелкаю столбец внутри списка?

Private Sub Dloadbtn_Click()

'Load Diret Colo data into Direct Colo Listbox data grid.

Dim ws As Worksheet
Dim rng As Range
Dim hd As Range
Dim i As Long, j As Long, rw As Long
Dim Myarray() As String

'~~> Change your sheetname here
Set ws = Sheets("Colodbs")

'~~> Set you relevant range here
Set rng = ws.Range("A1:N10000")

With Me.Dlistbox
    .Clear
    .ColumnHeads = False
    .ColumnCount = rng.Columns.count

    ReDim Myarray(rng.Rows.count, rng.Columns.count)

    rw = 0

    For i = 1 To rng.Rows.count
        For j = 0 To rng.Columns.count
            Myarray(rw, j) = rng.Cells(i, j + 1)
        Next
        rw = rw + 1
    Next

    .List = Myarray

    '~~> Set the widths of the column here. Ex: For 5 Columns
    '~~> Change as Applicable
    .ColumnWidths = "50;70;30;50;30;120;120;30;150;30;50;50;70;200"
    .TopIndex = 0
End With
End Sub

Private Sub DSearchbtn_Click()

Dim i As Long
Dim rno As Integer
i = 0

Do While Colodbs.Cells(i + 1, 1).Value <> ""

        If Colodbs.Cells(i + 1, 1).Value = FbSNtxt.Text Then

            rno = Colodbs.Cells(i + 1, 1).Row
            GoTo Condition
        Else
        rno = 0

        End If
    i = i + 1
Loop

Condition:
If rno <> 0 Then
    Colodbs.Cells(rno, 2).Value = FbSNtxt.Text
Else
    MsgBox ("No Such number is found")
End If
End Sub

1 Ответ

0 голосов
/ 06 июня 2018

Получите значение щелчка в списке и напишите в текстовое поле

Ваш ОП заявляет: «Как я могу отображать и одновременно изменять данные в моем 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 вместо объекта.

...