VBA excel,无需循环即可提高性能

VBA excel,无需循环即可提高性能,excel,vba,performance,Excel,Vba,Performance,我有两个相同的表,我想取其中的行,它们在多列中是相同的(表总是63列,504行,并且不断增加),我使用两个for循环来增加一行中的行,然后将另一行中的所有行与该行进行比较,然后再次增加该行,并将另一行中的所有行与该行进行比较。直到最后一行,然后执行if循环以查看它们是否符合我的条件。问题是它花费了太多的时间(大约8分钟),我尝试使用查找函数,但失败了,因为它只能接受一个值。我添加了错误的屏幕更新、计算和启用事件,甚至将状态栏更改为一些非常基本的内容以提高性能,但它们中没有一个给了我想要的结果 我

我有两个相同的表,我想取其中的行,它们在多列中是相同的(表总是63列,504行,并且不断增加),我使用两个for循环来增加一行中的行,然后将另一行中的所有行与该行进行比较,然后再次增加该行,并将另一行中的所有行与该行进行比较。直到最后一行,然后执行if循环以查看它们是否符合我的条件。问题是它花费了太多的时间(大约8分钟),我尝试使用查找函数,但失败了,因为它只能接受一个值。我添加了错误的屏幕更新、计算和启用事件,甚至将状态栏更改为一些非常基本的内容以提高性能,但它们中没有一个给了我想要的结果

我怎样才能以任何可能的方式提高性能,一个新功能或任何东西

PS有时某些条件并不重要,它取决于某些单元格上的真值或fasle值

For Row_S = 2 To MAX_Row_S
  SourceMonth = Worksheets(NBG_SourceRegionDataWorksheetName).Cells(Row_S, SOP).Value
  SourceMonth = DatePart("m", SourceMonth)
  SourceYear = Worksheets(NBG_SourceRegionDataWorksheetName).Cells(Row_S, SOP).Value
  SourceYear = DatePart("yyyy", SourceYear)
  SourceCarmaker = Worksheets(NBG_SourceRegionDataWorksheetName).Cells(Row_S, carmaker).Value
  SourceProject = Worksheets(NBG_SourceRegionDataWorksheetName).Cells(Row_S, Project).Value
  SourceFamily = Worksheets(NBG_SourceRegionDataWorksheetName).Cells(Row_S, Family).Value
  SourceStatus = Worksheets(NBG_SourceRegionDataWorksheetName).Cells(Row_S, Status).Value
  SourceShare = Worksheets(NBG_SourceRegionDataWorksheetName).Cells(Row_S, Share).Value
  SourceCst = Worksheets(NBG_SourceRegionDataWorksheetName).Cells(Row_S, "A").Value
  SourcePID = Worksheets(NBG_SourceRegionDataWorksheetName).Cells(Row_S, ProjectID).Value

  ' Take the data from NBG_Data_Region sheet to be Compared with each row of the NBG_Data_Source_Region sheet
  For Row_T = 2 To MAX_Row_T
    If Row_T >= MAX_Row_T Then
        Exit For
    End If

    NBGMonth = Worksheets(NBG_RegionaDataWorksheetName).Cells(Row_T, SOP).Value
    NBGMonth = DatePart("m", NBGMonth)
    NBGYear = Worksheets(NBG_RegionaDataWorksheetName).Cells(Row_T, SOP).Value
    NBGYear = DatePart("yyyy", NBGYear)
    NBGCarmaker = Worksheets(NBG_RegionaDataWorksheetName).Cells(Row_T, carmaker).Value
    NBGProject = Worksheets(NBG_RegionaDataWorksheetName).Cells(Row_T, Project).Value
    NBGFamily = Worksheets(NBG_RegionaDataWorksheetName).Cells(Row_T, Family).Value
    NBGStatus = Worksheets(NBG_RegionaDataWorksheetName).Cells(Row_T, Status).Value
    NBGShare = Worksheets(NBG_RegionaDataWorksheetName).Cells(Row_T, Share).Value
    NBGCst = Worksheets(NBG_RegionaDataWorksheetName).Cells(Row_T, "A").Value
    NBGPID = Worksheets(NBG_RegionaDataWorksheetName).Cells(Row_T, ProjectID).Value

    ' StatusBar Show
    Application.StatusBar = "Running"
    'Application.StatusBar = "VerifyMultipleCustomerProjects. Progress: " & Row_S & " of " & MAX_Row_S
    ' Check if any project in the NBG_Data_Region have multiple customers and add it ti the sheet Issue_MultipleCustomerProjects

    ' NAF 20161208

    'Test with Source of YEAR and MONTH
     If ((NBGMonth = SourceMonth Or Worksheets(Issue_MultipleCustomerProjectsWorksheetName).Range("C21") = True) And _
        (NBGYear = SourceYear Or Worksheets(Issue_MultipleCustomerProjectsWorksheetName).Range("C25") = True) And _
        (SourceCarmaker = NBGCarmaker Or Worksheets(Issue_MultipleCustomerProjectsWorksheetName).Range("G25") = True) And _
        (SourceProject = NBGProject Or Worksheets(Issue_MultipleCustomerProjectsWorksheetName).Range("F25") = True) And _
        (SourceFamily = NBGFamily Or Worksheets(Issue_MultipleCustomerProjectsWorksheetName).Range("E25") = True) And _
        (SourceShare + NBGShare <> 1 Or Worksheets(Issue_MultipleCustomerProjectsWorksheetName).Range("H25") = True) And NBGCst <> SourceCst) Then
