Сохранить значения в выпадающем списке - PullRequest
1 голос
/ 18 января 2020

Я пытаюсь создать простую пользовательскую форму со значениями в выпадающем списке, а затем позволяет пользователю добавлять новые элементы и сохранять элементы (в том смысле, что значения, которые вы вводите значения в текстовое поле, и оба значения Combobox1 и Combobox2 обновляются и остается после закрытия и повторного открытия файла Excel). Вот мой код:

Private Sub ComboBox1_Change()
End Sub

Private Sub ComboBox2_Change()
End Sub

Private Sub CommandButton1_Click()
    Me.ComboBox2.AddItem Me.TextBox1.Value
    Me.ComboBox1.AddItem Me.TextBox1.Value
    Me.TextBox1.Value = ""
    MsgBox "Category added to combobox!!"
End Sub

Private Sub UserForm_Activate()
    Me.ComboBox1.AddItem "Chicken"

    Dim sh As Worksheet
    Dim i As Integer
End Sub

'Обновите список и сохраните файл excel

Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim strRowSource As String
Dim lReply As Long, lRows As Long
 If ComboBox1 <> vbNullString Then
 If ComboBox1.ListIndex < 0 Then
 lReply = MsgBox(ComboBox1 & _
 " is not part of the list. Add it", vbYesNo + vbQuestion)
 If lReply = vbYes Then
 With ComboBox1
 strRowSource = .RowSource
 lRows = Range(strRowSource).Rows.Count
 Range(strRowSource).Cells(lRows + 1, 1) = ComboBox1
 .RowSource = vbNullString
  .RowSource = Range(strRowSource).Resize(lRows + 1, 1).Address
 End With
 End If
 End If
 End If
End Sub

Ответы [ 2 ]

3 голосов
/ 18 января 2020

Предложение

  1. Как я уже говорил в комментариях выше, не используйте событие ComboBox1_Exit. Используйте событие UserForm_QueryClose. Таким образом, вам не нужно сохранять значения при каждом изменении. Сделайте это за один go перед выходом из пользовательской формы.
  2. Сохраните книгу, чтобы сохранить эти значения.
  3. Используйте текстовое поле и командную кнопку для принятия значений, добавляемых в комбинированный список.

Logi c

  1. В UserForm_Initialize событие, загрузите комбинированный список с рабочего листа.
  2. Позвольте пользователю ввести значение в текстовое поле. Используйте командную кнопку для сохранения в выпадающем списке
  3. Сохранить в листе в событии UserForm_QueryClose. Убедитесь, что вы очистили соответствующий столбец, прежде чем возвращать значения обратно в столбец.

enter image description here

Пример кода

Это то, что вы пытаетесь?

Option Explicit

Dim ws As Worksheet
Dim i As Long

'~~> Load values from the worksheet into the combobox
Private Sub UserForm_Initialize()
    '~~> Set this to the relevant sheet
    Set ws = Sheet1

    Dim lRow As Long

    With ws
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        For i = 1 To lRow
            If Len(Trim(.Range("A" & i).Value)) <> 0 Then
                ComboBox1.AddItem .Range("A" & i).Value
            End If
        Next i
    End With
End Sub

'~~> Add item to combobox from textbox
Private Sub CommandButton1_Click()
    If Len(Trim(TextBox1.Text)) <> 0 Then
        ComboBox1.AddItem TextBox1.Text
    Else
        MsgBox "Nothing to add"
    End If
End Sub

'~~> Save to worksheet
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    ws.Columns(1).ClearContents

    For i = 0 To ComboBox1.ListCount - 1
        ws.Cells(i + 1, 1).Value = ComboBox1.List(i)
    Next i

    ThisWorkbook.Save
    DoEvents
End Sub
1 голос
/ 18 января 2020

Это еще один метод, в предположении, что вы создаете лист на листе (или вы можете свободно использовать новый лист) и присваиваете имя новому листу с помощью ItemList, здесь вы устанавливаете A1 в качестве заголовка, например «Категория», и начинайте с A2 ниже - ваши списки предметов, здесь код:

Private Sub CommandButton1_Click()
    If TextBox1.Text = "" Then Exit Sub

    Dim myLastRow As Integer
    myLastRow = Range("ItemList!A:A").SpecialCells(XlCellType.xlCellTypeLastCell).Row

    'xlCellTypeLastCell is last cell that a range has data (not blank)
    'but if any delete data here, will apply after save the worksheet
    'For example if last is row 3 and col 1, and we delete row 2 and 3,
    'it will remain in row 3 and col 1, until we save or exit the worksheet

    If myLastRow = 0 Then
       ComboBox1.AddItem TextBox1.Text
       'If lastrow is zero, because we will assign range A2 as begin 
       'row of data, so ItemList!A2 will be assigned with TextBox1.text
       'but may be this will not happen, although no Data and A1 is blank
       'it will return 1
       Range("ItemList!A2").Value = TextBox1.Text
       Exit Sub
    End If
    Dim myRange As Range
    'Here we check textbox1.text have been stored or not
    'if not the range is nothing and we add item to combobox
    'add category list in ItemList at row myLastRow + 1
    'myLastRow is the lastRow after last save
    Set myRange = Range("ItemList!A2:A" & myLastRow).Find(TextBox1.Text)
    If myRange Is Nothing Then
        ComboBox1.AddItem TextBox1.Text
        Range("ItemList!A" & myLastRow + 1).Value = TextBox1.Text
        TextBox1.Text = ""
        MsgBox "Category Added To ComboBox"
    End If

End Sub

Private Sub UserForm_Activate()
    ComboBox1.List = Range("ItemList!A2:A" & Range("ItemList!A:A").SpecialCells(XlCellType.xlCellTypeLastCell).Row).Value
End Sub

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...