VBA: оптимизация программы - PullRequest
0 голосов
/ 01 июля 2011

Итак, этот вопрос состоит из двух частей.Во-первых, нужно посмотреть, есть ли быстрый и простой код, который я могу включить в свой текущий саб, чтобы проверить, как быстро саб будет работать.Мне просто нужна точность до секунд и, может быть, до пары минут.

Во-вторых, я сейчас пытаюсь оптимизировать время работы моего сабвуфера.Это функция поиска, которая позволяет пользователю указать, какие переменные выбрать для поиска, и отображает результаты в следующей таблице.Я занимался серфингом в сети и сделал следующие общие приложения, чтобы ускорить мою программу

  1. отключить обновление экрана в начале моего саба
  2. избегать копирования и вставки в буфер обменанасколько возможно

Однако моей программе по-прежнему требуется ~ 5-10 секунд для запуска каждый раз, когда пользователь запускает поиск.Я хотел бы уменьшить это время как можно больше.

Я понимаю, что, не глядя на мой код, сложно дать конкретные предложения, но я сейчас просто ищу общие предложения.Если после реализации общих принципов он все еще будет медленным, я опубликую свой код здесь.

Моя программа поиска является программой линейного поиска и сохраняет значения в массиве.Моя функция поиска может вместить до 4 переменных поиска, и я сохраняю каждый поиск в массиве, а в конце объединяю массив в массив окончательных результатов.

1 Ответ

0 голосов
/ 01 июля 2011

Я обычно использую функцию API GetTickCount.Пока вы не собираетесь измерять время в течение недель или месяцев, оно должно быть точным.Ниже приведен пример, показывающий, как рассчитываются различные циклические измерения.1 галочка = 1 мс

Private Declare Function GetTickCount Lib "kernel32" () As Long 

Sub test() 
Dim nTime 

nTime = GetTickCount 
Set load_array = Range("a5:z65000") 
array_index = WorksheetFunction.Match("Test 15", WorksheetFunction.Index(load_array, 0, 1), 0) 

rngtimer = GetTickCount - nTime 


nTime = GetTickCount 
load_array = Range("a5:z65000").Value 
array_index = WorksheetFunction.Match("Test 15", WorksheetFunction.Index(load_array, 0, 1), 0) 

arraytimer = GetTickCount - nTime 


nTime = GetTickCount 
load_array = Range("a5:z65000").Value 
For a = LBound(load_array) To UBound(load_array) 
If load_array(a, 1) = "Test 15" Then 
array_index = a 
End If 
Next 

arraylooptimer = GetTickCount - nTime 

nTime = GetTickCount 

For a = 1 To 65000 
If Range("a5").Offset(a, 0) = "Test 15" Then 
array_index = a 
End If 
Next 

excelooptimer = GetTickCount - nTime 

MsgBox ("Range Search: " & rngtimer & vbCrLf & _ 
"Array Search: " & arraytimer & vbCrLf & _ 
"ArrayLoop Search: " & arraylooptimer & vbCrLf & _ 
"ExcelLoop Search: " & excelooptimer) 
End Sub 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...