无法将范围设置到 Listbox.RowSource 方法或 Listbox.List 方法中

Unable to set a range into the Listbox.RowSource method or Listbox.List method

当行到达 lbxFoilInfoDisplay.RowSource = "tblFoilInfoHelper!A1:" & Col_Letter(TotalColumnsCount("Foil Purchases.xlsm", "List_Box")) & TotalRowsCount("Foil Purchases.xlsm", "List_Box", "tblFoilInfoHelper") 时,我得到错误:

当我尝试将其替换为: lbxFoilInfoDisplay.List = ThisWorkbook.Worksheets("List_Box").Range("A1:" & Col_Letter(TotalColumnsCount("Foil Purchases.xlsm", "List_Box")) & TotalRowsCount("Foil Purchases.xlsm", "List_Box", "tblFoilInfoHelper")),我得到错误:

我相信 table 的名称是正确的,如下图所示:

Option Explicit
Dim filterRangeFoilProfile As Range, filteredRangeFoilProfile As Range
Private Sub cbxSupplier_AfterUpdate()
Dim Supplier_col As Long

lbxFoilInfoDisplay.RowSource = vbNullString
Supplier_col = ThisWorkbook.Worksheets("Foil Profile").ListObjects("tblFoilProfile").ListColumns("SUPPLIER").Index
filterRangeFoilProfile.AutoFilter Field:=Supplier_col, Criteria1:=cbxSupplier.Text
On Error Resume Next
Set filteredRangeFoilProfile = Intersect(filterRangeFoilProfile, filterRangeFoilProfile.Offset(1, 0)).SpecialCells(xlCellTypeVisible)
On Error GoTo 0

If Not filteredRangeFoilProfile Is Nothing Then
    ThisWorkbook.Worksheets("Foil Profile").ListObjects("tblFoilProfile").DataBodyRange.SpecialCells(xlCellTypeVisible).Copy
    ThisWorkbook.Worksheets("List_Box").Cells(2, 1).PasteSpecial
    lbxFoilInfoDisplay.RowSource = "tblFoilInfoHelper!A1:" & Col_Letter(TotalColumnsCount("Foil Purchases.xlsm", "List_Box")) & TotalRowsCount("Foil Purchases.xlsm", "List_Box", "tblFoilInfoHelper")
    'lbxFoilInfoDisplay.List = ThisWorkbook.Worksheets("List_Box").Range("A1:" & Col_Letter(TotalColumnsCount("Foil Purchases.xlsm", "List_Box")) & TotalRowsCount("Foil Purchases.xlsm", "List_Box", "tblFoilInfoHelper"))
End If

End Sub

用户定义函数(添加上下文):

1.)

Function Col_Letter(lngCol As Long) As String
    Dim vArr
    vArr = Split(Cells(1, lngCol).Address(True, False), "$")
    Col_Letter = vArr(0)
End Function

2.)

Function TotalRowsCount(WBString As String, WorksheetNameString As String, TableNameString As String) As Long

Dim Total_columns As Long
Dim i As Long

Total_columns = Workbooks(WBString).Worksheets(WorksheetNameString).ListObjects(TableNameString).ListColumns.Count

ReDim Rows_count(1 To Total_columns) As Long
For i = 1 To Total_columns
    With Workbooks(WBString).Worksheets(WorksheetNameString).ListObjects(TableNameString).ListColumns(i).Range
    Rows_count(i) = .Find(What:="*", _
        After:=.Cells(1), _
        Lookat:=xlPart, _
        LookIn:=xlFormulas, _
        SearchOrder:=xlByRows, _
        SearchDirection:=xlPrevious, _
        MatchCase:=False).Row
    End With
Next i
TotalRowsCount = WorksheetFunction.Max(Rows_count)

End Function

3.)

Function TotalColumnsCount(WBString As String, WorksheetNameString As String) As Long

Dim lastColumn As Long
lastColumn = Workbooks(WBString).Worksheets(WorksheetNameString).Cells(1, Columns.Count).End(xlToLeft).Column
TotalColumnsCount = lastColumn

End Function

使用 sheet 名称代替 table 名称。即:"List_Box!A1:" &...

lbxFoilInfoDisplay.RowSource = "List_Box!A1:" & Col_Letter(TotalColumnsCount("Foil Purchases.xlsm", "List_Box")) & TotalRowsCount("Foil Purchases.xlsm", "List_Box", "tblFoilInfoHelper")

可能会找到一些用处...或没有。您也可以使用 table 来执行此操作,但您仍然需要使用 Sheetname 才能获取单元格的地址。即

ActiveSheet.ListObjects(1).Range.Cells(3, 1).Address

如果您需要引用 table 中的特定单元格并且不太关心 table 所在的位置,这将非常有用。然而,这只是为了帮助您构建地址部分 - 而不是将 sheet 名称替换为 table 名称。