【问题标题】:Runtime Error when calling userform with listbox使用列表框调用用户窗体时出现运行时错误
【发布时间】:2021-01-26 10:42:25
【问题描述】:

希望你能帮帮我,因为我真的看不到错误。

我正在尝试创建一个带有列表框的用户窗体,用户可以在其中从数组中选择值。数组的代码如下:

Dim arrayData   As Range
Dim sh As Worksheet
Dim Row_Count As Integer
Dim i As Integer
Dim lastRow2 As Long

Set sh = ThisWorkbook.Sheets("Import")
lastRow2 = sh.Columns(45).Find("*", , , , xlByRows, xlPrevious).Row

Set arrayData = sh.Range("AS2:AS" & lastRow2)

arArray = sh.Range("AS2:AS" & lastRow2)

Row_Count = arrayData.Rows.Count

   
For i = 1 To Row_Count

  
    arArray(i, 45) = Cells(i, 45).Value

Next i

这非常有效。现在我正在初始化用户窗体:

Public Sub UserForm_Initialize()



Auswertung.Lst_Tabellen.List.Clear


Auswertung.Lst_Tabellen.List = arArray


End Sub

但每次我尝试调用用户表单“Auswertung”时,都会收到错误“运行时错误 424:需要对象”。你们能看出问题吗?

Public Sub Call_Userform()

Auswertung.Show


End Sub

当我运行代码时,调试器会标记“Auswertung.Show”行。

【问题讨论】:

  • 您在UserForm_Initialize() 中使用了arArray,但您在该事件中的何处填充它?
  • arArray 变量在哪里声明?是Public 并在标准模块级别声明吗?正如 Siddharth Rout 所问的那样,它居住在哪里?而不是“完美运行”的程序,您可以简单地使用:arArray = ThisWorkbook.Sheets("Import").Range("AS2:AS" & lastRow2).value。代码应该只计算lastRow2。这个简单的方法就可以了:lastRow2 = ThisWorkbook.Sheets("Import").Cells(rows.count, 45).End(xlUp).Row.
  • arArray 在第一个模块中声明为Public arArray As Variant
  • 没关系,但你在哪里填充它?此外,当调试器标记“Auswertung.Show”行时,按 F8 并逐步浏览每一行。最后告诉我们哪一行给了我们错误?
  • 我在哪里填充它是什么意思?该数组在另一个名为“Import_CSV”的子中定义。我正在对导入的 csv 文件进行排序。该数组是可能的数据集列表,用户可以选择以进行进一步评估。因此,调试器一直工作到 UserForm_Initialize 子中的 Auswertung.Lst_Tabellen.List = arArray 行。然后它停止并跳回到Auswertung.Show

标签: excel vba listbox userform


【解决方案1】:

正如我提到的,您需要在UserForm_Initialize() 中填充数组

这是一个例子。要对此进行测试,请将您的 UserForm_Initialize 替换为以下代码。

Option Explicit

Private Sub UserForm_Initialize()
    Dim ws As Worksheet
    Dim lRow As Long
    Dim arRange As Range
    Dim arData As Variant
    
    '~~> Set your worksheet here
    Set ws = ThisWorkbook.Sheets("Import")
    
    With ws
        '~~> Find last row in column AS
        lRow = .Range("AS" & .Rows.Count).End(xlUp).Row
        
        '~~> Identify your range
        Set arRange = .Range("AS2:AS" & lRow)
        
        '~~> Get the data into an array. This will be a 2D array
        arData = arRange.Value2
    End With
    
    With Lst_Tabellen
        .Clear
        '~~> Transpose to get 0-based array
        .List = Application.Transpose(arData)
    End With
End Sub

【讨论】:

  • 非常感谢您的帮助!该数组现在位于列表框中,我可以选择要选择的数据。
  • 那么您的查询排序了吗?
  • 那么下一步是,根据列表框中的所选项目对数据表进行排序,然后将排序后的原始数据中的一些列复制到新工作表中,制作两个图表并将图表另存为以及复制的列作为 3 个不同的文件。
  • 因此您的查询已排序,对于其他问题,请提出新问题
  • 非常感谢!它解决了我的问题。现在我有一个带有数组数据的漂亮列表框
【解决方案2】:

正如你所写,arArray 是 Variant

arArray = sh.Range("AS2:AS" & lastRow2) --> arArray 是一维数组

...

arArray(i, 45) = Cells(i, 45).Value --> arArray 变成二维数组

...

Auswertung.Lst_Tabellen.List = arArray --> 结果未知

请检查以上内容,这是您真正想要的吗?

【讨论】:

  • 我明白了。但是,即使您只使用一列,数组也不总是二维的吗?我的意思是您需要行数(第 1 维)和列数(第 2 维)才能正确描述数组?
  • 不,数组可以是 1,2,3 等维度,具体取决于您的声明。查看更多:docs.microsoft.com/en-us/office/vba/language/concepts/…
  • @Apafey - 将(多于 1 个单元格)列值分配给数据字段数组(例如 AS 列中的 arArray = sh.Range("AS2:AS" & lastRow2))总是会导致 1-based 二维数组
猜你喜欢
  • 1970-01-01
  • 2021-11-22
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 2016-12-19
  • 2019-08-11
  • 2019-10-03
相关资源
最近更新 更多