Есть способ улучшить время выполнения? - PullRequest
0 голосов
/ 17 февраля 2020

Я разрабатываю код VBA, который отвечает за поиск в файле Excel значения ячейки (серийного номера) и даты начала ее производства. После этого он ищет в базе данных Access тот же серийный номер и записывает в указанный столбец дату. Проблема в том, что на это уходит несколько часов, потому что в Excel и базе данных более 10000 строк ... Вопрос в том, можно ли улучшить мой код, чтобы он работал быстрее?

Private Sub Comando9_Click()
 Set db = CurrentDb.OpenRecordset("ConsultaNSerie", dbOpenDynaset)
 Set appExcel = CreateObject("Excel.Application")
'appExcel.Visible = True
 appExcel.Application.Workbooks.Open "K:\EM HP - Comum\Planejamento de 
 Produção HP\CB\Planejamento de Produção_CB_FY19-20\Planejamento de 
 Produção_CB_FY19-20.xlsm"

 Dim Inicio_planejado As Variant
 Dim Numero_serie As String
 Dim SAP As String
 i = 9

 Dim fso As Object
 Set fso = CreateObject("Scripting.FileSystemObject")

 Dim Fileout As Object
 Set Fileout = fso.CreateTextFile("K:\EM HP - Engenharia\02-Aplicação\11- 
 Controle de Projetos\Nserie_NoMatch.txt", True, True)

 Do
     SAP = appExcel.Sheets("Disjuntores").Columns("I").Rows(i).Value
     Numero_serie = appExcel.Sheets("Disjuntores").Columns("L").Rows(i).Value
     'MsgBox (Numero_serie)
     Inicio_planejado = 
     appExcel.Sheets("Disjuntores").Columns("T").Rows(i).Value

    If Inicio_planejado <> "" Then
        'MsgBox (Inicio_planejado)
        'quando for vazio, desconsiderar a celula
        'ThisWorkbook.Reg.FindFirst "[OF] = '" + cb_OF.Value + " '"
        db.FindNext "[NUMERO_SERIE] = '" + Numero_serie + " '"
        If db.NoMatch Then
            db.FindPrevious "[NUMERO_SERIE] = '" + Numero_serie + " '"
        ElseIf db.NoMatch Then
            Fileout.Write Numero_serie & "  "
            'MsgBox ("Número de série " + Numero_serie + " não encontrado")
        Else
            'Adicionar o valor de "Inicio_planejado" aos campos na coluna 
     "INICIO_FBR"
            db.Edit
            db![INICIO_FBR] = Inicio_planejado
            db.Update
            db.MoveNext
        End If
End If

i = i + 1

Loop Until appExcel.Sheets("Disjuntores").cells(i, 7) = ""

Fileout.Close
appExcel.Quit

End Sub

1 Ответ

0 голосов
/ 18 февраля 2020

1) Не используйте db.FindNext и db.FindPrevious с одним и тем же критерием поиска. Это не имеет смысла для вашей ситуации.

Используйте только FindFirst и избавьтесь от db.MoveNext:

    db.FindFirst "[NUMERO_SERIE] = '" + Numero_serie + " '"
    If db.NoMatch Then
        Fileout.Write Numero_serie & "  "
    Else
        db.Edit
        db![INICIO_FBR] = Inicio_planejado
        db.Update
        ' Remove this, is is of no use:
        '--- db.MoveNext
    End If

2) В Access отредактируйте таблицу ConsultaNSerie и добавить index на NUMERO_SERIE.

...