2016-09-29 99 views
0

我写了下面的代码,将单元格的当前值输入到一个字符串数组中。有52k +行,当在调试模式下运行时,如果我在第二个“执行”中放置一个中断,按F5后代码运行非常快(秒)。如果不输入中断,则需要很长时间(6-8分钟)。VBA excel代码运行时间

有没有人有任何想法为什么会发生这种情况,以及如何解决它?

最佳, Nasos

Do 
    ProjectIDPub(i, 0) = Cells(3 + i, 13).Value & " - " & Cells(3 + i, 3).Value 
    ProjectIDPub(i, 1) = Cells(3 + i, 7).Value 
    i = i + 1 
Loop Until i = numberRowsAXProjectsSheetPub 

i = 0 
Do 
    Cells(3 + i, 14).Value = ProjectIDPub(i, 0) 
    Cells(3 + i, 15).Value = ProjectIDPub(i, 1) 
    i = i + 1 
Loop Until i = numberRowsAXProjectsSheetPub 
i = 0 
+0

我不明白。你为什么不马上做? –

+1

如果你有工作代码只需要改进,那么你可能在这篇文章中错误的地方。 [代码评论](http://codereview.stackexchange.com/)是他们处理现有/工作代码的地方,并且在速度,安全性,可持续性和包括最佳实践在内的使用寿命等方面尽最大努力改进。试一试。他们很棒! – Ralph

回答

3

假设numberRowsAXProjectsSheetPub是阵列ProjectIDPub中的行数时,整个第二环路可以通过

Range(Cells(3,14),Cells(3 + numberRowsAXProjectsSheetPub - 1,15)).Value = ProjectIDPub 

几乎总是快得多到阵列中的单个分配而传递到工作表被替换比在循环中。

+0

非常感谢你我约略微调整了你的代码,这个工作很完美 – Nasos

+0

嗨,约翰,我试着用一维数组的相同方法,它只转移30k行中的第一个元素。 '代码范围(单元格(3,4),单元格(3 + numberRowsEcosSheetPub - 1,4))。Value = projectIDPub' – Nasos

+0

@Nasos在Excel中,范围对应于2维数组,即使它们只有1列。这是一个众所周知的烦恼。有一个涉及使用工作表函数'Transpose'的解决方法 - 但我认为它不适用于30k行。最简单的方法是始终使用2维数组,即使1维是假的:只需将'projectIDPub'声明为例如。 'Dim projectIDPub(1 to 30000,1 to 1)',只需使用'projectID(i,1)'而不是'projectID(i)'。这很乏味,但有时是处理1列范围作为VBA阵列的最佳方式。如果是这样,那么分配将按原样工作。 –

1

您是否尝试过运行带有屏幕更新这些循环禁用?

Application.ScreenUpdating = False 
Do 
ProjectIDPub(i, 0) = Cells(3 + i, 13).Value & " - " & Cells(3 + i, 3).Value 
ProjectIDPub(i, 1) = Cells(3 + i, 7).Value 
i = i + 1 

Loop Until i = numberRowsAXProjectsSheetPub 
i = 0 
Do 
    Cells(3 + i, 14).Value = ProjectIDPub(i, 0) 
    Cells(3 + i, 15).Value = ProjectIDPub(i, 1) 
    i = i + 1 
Loop Until i = numberRowsAXProjectsSheetPub 
i = 0 
Application.ScreenUpdating = True 

而作为@ ali-srn问,为什么你需要两次运行相同的循环?如果第二个循环访问需要由第一个循环创建的某些数据,那么您应该能够根据需要对其进行一些偏移量的修改,如果需要并且只运行一次。

+0

我试图禁用屏幕。我也尝试过一次运行它,但它并没有真正影响完成操作所需的时间。 – Nasos

+0

奇怪的是,修改单元格之前禁用屏幕更新并不会影响执行时间。当遍历很多单元格并修改其内容时,我总是发现它是必需的。 – Pav