【问题标题】:Speed up vba loop加速 vba 循环
【发布时间】:2019-05-15 14:19:09
【问题描述】:

每周工作中,我都有一个包含大约 15000 名客户的档案,我需要根据他们的姓名将其分为两类。我当前的代码有效,但它遍历每一行需要将近 3 分钟才能运行。提高速度的最佳方法是什么 - 我假设有比我使用的冗长 if 语句更有效的方法?

Option Compare Text

Private Sub CommandButton1_Click()

Dim i As Long

Application.ScreenUpdating = False

For i = 2 To Rows.Count

    If Cells(i, 33).Value = "Business" Then
        Cells(i, 32).Value = "B"
    ElseIf Cells(i, 33).Value = "Personal" Then
        Cells(i, 32).Value = "P"
    ElseIf Cells(i, 12).Value = "N" Then
        Cells(i, 32).Value = "B"
    ElseIf Cells(i, 12).Value = "Y" Then
        Cells(i, 32).Value = "P"
    ElseIf Cells(i, 20).Value = "PREMIER" Then
        Cells(i, 32).Value = "P"
    ElseIf InStr(1, Cells(i, 4), "LTD") <> 0 Then 'Finds each word in customer name, column D, and enters it as business customer
        Cells(i, 32).Value = "B"
    ElseIf InStr(1, Cells(i, 4), "LIMITED") <> 0 Then
        Cells(i, 32).Value = "B"
    ElseIf InStr(1, Cells(i, 4), "MANAGE") <> 0 Then
        Cells(i, 32).Value = "B"
    ElseIf InStr(1, Cells(i, 4), "BUSINESS") <> 0 Then
        Cells(i, 32).Value = "B"
    ElseIf InStr(1, Cells(i, 4), "CONSULT") <> 0 Then
        Cells(i, 32).Value = "B"
    ElseIf InStr(1, Cells(i, 4), "INTERNATIONAL") <> 0 Then
        Cells(i, 32).Value = "B"
    ElseIf InStr(1, Cells(i, 4), "T/A") <> 0 Then
        Cells(i, 32).Value = "B"
    ElseIf InStr(1, Cells(i, 4), "TECH") <> 0 Then
        Cells(i, 32).Value = "B"
    ElseIf InStr(1, Cells(i, 4), "CLUB") <> 0 Then
        Cells(i, 32).Value = "B"
    ElseIf InStr(1, Cells(i, 4), "OIL") <> 0 Then
        Cells(i, 32).Value = "B"
    ElseIf InStr(1, Cells(i, 4), "SERVICE") <> 0 Then
        Cells(i, 32).Value = "B"
    ElseIf InStr(1, Cells(i, 4), "SOLICITOR") <> 0 Then
        Cells(i, 32).Value = "B"
    ElseIf Cells(i, 4).Value = "UIT" Then
        Cells(i, 32).Value = "B"
    Else
        Cells(i, 32).Value = ""
    End If
Next i
Application.ScreenUpdating = True

End Sub

【问题讨论】:

  • 首先不要循环到Rows.Count,而是找到最后一行,灵感here。您不必要地循环了数十万行。
  • 你自己做过关于加速代码的研究吗?我想 Google 会返回一些结果。
  • 无需使用循环。使用.Find.FindNext。这会快得多。 Here 就是一个例子
  • 是否有原因阻止您只对“新”数据(即上周到达的数据)进行排序?或者只有那些在过去一周内更新过的记录/客户......这会更快......
  • 尝试将数据捕获到数组中,然后将结果转置到工作表中。使用内存比处理 excel 文件要快得多。特别是在处理大型数据集时

标签: excel vba performance loops


【解决方案1】:

如果你想加快这个过程,我会停止使用 VBA,而是写一个公式。

示例:要查找单元格是否等于“Business”或“N”,您可以使用以下内容:

=IF(OR(A1="Business";A2="N");"B";"P")

要查找单元格是否包含“业务”,您可以使用以下内容:

=IF(FIND("Business";A1);"B";"P")

使用OR() 工作表函数将所有这些结合起来,您就可以获得全部内容。显然,您需要将公式拖到工作表中的整个列上。

【讨论】:

    【解决方案2】:

    试试

    Private Sub CommandButton1_Click()
    
        Dim i As Long, r As Long
        Dim vDB As Variant
        Dim Ws As Worksheet
        Dim rngDB As Range
    
        Set Ws = ActiveSheet
        Set rngDB = Ws.UsedRange
        vDB = rngDB
        r = UBound(vDB, 1)
    
    
    
        For i = 2 To r
    
            If vDB(i, 33) = "Business" Then
                vDB(i, 32) = "B"
            ElseIf vDB(i, 33) = "Personal" Then
                vDB(i, 32) = "P"
            ElseIf vDB(i, 12) = "N" Then
                vDB(i, 32) = "B"
            ElseIf vDB(i, 12) = "Y" Then
                vDB(i, 32) = "P"
            ElseIf vDB(i, 20) = "PREMIER" Then
                vDB(i, 32) = "P"
            ElseIf InStr(1, vDB(i, 4), "LTD") <> 0 Then 'Finds each word in customer name, column D, and enters it as business customer
                vDB(i, 32) = "B"
            ElseIf InStr(1, vDB(i, 4), "LIMITED") <> 0 Then
                vDB(i, 32) = "B"
            ElseIf InStr(1, vDB(i, 4), "MANAGE") <> 0 Then
                vDB(i, 32) = "B"
            ElseIf InStr(1, vDB(i, 4), "BUSINESS") <> 0 Then
                vDB(i, 32) = "B"
            ElseIf InStr(1, vDB(i, 4), "CONSULT") <> 0 Then
                vDB(i, 32) = "B"
            ElseIf InStr(1, vDB(i, 4), "INTERNATIONAL") <> 0 Then
                vDB(i, 32) = "B"
            ElseIf InStr(1, vDB(i, 4), "T/A") <> 0 Then
                vDB(i, 32) = "B"
            ElseIf InStr(1, vDB(i, 4), "TECH") <> 0 Then
                vDB(i, 32) = "B"
            ElseIf InStr(1, vDB(i, 4), "CLUB") <> 0 Then
                vDB(i, 32) = "B"
            ElseIf InStr(1, vDB(i, 4), "OIL") <> 0 Then
                vDB(i, 32) = "B"
            ElseIf InStr(1, vDB(i, 4), "SERVICE") <> 0 Then
                vDB(i, 32) = "B"
            ElseIf InStr(1, vDB(i, 4), "SOLICITOR") <> 0 Then
                vDB(i, 32) = "B"
            ElseIf vDB(i, 4) = "UIT" Then
                vDB(i, 32) = "B"
            Else
                vDB(i, 32) = ""
            End If
        Next i
        rngDB = vDB
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多