как избежать последнего пустого поля в списке со списком - PullRequest
0 голосов
/ 21 октября 2019

Я новичок в vba и пытаюсь создать форму, содержащую список элементов из другой книги Excel.

Это таблица, сохраненная в другой книге Excel, где я хочу взятьданные: enter image description here

Мне нужно, чтобы мой комбинированный список брал предметы из диапазона ("C2"), который принимает в качестве 1-го элемента "Petronor", пока не найдет 1-й пробел в строке.

Я сделал это:

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") до 1-го пробела в этой строке. Я должен сказать этот код, который я сделал из другого, который я видел, и я все еще пытаюсь понять, как это работает, потому что я совсем не уверен, хотя я знаю обо всех свойствах, которые используются. Я запутался в свойстве 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

Проблема этого кодачто я получаю пробел в последнем поле комбинированного списка, как это: enter image description here

Пожалуйста, помогите мне решить эту проблему, и я готов услышать улучшения в коде.

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Всегда лучше работать снизу листа, а не вниз (особенно, если после C2 у вас ничего нет; ваше смещение тоже записывалось в последнюю пустую ячейку), и вы можете избежать цикла, используя List:

Private Sub UserForm_Initialize()

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

End Sub
0 голосов
/ 21 октября 2019

Я бы получил счетчик количества строк вместо использования диапазона, что-то вроде

Dim lastRow As Long

lastRow = Cells(Rows.Count, 3).End(xlUp).Row

Тогда в вашем цикле for

For i = 2 To lastRow
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...