#excel #vba #ms-access #userform
#excel #vba #ms-access #пользовательская форма
Вопрос:
Я хочу загрузить некоторые данные из Access в список пользовательских форм Excel. Сейчас я создаю ADODB.Connection
для подключения access и создания ADODB.Recordset
для хранения данных, во-первых. Во-вторых, я использую Range("xx").CopyFromRecordset
для копирования данных на лист Excel. В-третьих, назовите этот диапазон Excel как « ResultSet
«. В-четвертых, используйте Me.ListName.RowSource="ResultSet"
для копирования данных из листа Excel в ListBox.
Как вы можете видеть, я использую четыре шага для завершения этой работы. Есть ли способ пропустить шаг 2 и шаг 3, копируя данные из Access в ListBox напрямую?
Спасибо
Комментарии:
1. Является ли набор записей динамическим? Я бы использовал инструменты внешних данных Excel для импорта данных Access в электронную таблицу в Excel. Если параметры в вашей пользовательской форме часто меняют источник списка, это может не способствовать повышению производительности. Если набор записей более или менее статичен, вы можете один раз установить внешний источник и источник списка и использовать кнопку обновления Excel в любое время, когда вам нужно обновить источник данных. Если вы ссылаетесь на таблицу, используйте опцию «Из Access», в противном случае «Из других источников»> «Из Microsoft Query» должны предоставить вам доступ либо к таблицам, либо к запросам.
2. @ChristopherD. Спасибо за ответ. Да, он динамический. Кроме того, причина, по которой я хочу пропустить шаг 2 и шаг 3, заключается в том, что я не хочу, чтобы пользователи видели данные в Excel. Я просто хочу, чтобы данные отображались в списке.
Ответ №1:
Я нашел одну статью. Ниже приведен код, а это ссылка.
With rs
.MoveLast
NoOfRecords = .RecordCount
.MoveFirst
End With
'Set the number of ListBox columns = number of fields in the recordset
ListBox1.ColumnCount = rs.Fields.Count
'Load the listbox with the retrieved records
ListBox1.Column = rs.GetRows(NoOfRecords)
Спасибо
Ответ №2:
Для списка с одним столбцом
Попробуйте вручную отредактировать список с помощью цикла:
Me.ListName.Clear 'First clear existing list
With Me.ListName
While rs.EOF = False
.AddItem rs.Fields(0).Value
rs.MoveNext
Wend
End With
Замените этот код шагами 2-4.
Комментарии:
1. Спасибо за ответ. Один вопрос: он загружает данные одну ячейку за другой, верно? Будет ли это медленнее, чем
CopyFromRecordset
?2. @kzhang12 Да, он загружается по одному и работает медленнее, чем ваш текущий код. В зависимости от размера, возможно, не заметно медленнее, но копирование набора записей или связывание с внешними данными будет быстрее. Вы можете попробовать напрямую установить источник списка в набор записей, но я никогда раньше этого не пробовал. Я использую Access вместо пользовательских форм, так что это немного выходит за рамки моего опыта.