行数=2到最大行数的

SourceMonth=工作表(NBG\U SourceRegionDataWorksheetName)。单元格(行,SOP)。值
SourceMonth=DatePart(“m”,SourceMonth)
SourceYear=工作表(NBG\U SourceRegionDataWorksheetName)。单元格(行,SOP)。值
SourceYear=DatePart(“yyyy”,SourceYear)
SourceAutomaker=工作表(NBG_SourceRegionDataWorksheetName)。单元格(行,汽车制造商)。值
SourceProject=工作表(NBG\U SourceRegionDataWorksheetName)。单元格(行,项目)。值
SourceFamily=工作表(NBG\U SourceRegionDataWorksheetName)。单元格(行,族)。值
SourceStatus=工作表(NBG\U SourceRegionDataWorksheetName)。单元格(行,状态)。值
SourceShare=工作表(NBG\U SourceRegionDataWorksheetName)。单元格(行,共享)。值
SourceCst=工作表(NBG_SourceRegionDataWorksheetName)。单元格(行“A”)。值
SourcePID=工作表(NBG\U SourceRegionDataWorksheetName)。单元格(行,项目ID)。值
'从NBG_数据_区域表中获取数据,与NBG_数据_源区域表的每一行进行比较
对于行\u T=2到最大行\u T
如果行\u T>=最大行\u T,则
退出
如果结束
NBG月=工作表(NBG_RegionaDataWorksheetName)。单元格(行,SOP)。值
NBGMonth=日期部分(“m”,NBGMonth)
NBGYear=工作表(NBG_RegionaDataWorksheetName)。单元格(行,SOP)。值
NBGYear=DatePart(“yyyy”,NBGYear)
NBGCarmaker=工作表(NBG_RegionaDataWorksheetName)。单元格(行,汽车制造商)。值
NBGProject=工作表(NBG_RegionaDataWorksheetName)。单元格(行,项目)。值
NBGFFAMILY=工作表(NBG_RegionaDataWorksheetName)。单元格(行,族)。值
NBGStatus=工作表(NBG_RegionaDataWorksheetName)。单元格(行,状态)。值
NBGShare=工作表(NBG_RegionaDataWorksheetName)。单元格(行,共享)。值
NBGCst=工作表(NBG_RegionaDataWorksheetName)。单元格(行“A”)。值
NBGPID=工作表(NBG\U RegionaDataWorksheetName)。单元格(行,项目ID)。值
'状态栏显示
Application.StatusBar=“正在运行”
'Application.StatusBar=“VerifyMultipleCustomerProjects.Progress:”&Row\u S&“of”&MAX\u Row\S
'检查NBG_Data_区域中的任何项目是否有多个客户,并将其添加到sheet Issue_MultipleCustomerProject中
“NAF 20161208
'使用年和月的来源进行测试
如果((NBGMonth=SourceMonth或工作表(发布\u MultipleCustomerProjectsWorksheetName).Range(“C21”)=True)和_
(NBGYear=SourceYear或工作表(发布多个项目工作表名)。范围(“C25”)=True)和_
(SourceAutomaker=NBGCarmaker或工作表(发布多个项目工作表名称)。范围(“G25”)=True)和_
(SourceProject=NBG项目或工作表(发布多个项目工作表名称)。范围(“F25”)=True)和_
(SourceFamily=NBGFamily或工作表(发布_MultipleCustomerProjectsWorksheetName)。范围(“E25”)=True)和_
(SourceShare+NBGShare 1或工作表(发布_MultipleCustomerProjectsWorksheetName)。范围(“H25”)=True)和NBGCst SourceCst)然后
您尝试添加了吗

Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayAlerts = False
在代码的开头,以及

Application.ScreenUpdating = True
Application.EnableEvents = True
Application.DisplayAlerts = True
在代码的末尾

这将关闭屏幕更新、事件和警报,从而加快运行时间

此外,如果您决定采用该路线,则加载和卸载阵列是最快的方式

加载数组的示例如下:

Dim arr() As Variant ' let brackets empty, not Dim arr(1) As Variant !

For Each a In Range.Cells
    ' change / adjust the size of array
    ReDim Preserve arr(1 To UBound(arr) + 1) As Variant

    ' add value on the end of the array
    arr(UBound(arr)) = a.Value
Next
迭代数组以提取数据的示例如下:

For Each element In arr 'Each array element
    do_something (element)
Next element

使用数组,而不是经常访问工作表。将所有内容加载到两个数组中,并将数据输出到另一个数组中,您将回发一次。这样,您只需访问这些表三次。它将运行时间缩短到了几秒钟。我将数据加载到数组中。然后,您可以在一个事务中分别从工作表中提取两组数据,然后在数组之间进行任何比较。就目前而言,您正在进行大约280万笔交易,这可以解释速度问题。-@Scott Craner,在同一时间发布,但很好,你有完全相同的逻辑:)@ScottCraner谢谢,数组工作有点棘手,但我正在进行,祝我好运:)我做了,但运行时间减少了几秒钟,你能解释一下加载和卸载数组吗???@NasserAlFanek请看我的更新答案,因为我提供了一个例子。非常感谢你澄清这一点,我将从数组的使用开始,谢谢。只有两个问题,我如何只插入我指定的特定列中的值,数组中可以有字符串和整数吗??