VBA UserForm ListBox и запись в таблицу данных - PullRequest
0 голосов
/ 07 апреля 2020

Я создаю пользовательскую форму для инвентаря, который физически считает инвентарь для целей аудита. Текущий процесс на бумаге - я бы хотел поместить его на планшет.

Цель:

1) В форме отображается одна строка с указанием местоположения, продукта, количества и описания. 2) Если количество верное, пользователь нажимает «правильно» и появляется следующий пункт. 3) Если количество неверное, пользователь вводит наблюдаемое количество, которое записывается в столбец J соответствующей таблицы данных. 4) Параметр прокрутки. go вперед и назад, если пользователь хочет проверить / переработать элемент

Data Table Current Form

    Private Sub CommandButton1_Click()

'GET DATA FROM TABLE

ListBox1.ColumnCount = 4
ListBox1.RowSource = "A2:D500"

End Sub

'IF QTY IS CORRECT, NEXT ROW

Private Sub CommandButton_QtyCorrect_Click()

    Call SpinButton1_SpinUp

End Sub

'IF QTY DOESN'T MATCH, USER KEYS CORRECT

Private Sub CommandButton2_Click()

Range("K1") = TextBox2_Qty.Value
TextBox2_Qty.Value = ""

End Sub

Private Sub ListBox1_Click()
'DISPLAY DATA TABLE
End Sub


Private Sub SpinButton1_SpinDown()
    If ListBox1.ListIndex > 0 Then
        ListBox1.Selected(ListBox1.ListIndex - 1) = True
    End If
End Sub

Private Sub SpinButton1_SpinUp()
    If ListBox1.ListIndex + 1 < ListBox1.ListCount Then
        ListBox1.Selected(ListBox1.ListIndex + 1) = True
    End If
End Sub



Private Sub TextBox2_Qty_Change()
'USER OVERWRITE

End Sub

Вопросы:

1) При текущей настройке все строки заполняют ListBox. Как получить одну строку за раз для отображения?

2) Когда текущая строка отображается в ListBox, как мне записать соответствующую строку в столбце J в случае несоответствия?

Ответы

1) Решено Ральфом С. ниже.

2) Решение:

Private Sub AdjustButton_Click()

'IF QTY DOESN'T MATCH, USER KEYS CORRECT

Range("J" & SpinButton1.Value) = TextBox2_Qty.Value

TextBox2_Qty.Value = ""

End Sub

1 Ответ

1 голос
/ 08 апреля 2020

следующий код будет моим анзацем:

Private UserForm1_Activate()
    ListBox1.ColumnCount = 4
    ListBox1.RowSource = "A2:D2"  ' show only first row 

    SpinButton1.Min = 2
    SpinButton1.Max = Range("A1048576").end(xlUp).row  ' last row as maximum value of spin button
End Sub

Private Sub CommandButton_QtyCorrect_Click()
    If SpinButton1.Value < SpinButton1.Max Then _
            SpinButton1.Value = SpinButton1.Value + 1
End Sub

Private Sub CommandButton2_Click()
    Range("K1") = TextBox2_Qty.Value 
    TextBox2_Qty.Value = ""
End Sub

Private Sub SpinButton1_Change()
    ListBox1.RowSource = "A" & SpinButton1.Value & ":D" & SpinButton1.Value
End Sub

Таким образом, вы можете использовать значение кнопки прокрутки в качестве индекса строки для вашего списка. Это показывает только одну строку за раз, и это может помочь вам сейчас. Но потенциал оптимизации еще велик ...

...