Excel 希望提高宏处理循环和将日期转换为其他格式的速度
我下面的代码工作正常,但速度非常慢……事实上,这段代码将我的工作表(称为“测试”)的C列和D列中的日期从格式day.month.year转换为格式day/month/year(例如,请参见下图,第1-2-3-4-5行已经转换,而第1183行的其他行尚未转换) 我正在寻找一个解决方案来提高这个宏的速度,因为如果我在C列和D列中有很多行要转换,那么这个宏的速度真的很慢 如果碰巧有人知道如何提高这个宏的速度,那就太棒了Excel 希望提高宏处理循环和将日期转换为其他格式的速度,excel,vba,date,for-loop,selection,Excel,Vba,Date,For Loop,Selection,我下面的代码工作正常,但速度非常慢……事实上,这段代码将我的工作表(称为“测试”)的C列和D列中的日期从格式day.month.year转换为格式day/month/year(例如,请参见下图,第1-2-3-4-5行已经转换,而第1183行的其他行尚未转换) 我正在寻找一个解决方案来提高这个宏的速度,因为如果我在C列和D列中有很多行要转换,那么这个宏的速度真的很慢 如果碰巧有人知道如何提高这个宏的速度,那就太棒了 在带的块中,立即引用整个范围(以前的选择),而不是循环。这被合并到一个子项中,尽
在带的
块中,立即引用整个范围
(以前的选择
),而不是循环。这被合并到一个子项中,尽管您决定用一个独立的过程声明范围并没有错
Option Explicit
Sub convert()
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Test")
Dim LRow As Long, MyCell As Range, MyRange As Range
LRow = ws.Range("D" & ws.Rows.Count).End(xlUp).Row
Set MyRange = ws.Range("D2:E" & LRow)
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With MyRange
.Value = Format(.Value, "dd/mm/yyyy")
.Replace "/", ".", xlPart, xlByRows
.NumberFormat = "@"
End With
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
不确定您的工作簿中是否有Calc,但您可以尝试将Calc设置为手动,然后在sub应用程序的末尾将Calc设置为自动。Calculation=xlCalculationManual
很抱歉,我在上面的评论中说了一句,造成了混淆,宏将C列和D列中的所有行从格式day.month.year转换为格式day/month/year,但事实恰恰相反,宏将C列和D列中的所有行从格式day/month/year转换为格式day.month.year是否验证了selectallmylinesctrlshift
获取的内容?如果您的工作表上有空数据,它可能会在比需要的范围大得多的范围内循环。您之所以如此缓慢,是因为您一次循环一个单元格并应用数字格式。而且,选择
并不是最好的选择。如果您手动选择某个内容,那么在代码开始时就将其设置为var-如果您在代码中使用选择,请从一开始就使用var,不要使用该方法。非常感谢,我在代码开始时编写了application.Calculation=xlCalculationManual,在代码结束时编写了application.Calculation=xlAutomatic,现在速度真的更快了…最好保留以前的屏幕更新-更改计算设置的宏会让许多用户感到烦恼。将CalcMethod设置为布尔值CalcMethod=Application.Screenupdating Do stuff Application.Screenupdating=CalcMethod不确定您的意思。我从未见过有人抱怨在最后还原时更改了calc设置(假设初始设置是自动的
)@owlssleeping我同意如果初始设置是自动的,就没有问题。这不是保证。
Option Explicit
Sub convert()
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Test")
Dim LRow As Long, MyCell As Range, MyRange As Range
LRow = ws.Range("D" & ws.Rows.Count).End(xlUp).Row
Set MyRange = ws.Range("D2:E" & LRow)
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With MyRange
.Value = Format(.Value, "dd/mm/yyyy")
.Replace "/", ".", xlPart, xlByRows
.NumberFormat = "@"
End With
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub