2017-02-17 3 views
0

Когда я пытаюсь редактировать детали существующего элемента, мой код не может заполнить соответствующую информацию для двух последних элементов в списке. Для выбора редактируемого элемента есть поле со списком, затем текстовое поле для идентификатора элемента, а также текстовое поле для дат, в которые был заказан товар, и когда он был отправлен, а затем еще два со списками для выбора статуса доставки и интернет-магазина он был куплен. Эти поля автоматически заполняются соответствующей информацией для выбранного элемента. Детали, соответствующие выбранному элементу, можно редактировать, за исключением самого имени элемента и идентификатора элемента. Он работает для каждого предмета ЗА ИСКЛЮЧЕНИЕМ последних 2 пунктов, и я понятия не имею, почему. Вот код для редактирования существующего элемента:Как заполнить ComboBox с существующим массивом

Option Explicit 


Private Sub cboOrderedFrom2_Change() 

    cboOrderedFrom2.BackColor = vbWhite 
    lblOrderedFrom2.ForeColor = vbBlack 

End Sub 

Private Sub cboOrderStatus2_Change() 

    cboOrderedFrom2.BackColor = vbWhite 
    lblOrderStatus2.ForeColor = vbBlack 

End Sub 

Private Sub cboRemoveOrEditItemDetails_Change() 

    cboRemoveOrEditItemDetails.BackColor = vbWhite 
    lblItemDescription2.ForeColor = vbBlack 

    Dim ws As Worksheet, i As Integer, wsLR As Variant 

    Set ws = ThisWorkbook.Sheets("Sheet1") 

    wsLR = ws.Cells(Rows.Count, 1).End(xlUp).Rows 

    For i = 3 To wsLR 

     If ws.Cells(i, 2) = Me.cboRemoveOrEditItemDetails Then 
      Me.txtItemID.Value = ws.Cells(i, "A") 
      Me.txtPiecesIncluded2.Value = ws.Cells(i, "C") 
      Me.txtOrderDate2.Value = ws.Cells(i, "E") 
      Me.cboOrderStatus2.Value = ws.Cells(i, "G") 
      Me.txtQuantityOrdered2.Value = ws.Cells(i, "D") 
      Me.txtDateShipped2.Value = ws.Cells(i, "F") 
      Me.cboOrderedFrom2.Value = ws.Cells(i, "H") 
      Exit Sub 
     End If 
    Next i 

End Sub 

Private Sub cmdAddStore_Click() 

    frmAddStore.Show 

End Sub 

Private Sub cmdCancelEditOrRemoveItemDetails_Click() 

    Unload Me 

End Sub 

'Private Sub cmdRemoveItemDetails_Click() 

    'Dim ws As Worksheet, i As Integer, wsLR As Variant 

    'Set ws = ThisWorkbook.Sheets("Sheet1") 

    'wsLR = ws.Cells(Rows.Count, 1).End(xlUp).Rows 

    'For i = 3 To wsLR 

     'If ws.Cells(i, 2) = Me.cboRemoveOrEditItemDetails Then 
      'Rows(i).EntireRow.Delete 
      'Sheet1.Activate 
      'Range("A1").End(xlDown).Offset(1, 0).Select 
      'ActiveCell.Value = ActiveCell.Offset(-1, 0).Value + 1 
      'Unload Me 
     'End If 

    'Next i 

'End Sub 

Private Sub cmdSubmitEditItemDetails_Click() 

    If txtPiecesIncluded2.BackColor = vbRed Then 
     Exit Sub 
    End If 

    If txtQuantityOrdered2.BackColor = vbRed Then 
     Exit Sub 
    End If 

    If cboOrderStatus2.BackColor = vbRed Then 
     Exit Sub 
    End If 

    If cboOrderedFrom2.BackColor = vbRed Then 
     Exit Sub 
    End If 

    If cboRemoveOrEditItemDetails.Value = "" Then 
     cboRemoveOrEditItemDetails.BackColor = vbRed 
     lblItemDescription2.ForeColor = vbRed 
     Exit Sub 
    End If 

    If cboRemoveOrEditItemDetails.BackColor = vbRed Then 
     Exit Sub 
    End If 

    Dim ws As Worksheet, i As Integer, wsLR As Variant 

    Set ws = ThisWorkbook.Sheets("Sheet1") 

    wsLR = ws.Cells(Rows.Count, 1).End(xlUp).Rows 

    For i = 3 To wsLR 

     If ws.Cells(i, "B") = Me.cboRemoveOrEditItemDetails Then 
      ws.Cells(i, "A") = Me.txtItemID.Value 
      ws.Cells(i, "C") = Me.txtPiecesIncluded2.Value 
      ws.Cells(i, "E") = Me.txtOrderDate2.Value 
      ws.Cells(i, "G") = Me.cboOrderStatus2.Value 
      ws.Cells(i, "D") = Me.txtQuantityOrdered2.Value 
      ws.Cells(i, "F") = Me.txtDateShipped2.Value 
      ws.Cells(i, "H") = Me.cboOrderedFrom2.Value 
      Unload Me 
      Exit Sub 
     End If 
    Next i 

