Search code examples
excelvbalistboxmultiple-columnspopulate

VBA Excel more than 10 column ListBox, Populate values from other listbox


Currently I'm populating 2 listboxes side by side to provide information on a userform which is then populated to a SQL database table.

I need to turn 2 ListBox's into a single multicolumn listbox, but with 20 columns.

Here's the current code that populates the 2 listboxes:

Private Sub AddActualRecord()
    

    
        ListCount = frmRecordActuals.lstDirectTasks.ListCount
        
        frmRecordActuals.lstDirectTasks.AddItem
        frmRecordActuals.lstDirectTasks.list(ListCount, 0) = lstWorkItems.list(lstWorkItems.ListIndex, 0)               
        frmRecordActuals.lstDirectTasks.list(ListCount, 1) = txtPcId.value                                              
        frmRecordActuals.lstDirectTasks.list(ListCount, 2) = txtDirectActivityName.value                                
        frmRecordActuals.lstDirectTasks.list(ListCount, 3) = lstWorkItems.list(lstWorkItems.ListIndex, 1)               
        frmRecordActuals.lstDirectTasks.list(ListCount, 4) = lstWorkItems.list(lstWorkItems.ListIndex, 2)               
        frmRecordActuals.lstDirectTasks.list(ListCount, 5) = lstWorkItems.list(lstWorkItems.ListIndex, 3)               
        frmRecordActuals.lstDirectTasks.list(ListCount, 6) = lstWorkItems.list(lstWorkItems.ListIndex, 6)               
        frmRecordActuals.lstDirectTasks.list(ListCount, 7) = lstWorkItems.list(lstWorkItems.ListIndex, 4)               
        frmRecordActuals.lstDirectTasks.list(ListCount, 8) = lstWorkItems.list(lstWorkItems.ListIndex, 5)               
        frmRecordActuals.lstDirectTasks.list(ListCount, 9) = lstProcessStage.list(lstProcessStage.ListIndex, 1)         
        
        ListCount2 = frmRecordActuals.lstDirectTasks2.ListCount
        
        frmRecordActuals.lstDirectTasks2.AddItem
        frmRecordActuals.lstDirectTasks2.list(ListCount2, 0) = lstProcessStage.list(lstProcessStage.ListIndex, 0)         
        frmRecordActuals.lstDirectTasks2.list(ListCount2, 1) = cboGrade.list(cboGrade.ListIndex, 1)                      
        frmRecordActuals.lstDirectTasks2.list(ListCount2, 2) = cboGrade.list(cboGrade.ListIndex, 0)                      
        frmRecordActuals.lstDirectTasks2.list(ListCount2, 3) = cboWiderInitiative.list(cboWiderInitiative.ListIndex, 1)  
        frmRecordActuals.lstDirectTasks2.list(ListCount2, 4) = cboWiderInitiative.list(cboWiderInitiative.ListIndex, 0) 
        frmRecordActuals.lstDirectTasks2.list(ListCount2, 5) = cboHours.value                                            
        frmRecordActuals.lstDirectTasks2.list(ListCount2, 6) = cboMinutes.value                                          
        frmRecordActuals.lstDirectTasks2.list(ListCount2, 7) = lblHasCasesID.Caption                                     
        If lblHasCasesID.Caption = 1 Then
            frmRecordActuals.lstDirectTasks2.list(ListCount2, 8) = txtSelected.value
            Else: frmRecordActuals.lstDirectTasks2.list(ListCount2, 8) = "N/A"                                          
        End If
        If lblHasCasesID.Caption = 1 Then
            frmRecordActuals.lstDirectTasks2.list(ListCount2, 9) = txtDeselected.value
            Else: frmRecordActuals.lstDirectTasks2.list(ListCount2, 9) = "N/A"                                          
        End If

    
    
End Sub

Any help would be appreciated.

I've seen various solutions but cannot see how to make them fit.

EDIT: This is to replace 2 list boxes with a single listbox.

I want to remove the old 2 listboxes completely and have all data going to just 1 new 20 column listbox.

