Search code examples
vbacombobox

ComboBox display wrongly


I have a code which display the text of the cell underneath it. However, it seems that the Combobox just refuse to display the correct text. As you can see in the screenshot

  • The Text property is different from the displaying text. It's the previous value.
  • ScreenUpdating is True
  • The combobox is enabled
  • There is only 1 combobox, no other objects/shapes/buttons/forms. And a single table in this sheet.

ComboBox display something other than its Text property value

Other information:

  • Problematic ComboBox is in sheet LinhKien, other comboboxes work fine. I don't know how to upload file here, so it's a 7 days link valid begin from 20220712 (YYYYMMDD)
  • The combobox is hidden when user is not selecting column 1 or select more than 1 cell. It becomes visible when a cell in column 1 is selected.
  • I have 2 other sheets with Comboboxes behave the exact same way (hidden when not in certain column, text comes from underneath cell) but they don't have this problem.

If the code is of relevant, here it is.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
DoEvents
If Selection.Count > 1 Then Exit Sub
If Application.CutCopyMode Then
    searchBoxAccessories.Visible = False
    Exit Sub
End If

If searchBoxAccessories Is Nothing Then
    Set searchBoxAccessories = ActiveSheet.OLEObjects("SearchCombBoxAccessories")
End If


If Target.Column = 1 And Target.Row > 3 Then
    Dim isect As Range
    Set isect = Application.Intersect(Target, ListObjects(1).Range)
    If isect Is Nothing Then GoTo DoNothing
    isInitializingComboBox = True
    GetSearchAccessoriesData
    searchBoxAccessories.Activate
    
    isInitializingComboBox = True 'This prevent "_Change" fires up when something changes

    searchBoxAccessories.Top = Target.Top
    searchBoxAccessories.Left = Target.Left
    searchBoxAccessories.Width = Target.Width + 15
    searchBoxAccessories.Height = Target.Height + 2
    Application.EnableEvents = False 'Another attemp to prevent "_Change" fires up when something changes
    searchBoxAccessories.Object.text = Target.text
    Application.EnableEvents = True
    searchBoxAccessories.Object.SelStart = 0
    searchBoxAccessories.Object.SelLength = Len(Target.text)
    searchBoxAccessories.Visible = True
    isInitializingComboBox = False 'Screenshot is taken here
    Set workingCell = Target
Else
DoNothing:

    If searchBoxAccessories Is Nothing Then
        Set searchBoxAccessories = ActiveSheet.OLEObjects("SearchCombBoxAccessories")
    End If
    
    If searchBoxAccessories.Visible Then searchBoxAccessories.Visible = False
End If

End Sub
_____________________
Public Sub GetSearchAccessoriesData()

Dim col2Get As String: col2Get = "3;4;5;6"
Dim dataSourceRg As Range: Set dataSourceRg = GetTableRange("PhuKienTbl")
If Not IsEmptyArray(searchAccessoriesArr) Then Erase searchAccessoriesArr
searchAccessoriesArr = GetSearchData(col2Get, dataSourceRg, Sheet22.SearchCombBoxAccessories)

End Sub
_____________________
Public Function GetSearchData(col2Get As String, dataSourceRg As Range, searchComboBox As ComboBox, _
Optional filterMat As String = "") As Variant

Dim filterStr As String: filterStr = IIf(filterMat = "", ";", "1;" & filterMat)
Dim colVisible As Integer: colVisible = 1
Dim colsWidth As String: colsWidth = "200"
Dim isHeader As Boolean
Dim colCount As Integer: colCount = Len(col2Get) - Len(Replace(col2Get, ";", "")) + 1
GetSearchData = GetArrFromRange(dataSourceRg, col2Get, False, filterStr)

With searchComboBox
    .ColumnCount = colVisible
    .ColumnWidths = colsWidth
    .ColumnHeads = False
End With
Set dataSourceRg = Nothing

End Function
_____________________
Public Function GetArrFromRange(rg As Range, cols2GetStr As String, isHeader As Boolean, Optional colCriFilterStr As String = ";") As Variant

Dim col2Get As Variant: col2Get = Split(cols2GetStr, ";")
Dim arrRowsCount As Integer
Dim arrColsCount As Integer: arrColsCount = UBound(col2Get) + 1
Dim resultArr() As Variant
Dim iRow As Integer
Dim iCol As Integer
Dim criCol As Integer
If Len(colCriFilterStr) = 1 Then
    criCol = 0
Else:  criCol = CInt(Left(colCriFilterStr, InStr(colCriFilterStr, ";") - 1))
End If
Dim criStr As String: criStr = IIf(isHeader, "", Mid(colCriFilterStr, InStr(colCriFilterStr, ";") + 1))

If isHeader Then
    arrRowsCount = 1
Else
    If criCol <> 0 Then
        arrRowsCount = WorksheetFunction.CountIf(rg.Columns(criCol), criStr)
    Else
        arrRowsCount = rg.Rows.Count
    End If
End If
If arrRowsCount = 0 Then GoTo EndOfFunction
ReDim resultArr(1 To arrRowsCount, 1 To arrColsCount)
Dim wkCell As Range
Dim arrRow As Integer: arrRow = 1
For iRow = IIf(isHeader, 1, 2) To IIf(isHeader, 1, rg.Rows.Count)
    If criStr = "" Then
        For iCol = 1 To arrColsCount
            resultArr(arrRow, iCol) = rg.Cells(iRow, CDbl(col2Get(iCol - 1))).Value
        Next iCol
        arrRow = arrRow + 1
    Else
        If rg.Cells(iRow, criCol).Value = criStr Then
            For iCol = 1 To arrColsCount
                resultArr(arrRow, iCol) = rg.Cells(iRow, CDbl(col2Get(iCol - 1))).Value
            Next iCol
            arrRow = arrRow + 1
        End If
    End If
Next iRow
EndOfFunction:
GetArrFromRange = resultArr
Erase resultArr
End Function


Solution

  • After weeks of frustration, I am please to announce that I found out the cause. It was the Freeze Panes that affects the display of combobox. Particularly, ComboBox placed in freezed column is not refreshed as frequently as in other cell. In that area, combobox almost act as it's disabled (visually). No text changes update even when you type, no selection/highlighting. I changed to only freeze upper rows and the combobox works just as expected. That's why my other comboboxes in other sheets behaved correctly.

    I suspect that Excel tries to save resources by making the freezed part not as responsive. That behavior override Application.ScreenUpdating and not exposed to user.

    Since this "feature" could be version specific, my system is Win 10 pro, Excel 16 pro plus.