【发布时间】:2023-02-14 09:49:13
【问题描述】:
所以我正在尝试维护我在 excel 中拥有的库。我的图书馆与下表有点相同。这将在 45000 行上存储数年的数据。但是每个月我都会提取我想包含在数据中的新小时数。虽然可以及时更改数据,所以我总是提取 T、t-1、t-2 和 t-3。所以首先我想获取上个月的数据并将其从我的库中减去,加载新数据,然后添加新的时间。但是随着新数据的出现,总会有新的组合,我想将其添加到库的底部。我试图解决这个问题,并找到了解决方案,但由于我有一个很大的库而且每个月还要提取 85k 行,所以它花了很长时间。组合的原因是几个人可以在一个项目上列出时间,但我不关心谁做的,只是这些东西的组合。这也是为什么我的库中的行数较少的原因。有谁能够帮助我?我提供了我制作的代码,它在做正确的事情,但是速度变慢了。
| Combination | Hours | ProjID | Planning | Approval | Month | Year | Hour type | Charge status |
|---|---|---|---|---|---|---|---|---|
| Proj1Planned42022Fixed | 12 | Proj1 | Planned | 4 | 2022 | Fixed |
Sub UpdateHours()
Dim data1 As Variant, data2 As Variant
Dim StartTime As Double
Dim MinutesElapsed As String
Application.ScreenUpdating = False
StartTime = timer
lastRow = Worksheets("TimeReg_Billable").Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).row
lastRowTRB = Worksheets("TimeRegistrations_Billable").Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).row
data1 = Worksheets("TimeReg_Billable").Range("A2:I" & lastRow).Value
data2 = Worksheets("TimeRegistrations_Billable").Range("A2:W" & lastRowTRB).Value
For i = 1 To lastRow
If i > UBound(data1, 1) Then Exit For
For k = 1 To lastRowTRB
If k > UBound(data2, 1) Then Exit For
If data1(i, 1) = data2(k, 23) Then
data1(i, 2) = data1(i, 2) - data2(k, 15)
End If
Next k
Next i
Worksheets("TimeReg_Billable").Range("A2:I" & lastRow).Value = data1
'Load data
'Workbooks.Open "C:\Users\jabha\Desktop\Projekt ark\INSERTNAMEHERE.xls"
'Workbooks("INSERTNAMEHERE.xls").Worksheets("EGTimeSearchControllingResults").Range("A:AA").Copy _
Workbooks("Projekt.xlsm").Worksheets("TimeRegistrations_Billable").Range("A1")
'Workbooks("INSERTNAMEHERE.xls").Close SaveChages = False
'Insert the new numbers
lastRow = Worksheets("TimeReg_Billable").Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).row
lastRowTRB = Worksheets("TimeRegistrations_Billable").Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).row
myarray = Worksheets("TimeReg_Billable").Range("A2:A" & lastRow)
data1 = Worksheets("TimeReg_Billable").Range("A2:I" & lastRowTRB).Value
data2 = Worksheets("TimeRegistrations_Billable").Range("A2:W" & lastRowTRB).Value
i = 1
Do While i <= lastRow
If i > UBound(data1, 1) Then Exit Do
k = 1
Do While k <= lastRowTRB
If k > UBound(data2, 1) Then Exit Do
If data1(i, 1) = data2(k, 23) Then
data1(i, 2) = data1(i, 2) + data2(k, 15)
End If
If Not data1(i, 1) = data2(k, 23) Then
Teststring = Application.Match(data2(k, 23), myarray, 0)
If IsError(Teststring) Then
data1(lastRow, 1) = data2(k, 23)
data1(lastRow, 3) = data2(k, 11)
data1(lastRow, 4) = data2(k, 16)
data1(lastRow, 5) = data2(k, 17)
data1(lastRow, 6) = data2(k, 20)
data1(lastRow, 7) = data2(k, 21)
data1(lastRow, 8) = data2(k, 22)
data1(lastRow, 9) = data2(k, 7)
lastRow = lastRow + 1
myarray = Application.Index(data1, 0, 1)
End If
End If
k = k + 1
Loop
If data1(i, 9) = "#N/A" Then
data1(i, 9) = ""
End If
i = i + 1
Loop
Worksheets("TimeReg_Billable").Range("A2:I" & lastRowTRB).Value = data1
MinutesElapsed = Format((timer - StartTime) / 86400, "hh:mm:ss")
MsgBox "This code ran succesfully in " & MinutesElapsed & " minutes", vbInformation
End Sub
【问题讨论】:
-
“方式太慢”大约是多长时间?从描述中不太清楚你在做什么:例如。 “我总是提取 T、t-1、t-2 和 t-3”我不知道那是什么意思。