End Sub 

Private Sub spnPiecesIncluded2_Change() 

    txtPiecesIncluded2.Value = spnPiecesIncluded2.Value 

End Sub 

Private Sub spnQuantityOrdered2_Change() 

    txtQuantityOrdered2.Value = spnQuantityOrdered2.Value 

End Sub 



Private Sub txtPiecesIncluded2_Change() 

    If IsNumeric(txtPiecesIncluded2.Value) And txtPiecesIncluded2.Value >= spnPiecesIncluded2.Min And _ 
    txtPiecesIncluded2.Value <= spnPiecesIncluded2.Max Then 
     spnPiecesIncluded2.Value = txtPiecesIncluded2.Value 
     txtPiecesIncluded2.BackColor = vbWhite 
     lblPiecesIncluded2.ForeColor = vbBlack 
    Else 
     txtPiecesIncluded2.BackColor = vbRed 
     lblPiecesIncluded2.ForeColor = vbRed 
    End If 
End Sub 

Private Sub txtQuantityOrdered2_Change() 

    If IsNumeric(txtQuantityOrdered2.Value) And txtQuantityOrdered2.Value >= spnQuantityOrdered2.Min And _ 
    txtQuantityOrdered2.Value <= spnQuantityOrdered2.Max Then 
     spnQuantityOrdered2.Value = txtQuantityOrdered2.Value 
     txtQuantityOrdered2.BackColor = vbWhite 
     lblQuantityOrdered2.ForeColor = vbBlack 
    Else 
     txtQuantityOrdered2.BackColor = vbRed 
     lblQuantityOrdered2.ForeColor = vbRed 
    End If 
End Sub 

Private Sub UserForm_Click() 

End Sub 
+0

Отредактируйте сообщение, чтобы включить код для модуля, в котором вы также создаете массив. Кто-то может захотеть увидеть, как он формирует ваш массив. – cheshire

ответ

2

Наполнение ComboxBox является довольно прямо вперед. Свойство .List может принимать массив или вы можете добавлять элементы отдельно с помощью метода .AddItem.

Я замечаю из вашего кода, что вы читаете каждую ячейку за раз в своем массиве. Знаете ли вы, что все это можно сделать за один раз? Допустим, что ваш код, чтобы определить нужный диапазон выглядит примерно так:

Dim lastRow As Long, lastCol As Long 
Dim readRange As Range 

'Define the range to be read 
With Sheet1 
    lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 
    lastCol = .Cells(2, .Columns.Count).End(xlToLeft).Column 
    Set readRange = .Range(.Cells(3, "A"), .Cells(lastRow, lastCol)) 
End With 

Тогда код, чтобы заполнить ваш массив, может быть просто одна строка:

Dim data As Variant 

'Read range to array 
data = readRange.Value2 

То же самое относится и к написанию массива Worksheet:

Dim writeRange As Range 

'Write the data 
Set writeRange = Sheet2.Range("A1").Resize(UBound(data, 1), UBound(data, 2)) 
writeRange.Value = data 

Ниже приведены три примера заполнения вашего ComboBox со всеми или частью массива:

'Populate the combobox 
UserForm1.ComboBox1.List = data 

'Or, if you want more than one column in combobox 
With UserForm1.ComboBox2 
    .ColumnCount = UBound(data, 2) 
    .List = data 
End With 


'Or, if you want a specific index (not the first) from your array 
Dim r As Long, index As Long 
index = 2 
For r = 1 To UBound(data, 1) 
    UserForm1.ComboBox3.AddItem data(r, index) 
Next 
+0

Спасибо за ваш ответ и ваш совет! Вчера вечером я полностью перестроил проект в новой книге. Я нашел решение проблемы со списком ящиков, но теперь у меня возникла новая проблема: при редактировании существующего элемента я могу выбрать элемент в поле со списком и автоматически заполнять соответствующие данные из таблицы в нужные поля, все, кроме последних двух записей, которые не будут заполнять соответствующую информацию. Я напишу весь код, который я написал для всех, чтобы посмотреть и, возможно, скажу, где я совершил ошибку! Еще раз спасибо! – Juicyblunts

+0

Нет проблем. Я бы рекомендовал, чтобы вы спросили об этом как о новом вопросе. – Ambie

+0

Ой, я уже испортил и отредактировал этот, мой плохой. – Juicyblunts

Смежные вопросы