首页 > 解决方案 > 如何避免组合框列表中的最后一个空字段

问题描述

我是 vba 的新手,我正在尝试创建一个表单,其中包含另一本 excel 书中的项目列表。

这是保存在另一本 Excel 书中的表格,我想在其中获取数据: 在此处输入图像描述

我需要我的组合框从范围(“C2”)中获取项目,该范围作为第一个项目“Petronor”,直到它找到行中的第一个空白。

我做的:

Private Sub UserForm_Initialize()
    Dim archivo As Workbook
    Dim i As Long
    Set archivo = Workbooks.Open("C:\Users\se72497\Desktop\Departamentos.xlsx")

    For i = 2 To archivo.Sheets("Hoja1").Range("C2").End(xlDown).Offset(1, 0).Row
        ComboBox1.AddItem archivo.Sheets("Hoja1").Cells(i, 3).Value
    Next i

    archivo.Close
End Sub

1)我首先创建一个变量,其中包含我想要获取数据的文件:

 Dim archivo As Workbook
 Set archivo = Workbooks.Open("C:\Users\se72497\Desktop\Departamentos.xlsx")

2) 之后,使用 For Next 循环,我尝试使用代码遍历范围(“C2”)中的所有项目,直到该行中的第一个空白。我不得不说这段代码是我从我看到的另一个代码中制作的,我仍然试图理解它是如何工作的,因为我完全不确定,尽管我知道所有使用的属性。我对属性 range.row 感到困惑,因为我不知道它是如何工作的。我希望有人也可以向我解释。

 Dim i As Long
 For i = 2 To archivo.Sheets("Hoja1").Range("C2").End(xlDown).Offset(1, 0).Row
        ComboBox1.AddItem archivo.Sheets("Hoja1").Cells(i, 3).Value
 Next i

3)最后我添加了一段代码来关闭我之前打开的文件:

archivo.Close

这段代码的问题是我在组合框的最后一个字段中得到一个空白,如下所示: 在此处输入图像描述

请帮我解决这个问题,我很乐意听到对代码的改进。

标签: excelvba

解决方案


从工作表底部向上而不是向下工作总是更好(特别是如果您在 C2 之后什么都没有;您的 Offset 也在最后一个空白单元格中),您可以通过使用避免循环List

Private Sub UserForm_Initialize()

With Sheets("Sheet1")
    ComboBox1.List = Range("C2", .Range("C" & Rows.Count).End(xlUp)).Value
End With

End Sub

推荐阅读