Блок может содержать несколько пространств имен. Я думаю, что Вы действительно хотите спросить, то, как получить тип от блока, не определяя пространство имен.
я не знаю, существует ли лучший путь, но можно попытаться искать определенный тип как это (добавьте - использующий linq;):
myassembly.GetTypes().SingleOrDefault(t => t.Name == "ClassName")
Это эффективно бросит, если будет больше чем 1 класс с тем именем под различными пространствами имен (потому что Отдельный метод гарантирует, что существует только 1).
Для списка пространств имен для того класса Вы можете:
Assembly.Load("ClassName").GetTypes().Select(t => t.Namespace).Distinct();
Lots of formulas may reference the query. Try temporarially turning on manual calculate in the macro and turning it off when all of your queries are done updating.
This should speed it up a bit, but still doesn't fix the underlying problem.
Я не эксперт, но я запускаю почти такой же код с хорошими результатами. Одно отличие состоит в том, что я использую объект Command
, а также объект Connection
. Где вы
Set RST = Con.Execute(SQLQuery)
Я
Dim cmd As ADODB.Command
Set cmd.ActiveConnection = con
cmd.CommandText = SQLQuery
Set RST = cmd.Execute
Я не знаю, может ли это помочь и почему, но, может быть, поможет? : -)
Я использовал ваш код и вытащил таблицу из 38 столбцов и 63780 строк менее чем за 7 секунд - примерно то, что я ожидал - и меньшие наборы записей завершились почти мгновенно.
Это какую производительность вы испытываете? Если так, то это согласуется с тем, что я ожидал от ADO-соединения Excel с серверной частью MDB.
Если вы наблюдаете гораздо более низкую производительность, чем это, то должны быть некоторые локальные условия среды, которые влияют на ситуацию.
Если вы извлекаете много записей, это объясняет, почему Range (CellPaste)
занимает так много времени. (Если вы выполните запрос в Access, он не получит все записи, но если вы выполните CopyFromRecordset, он потребует все записи.)
Для CopyFromRecordset есть параметр MaxRows:
Public Function CopyFromRecordset ( _
Data As Object, _
<OptionalAttribute> MaxRows As Object, _
<OptionalAttribute> MaxColumns As Object _
) As Integer
Попробуйте установить для него значение низкое значение (примерно 10) изменяет производительность.
Я бы порекомендовал вам создать Recordset
явно, а не неявно, используя
Выполнить метод
.
При явном создании вы можете установить его свойства CursorType и LockType, которые влияют на производительность.
Как я вижу, вы загружаете данные в Excel, а затем закрываете набор записей. Вам не нужно обновлять, подсчитывать записи и т. Д. Поэтому я бы посоветовал создать Recordset
с CursorType = adOpenForwardOnly & LockType = adLockReadOnly
:
...
RST.Open SQLQuery, Con, adOpenForwardOnly, adLockReadOnly
Range(CellPaste).CopyFromRecordset RST
...
Поскольку вы используете Access 2003, используйте вместо этого DAO, это будет быстрее с движком Jet.
См. http://www.erlandsendata.no/english/ index.php? d = envbadacexportdao для примера кода.
Обратите внимание, что вы никогда не должны использовать ключевое слово «As New», так как это приведет к неожиданным результатам.
А как насчет следующих изменений или улучшений:
Я не думаю, что вы сравниваете подобное с подобным.
В Access, когда вы просматриваете представление данных запроса, происходит следующее:
В вашем коде VBA:
Я думаю, что наиболее важным моментом здесь является то, что представление данных в Access не извлекает весь набор результатов, пока вы его не попросите, обычно путем перехода к последней строке в наборе результатов. ADO всегда будет выбирать все строки в наборе результатов.
Вторым по значимости будет время, затрачиваемое на чтение выбранных строк (при условии полного набора результатов) в элемент пользовательского интерфейса, а также тот факт, что Excel не оптимизирован для работы.
Открытие, закрытие и освобождение соединений и наборов записей должно быть незначительным, но все же является фактором.
Я думаю, вам нужно определить время на каждом этапе процесса, чтобы найти узкое место. При сравнении с Access убедитесь, что вы получаете полный набор результатов, например, проверьте количество возвращенных строк.