0

this is the first I've worked with Excel's VBA UserForm and I'm experiencing an issue i don't understand. currently I'm receiving a 1004 error coming from ComboBox1_Change() when ComboBox1's selection is not the same as the activesheet that I'm looking at. Is there an easy way to fix that? I need to be able to select any sheet without directly looking at it. ComboBox2's selection is based on the column headings of the sheet picked in ComboBox1. Any help would be greatly appreciated! Below is the code as I've developed thus far.

Private m_Cancelled As Boolean

Public Property Get Cancelled() As Variant
    Cancelled = m_Cancelled
End Property

Private Sub ComboBox1_Change()
    ComboBox2.List = WorksheetFunction.Transpose(Worksheets(CStr(ComboBox1.Value)).Range(Cells(1, 1), Cells(1, GetColSize)).Value)
End Sub

Private Sub ComboBox2_Change()
    ComboBox3.List = WorksheetFunction.Transpose(Worksheets(CStr(ComboBox1.Value)).Range(Cells(1, 1), Cells(1, GetColSize)).Value)
End Sub

Private Sub CommandButton1_Click()
    Hide
End Sub

Private Sub CommandButton2_Click()
    ' Hide the Userform and set cancelled to true
    Hide
    m_Cancelled = True
End Sub

Private Sub UserForm_Click()

End Sub

Private Sub UserForm_Initialize()
    
    With UserForm_1
      .Width = Application.Width * 0.24
      .Height = Application.Height * 0.47
    End With
    
    ComboBox1.Clear
    
    'Initialize ComboBox1
    Dim WB As Workbook: Set WB = ThisWorkbook
    Dim wCount As Long: wCount = WB.Worksheets.Count
    Dim wsNames() As String: ReDim wsNames(1 To wCount)

    Dim WS As Worksheet, w As Long

    For Each WS In WB.Worksheets
        If WS.Visible = xlSheetVisible Then
            w = w + 1
            wsNames(w) = WS.Name
        End If
    Next WS

    If w < wCount Then ReDim Preserve wsNames(1 To w)

    ComboBox1.List = wsNames
    
End Sub

Private Sub UserForm_Activate()

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer _
                                        , CloseMode As Integer)
    
    ' Prevent the form being unloaded
    If CloseMode = vbFormControlMenu Then Cancel = True
    
    ' Hide the Userform and set cancelled to true
    Hide
    m_Cancelled = True
    
End Sub

Function GetColSize() As Integer
    Dim LastColumn As Integer
    LastColumn = Sheets(ComboBox1.Value).Rows(1).Columns(Sheets(ComboBox1.Value).Columns.Count).End(xlToLeft).Column
'    Debug.Print LastColumn; " Last Column"
    GetColSize = LastColumn
End Function

Function GetRowSize() As Variant
    Dim LastRow As Variant
    LastRow = Sheets(ComboBox1.Value).Cells(Rows.Count, GetBox2Col).End(xlUp).Row
'    Debug.Print LastRow; " Last Row"
    GetRowSize = LastRow
End Function

Function GetComboBox1() As String
    GetComboBox1 = ComboBox1.Value
End Function

Function GetComboBox2() As String
    GetComboBox2 = ComboBox2.Value
    Debug.Print ComboBox2.Value; " is in column "; GetBox2Col
End Function

Function GetBox2Col() As Integer
    Dim i As Integer
    For i = 1 To GetColSize
        If Cells(1, i) = ComboBox2.Value Then
            GetBox2Col = i
            Exit For
        End If
    Next i
End Function

Function GetComboBox3() As String
    GetComboBox3 = ComboBox3.Value
    Debug.Print ComboBox3.Value; " is in column "; GetBox3Col
End Function

Function GetBox3Col() As Integer
    Dim i As Integer
    For i = 1 To GetColSize
        If Cells(1, i) = ComboBox3.Value Then
            GetBox3Col = i
            Exit For
        End If
    Next i
End Function

0 Answers0