此Excel VBA宏太慢

此Excel VBA宏太慢,vba,excel,Vba,Excel,有没有办法加速这个代码。我对VBA非常陌生(这周才真正开始),我尝试编写这个宏,根据财务模型自动计算需要借款的金额 为了提供一些上下文,此单元格通知另一张工作表上的峰值借款要求(pbr)单元格,但当您增加所需贷款(fr)的价值时,由于借款金额的利息和各种其他费用,pbr将完全增加 我已经创建了一系列while循环,以使fr值最接近10000,但是速度非常慢。我相信一定有更优雅的方式来写这篇文章,但我似乎无法理解。最好我想把它变成一个函数而不是一个子函数,但我甚至不确定这是否可行 这是迄今为止的代

有没有办法加速这个代码。我对VBA非常陌生(这周才真正开始),我尝试编写这个宏,根据财务模型自动计算需要借款的金额

为了提供一些上下文,此单元格通知另一张工作表上的峰值借款要求(pbr)单元格,但当您增加所需贷款(fr)的价值时,由于借款金额的利息和各种其他费用,pbr将完全增加

我已经创建了一系列while循环,以使fr值最接近10000,但是速度非常慢。我相信一定有更优雅的方式来写这篇文章,但我似乎无法理解。最好我想把它变成一个函数而不是一个子函数,但我甚至不确定这是否可行

这是迄今为止的代码,如果您能提供任何帮助,我们将不胜感激

' Sub procedure to calculate the peak borrowing requirement'

Sub calculateFacilityRequiredButton()
Dim pbr As Long ' stores the initial peak borrowing requirement from the viability page
Dim fr As Long ' stores the facility required from the inputs page

' set pbr variable as the value from the viability page 
Worksheets("Viability").Activate
pbr = Cells(9, "k").Value

' set the starting value at the current peak borrowing rate from the viability page

Worksheets("Viability").Activate
fr = Cells(9, "K").Value

Do While fr <= pbr
If fr <= pbr Then

fr = fr + 1000000
Worksheets("Inputs").Activate
Range("N47").Value = fr

Worksheets("Viability").Activate
pbr = Cells(9, "k").Value

End If

Loop


Do While fr > pbr + 100000
If fr > pbr + 100000 Then

fr = fr - 100000
Worksheets("Inputs").Activate
Range("N47").Value = fr

Worksheets("Viability").Activate
pbr = Cells(9, "k").Value



End If

Loop

Do While fr > pbr + 10000
If fr > pbr + 10000 Then

fr = fr - 10000
Worksheets("Inputs").Activate
Range("N47").Value = fr

Worksheets("Viability").Activate
pbr = Cells(9, "k").Value



End If

Loop

Worksheets("Inputs").Activate

End Sub
“计算峰值借款需求的子程序”
子计算FacilityRequiredButton()
Dim pbr As Long“存储可行性页面中的初始峰值借用需求
Dim fr As Long“存储输入页面中所需的设施
'将pbr变量设置为可行性页面中的值
工作表(“可行性”)。激活
pbr=单元格(9,“k”)。数值
'从可行性页面将起始值设置为当前峰值借款利率
工作表(“可行性”)。激活
fr=单元(9,“K”)。数值
当fr pbr+100000时,则执行此操作
fr=fr-100000
工作表(“输入”)。激活
范围(“N47”)。值=fr
工作表(“可行性”)。激活
pbr=单元格(9,“k”)。数值
如果结束
环
当fr>pbr+10000时执行
如果fr>pbr+10000,则
fr=fr-10000
工作表(“输入”)。激活
范围(“N47”)。值=fr
工作表(“可行性”)。激活
pbr=单元格(9,“k”)。数值
如果结束
环
工作表(“输入”)。激活
端接头

尽量不要一直激活,这样做

工作表(“目的地”).range(“A1”).value=工作表(“源”).range(“A1”).value


参考工作表,而不是激活它们。

您的
循环似乎与您的
if
条件具有相同的条件。从我所看到的,它将只在
While
循环中执行一个循环。因此,我认为您不需要
while
循环。另外,正如其他人提到的,不要尝试激活工作表将您的工作表限定为:

Dim oW As Worksheet: Set oW = ThisWorkbook.Worksheets("Viability")

然后可以将其用作
oW.Range(“N47”).Value=fr
。这将为您指明正确的方向

以供参考,以防有人遇到类似的类似问题。根据扎克的回答,这是一个对我有效的解决方案

Sub CalculateFR()
' Sub procedure to calculate the peak borrowing requirement'

Dim pbr As Long ' stores the initial peak borrowing requirement from the viability page
Dim fr As Long ' stores the facility required from the inputs page
Dim oWV As Worksheet
Dim oWI As Worksheet

Set oWV = Sheets("Viability")
Set oWI = Sheets("Inputs")


' set pbr variable as the value from the viability page

pbr = oWV.Range("K9").Value

' set the starting value at the current peak borrowing rate from the viability page

fr = oWV.Range("K9").Value


Do While fr <= pbr

fr = fr + 1000000
oWI.Range("N47").Value = fr

pbr = oWV.Range("K9").Value

Loop

Do While fr <= pbr + 100000

fr = fr + 100000
oWI.Range("N47").Value = fr

pbr = oWV.Range("K9").Value

Loop

Do While fr <= pbr + 10000

fr = fr + 10000
oWI.Range("N47").Value = fr

pbr = oWV.Range("K9").Value

Loop

End Sub
子计算器fr()
“计算峰值借款需求的子程序”
Dim pbr As Long“存储可行性页面中的初始峰值借用需求
Dim fr As Long“存储输入页面中所需的设施
将oWV设置为工作表
Dim oWI As工作表
设置oWV=工作表(“可行性”)
设置oWI=图纸(“输入”)
'将pbr变量设置为可行性页面中的值
pbr=oWV.范围(“K9”)值
'从可行性页面将起始值设置为当前峰值借款利率
fr=oWV.范围(“K9”)值

做一件事,去除所有激活,例如
工作表(“输入”).Range(“N47”).Value=fr
。慢到底有多慢?使用数组比在工作表上做任何事情都要快得多。解算器的工作速度不是比VBA快吗?您的
while
循环似乎与
for
循环具有相同的条件。从我所看到的,它将只在
while
循环中执行一个循环。因此,我认为您不需要
while
循环。另外,正如其他人提到的,不要尝试激活工作表。确认您的工作表(即,将您的工作表设置为
Dim-oW-as-worksheet:set-oW=thiswook.Worksheets(“可行性”)
)。然后可以将其用作
oW.Range(“N47”).Value=fr
。这将为您指明正确的方向与Olly达成一致,这听起来非常像一个解决问题的人会处理得更好更快。当然,你也可以使用VBA中的解算器,谢谢大家的帮助@Zac你能把你的评论作为一个答案发表吗?这样我就可以在我使用的解决方案上标记它了?这已经从15秒左右变成了即时的感谢。