Each time this code is run it needs to add another row to the listbox. But NOT in a loop. The code need to be able to run multiple times and add a new row each time.

Thanks

EDIT 2:

I have updated the code which now inserts all values, but this code simply overwrites the first row in the listbox eachtime the code is run.

How can I amend the code so that it populates the next row when run again?

Many Thanks.

Private Sub AddActualRecord()

    ListCount = frmRecordActuals.lstDirectTasks.ListCount

    Dim DirectActual(ListCount, 20) As String


    DirectActual(ListCount, 0) = lstWorkItems.list(lstWorkItems.ListIndex, 0)               
    DirectActual(ListCount, 1) = txtPcId.value                                              
    DirectActual(ListCount, 2) = txtDirectActivityName.value                                
    DirectActual(ListCount, 3) = lstWorkItems.list(lstWorkItems.ListIndex, 1)               
    DirectActual(ListCount, 4) = lstWorkItems.list(lstWorkItems.ListIndex, 2)               
    DirectActual(ListCount, 5) = lstWorkItems.list(lstWorkItems.ListIndex, 3)               
    DirectActual(ListCount, 6) = lstWorkItems.list(lstWorkItems.ListIndex, 6)              
    DirectActual(ListCount, 7) = lstWorkItems.list(lstWorkItems.ListIndex, 4)               
    DirectActual(ListCount, 8) = lstWorkItems.list(lstWorkItems.ListIndex, 5)               
    DirectActual(ListCount, 9) = lstProcessStage.list(lstProcessStage.ListIndex,1)
    DirectActual(ListCount, 10) = lstProcessStage.list(lstProcessStage.ListIndex, 0)        
    DirectActual(ListCount, 11) = cboGrade.list(cboGrade.ListIndex, 1)                      
    DirectActual(ListCount, 12) = cboGrade.list(cboGrade.ListIndex, 0)                      
    DirectActual(ListCount, 13) = cboWiderInitiative.list(cboWiderInitiative.ListIndex, 1)  
    DirectActual(ListCount, 14) = cboWiderInitiative.list(cboWiderInitiative.ListIndex, 0)  
    DirectActual(ListCount, 15) = cboHours.value                                            
    DirectActual(ListCount, 16) = cboMinutes.value                                          
    DirectActual(ListCount, 17) = lblHasCasesID.Caption                                     
    If lblHasCasesID.Caption = 1 Then
        DirectActual(ListCount, 18) = txtSelected.value
    Else: DirectActual(ListCount, 18) = "N/A"                                          
    End If
    If lblHasCasesID.Caption = 1 Then
        DirectActual(ListCount, 19) = txtDeselected.value
    Else: DirectActual(ListCount, 19) = "N/A"                                          
    End If


    With frmRecordActuals.lstDirectTasks
      .ColumnCount = 12
      .list = DirectActual
    End With
    

    
End Sub

