ниже макрос используется для сравнения даты проекта сотрудников с днями, заполненными несколькими столбцами, и подсчета количества текущих заданий, которые сотрудник работает в определенный день.уменьшить время выполнения кода
например: - если RAnge Q3: Au3 заполнен датами октября 2013 года, , как q3: 1-й октябрь, r3: 2-й октябрь, s3: 3-й октябрь и т. Д. мой код сравнивает эти индивидуальные даты со стартовой и конечной датой сотрудников с листом temp calc и возвращает счет количества присвоений, на которые работает сотрудник, путем подсчета идентификатора сотрудника. код работает нормально, но для выполнения требуется возраст (для этого около 50 тысяч сотрудников) ive затем применяют фильтры после того, как я получу данные на листе, в первую очередь, чтобы удалить избыточные данные, такие как снятые, неактивные и другие сотрудники. другой фильтр для удаления сотрудников, которые не попадают в мой диапазон сравнения, но сотрудники по-прежнему огромны, а время извлечения также велико. может кто-то объяснить, как я могу сократить время выполнения проекта и все, где я могу очистить код для более быстрого выполнения, потому что данные будут только увеличиваться.
в случае, если я не могу предоставить достаточно подробностей, я добавил свой файл по приведенной ниже ссылке, пожалуйста, посмотрите.
https://docs.google.com/file/d/0B2CrBtuXvhrJSkgwbFZEWHYycTg/edit?usp=sharing
Option Explicit
Sub Count()
' x= no of columns(dashboard calender)
' y= no of rows(dashboard emp id)
' z= no of rows(temp calc sheet emp id)
Application.ScreenUpdating = False
'Clear calender data
Range("Q4").Select
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
Selection.ClearContents
Dim i, j, k, l, d, x, y, z, Empid As Long
Dim currentdate, startdate, enddate As Date
x = (Range("n2") - Range("n1")) + 1
y = Application.WorksheetFunction.counta(Range("A:A")) - 1
z = Application.WorksheetFunction.counta(Worksheets("Temp Calc").Range("A:A")) - 1
For i = 1 To y Step 1 'To loop through the emp_id in dashboard.
For j = 1 To x Step 1 'To loop through the calender in dashboard daywise.
d = 0
For k = 1 To z Step 1 'To loop through the emp_id i temp calc sheet.
Empid = ActiveSheet.Cells(i + 3, 1).Value
currentdate = Cells(3, 16 + j).Value
startdate = Worksheets("Temp calc").Cells(k + 1, 3).Value
enddate = Worksheets("Temp calc").Cells(k + 1, 4).Value
If (Worksheets("Temp calc").Cells(k + 1, 1).Value) = Empid Then
If (currentdate >= startdate) And (currentdate <= enddate) Then 'To check whether the first column date falls within the project start and end date
d = d + 1
End If
End If
Next
Worksheets("Dashboard").Cells(i + 3, j + 16) = d
Next
Next
Range("q4").Select
Application.ScreenUpdating = True
End Sub
Возможно бы получить лучшее производительность, вытягивая данные вашего рабочего листа в массив (или несколько массивов), работает с данными массива, а затем записывает результаты обратно на рабочий лист (ы). (Вы также можете отключить автокалибровку, но это мало поможет, если у вас мало (или простых) вычислений на листе (листах). – chuff
Я не думаю, что на листе есть какие-либо вычисления, за исключением того, из дней в диапазоне дат, который достигается с помощью одной минусовой функции. Сначала я использовал массив для хранения различных данных листа, а затем вложил их в свой лист, но он не отвечал моим дальнейшим потребностям. – mathew
Да, таким образом, маршрут массива лучший вариант. Похоже, вы уже вычисляете размер ваших данных с помощью переменных y и z. Если у вас есть два диапазона данных, объявите два варианта массивов (например, Dim arr1() как Variant), а затем вы можете назначить (arr1 = Range (...)) – chuff