Solution

  • Please, test the next code. Not tested, of course, but it should work:

    Private Sub AddActualRecord()
        Dim ListCount As Long
        ListCount = frmRecordActuals.lstDirectTasks.ListCount
        
        If ListCount = 0 Then
            Dim DirectActual(ListCount, 20) As String
        
            DirectActual(ListCount, 0) = lstWorkItems.list(lstWorkItems.ListIndex, 0)
            DirectActual(ListCount, 1) = txtPcId.value
            DirectActual(ListCount, 2) = txtDirectActivityName.value
            DirectActual(ListCount, 3) = lstWorkItems.list(lstWorkItems.ListIndex, 1)
            DirectActual(ListCount, 4) = lstWorkItems.list(lstWorkItems.ListIndex, 2)
            DirectActual(ListCount, 5) = lstWorkItems.list(lstWorkItems.ListIndex, 3)
            DirectActual(ListCount, 6) = lstWorkItems.list(lstWorkItems.ListIndex, 6)
            DirectActual(ListCount, 7) = lstWorkItems.list(lstWorkItems.ListIndex, 4)
            DirectActual(ListCount, 8) = lstWorkItems.list(lstWorkItems.ListIndex, 5)
            DirectActual(ListCount, 9) = lstProcessStage.list(lstProcessStage.ListIndex, 1)
            DirectActual(ListCount, 10) = lstProcessStage.list(lstProcessStage.ListIndex, 0)
            DirectActual(ListCount, 11) = cboGrade.list(cboGrade.ListIndex, 1)
            DirectActual(ListCount, 12) = cboGrade.list(cboGrade.ListIndex, 0)
            DirectActual(ListCount, 13) = cboWiderInitiative.list(cboWiderInitiative.ListIndex, 1)
            DirectActual(ListCount, 14) = cboWiderInitiative.list(cboWiderInitiative.ListIndex, 0)
            DirectActual(ListCount, 15) = cboHours.value
            DirectActual(ListCount, 16) = cboMinutes.value
            DirectActual(ListCount, 17) = lblHasCasesID.Caption
            If lblHasCasesID.Caption = 1 Then
                DirectActual(ListCount, 18) = txtSelected.value
            Else
                DirectActual(ListCount, 18) = "N/A"
            End If
            If lblHasCasesID.Caption = 1 Then
                DirectActual(ListCount, 19) = txtDeselected.value
            Else
                DirectActual(ListCount, 19) = "N/A"
            End If
            With frmRecordActuals.lstDirectTasks
              .ColumnCount = 12
              .list = DirectActual
            End With
        Else
            Dim arrList, arrFin, i As Long, j As Long, k As Long
            
            arrList = frmRecordActuals.lstDirectTasks.list 'extract the list box elements in an array
            ReDim arrFin(0 To UBound(arrList) + 1, 0 To UBound(arrList, 2)) 'redim the final array
            For i = 0 To UBound(arrList)                   'load the existing elements in the final array
                For j = 0 To UBound(arrList, 2)
                    arrFin(k, j) = arrList(i, j)
                Next j
                k = k + 1
            Next i
            'add the new elements in the final array:
            arrFin(k, 0) = lstWorkItems.list(lstWorkItems.ListIndex, 0)
            arrFin(k, 1) = txtPcId.value
            arrFin(k, 2) = txtDirectActivityName.value
            arrFin(k, 3) = lstWorkItems.list(lstWorkItems.ListIndex, 1)
            arrFin(k, 4) = lstWorkItems.list(lstWorkItems.ListIndex, 2)
            arrFin(k, 5) = lstWorkItems.list(lstWorkItems.ListIndex, 3)
            arrFin(k, 6) = lstWorkItems.list(lstWorkItems.ListIndex, 6)
            arrFin(k, 7) = lstWorkItems.list(lstWorkItems.ListIndex, 4)
            arrFin(k, 8) = lstWorkItems.list(lstWorkItems.ListIndex, 5)
            arrFin(k, 9) = lstProcessStage.list(lstProcessStage.ListIndex, 1)
            arrFin(k, 10) = lstProcessStage.list(lstProcessStage.ListIndex, 0)
            arrFin(k, 11) = cboGrade.list(cboGrade.ListIndex, 1)
            arrFin(k, 12) = cboGrade.list(cboGrade.ListIndex, 0)
            arrFin(k, 13) = cboWiderInitiative.list(cboWiderInitiative.ListIndex, 1)
            arrFin(k, 14) = cboWiderInitiative.list(cboWiderInitiative.ListIndex, 0)
            arrFin(k, 15) = cboHours.value
            arrFin(k, 16) = cboMinutes.value
            arrFin(k, 17) = lblHasCasesID.Caption
            If lblHasCasesID.Caption = 1 Then
                arrFin(k, 18) = txtSelected.value
            Else
                arrFin(k, 18) = "N/A"
            End If
            If lblHasCasesID.Caption = 1 Then
                arrFin(k, 19) = txtDeselected.value
            Else
                arrFin(k, 19) = "N/A"
            End If
            'load the listbox with the cumulated array:
            frmRecordActuals.lstDirectTasks.list = arrFin
        End If
    End Sub