Excel VBA, ошибка времени выполнения -2147417848 - PullRequest
0 голосов
/ 06 июня 2018

Я использую пользовательскую форму, которая позволяет пользователям сканировать штрих-код и печатать на рабочем листе, у меня также есть этикетка, показывающая общее количество отсканированных кусков.Когда я получаю 170-180 отсканированных фрагментов, это дает мне ошибку времени выполнения.

Run Time Error

'-2147417848 (80010108)

Method 'Cells' of object_WorkSheet' failed



If KeyCode = 13 Then
    'Application.ThisWorkbook.Worksheets("Registos").Cells(1, 30) = Now()
    last = Application.ThisWorkbook.Worksheets("Registos").Range("A65536").End(xlUp).Row
    Length = Len(registos.TextBox3.Text)
    If Length > 32 Or Length < 1 Then
        MsgBox "O código inserido não tem um nº de caracteres válido!", vbExclamation
        'registos.Hide
        'registos.Show
        registos.TextBox3.Text = ""
        registos.TextBox3.SetFocus
            Else
                If registos.TextBox3 <> "" And registos.TextBox1 <> "" And registos.TextBox2 <> "" And registos.TextBox4 = "" And registos.ComboBox5 <> "" Then
                    Application.ThisWorkbook.Worksheets("Registos").Visible = True
                    WS_Count = Application.ThisWorkbook.Worksheets.Count
                    For j = 1 To WS_Count
                        Application.ThisWorkbook.Worksheets(j).Unprotect Password:="stockregistos"
                    Next j
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 1, 1) = Now()                                               'data
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 1, 6) = registos.Label11.Caption                            'cc
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 1, 5) = registos.Label20.Caption                               'ano fiscal
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 1, 7) = a1logiin.TextBox1.Text                              'OPERARIO
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 1, 8) = registos.TextBox1.Text                              'referencia formata
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 1, 9) = registos.TextBox2.Text                              'ordem
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 1, 10) = registos.TextBox3.Text                             'codigo
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 1, 11) = 1                                                  'quantidade
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 1, 12) = registos.ComboBox1                                 'Entrada/Saida
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 1, 13) = registos.ComboBox5                                 ' ESTADO
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 1, 14) = Format(registos.ComboBox3, "#")                    'CODIGO DEFEITO
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 1, 16) = registos.ComboBox6                                 'ORIGEM DEFEITO
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 1, 17) = registos.TextBox5                                  'OBSERVAÇÕES
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 1, 18) = registos.ComboBox7                                    'TIPO
                    contador = contador + 1
                    registos.Label21.Caption = contador
                    GoTo fim2
                End If
fim2:
                If registos.ComboBox1 = "SAÍDA" And registos.TextBox3 <> "" And registos.TextBox1 <> "" And registos.TextBox2 <> "" And registos.TextBox4 = "" And registos.ComboBox5 <> "" And registos.ComboBox2 <> "" Then
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 2, 1) = Now()                                                 'data
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 2, 6) = registos.ComboBox2                                    'cc
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 2, 5) = registos.Label20.Caption                               'ano fiscal
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 2, 7) = a1logiin.TextBox1.Text                                'operario
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 2, 8) = registos.TextBox1                                     'referencia formata
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 2, 9) = registos.TextBox2                                     'ordem
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 2, 10) = registos.TextBox3.Text                               'codigo
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 2, 11) = 1                                                    'quantidade
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 2, 12) = "ENTRADA"                                            'Defenir saída de um CC como a entrade de outro
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 2, 13) = registos.ComboBox5                                   ' ESTADO
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 2, 14) = Format(registos.ComboBox3, "#")                      'CODIGO DEFEITO
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 2, 16) = registos.ComboBox6                                   'ORIGEM DEFEITO
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 2, 17) = registos.TextBox5                                    'OBSERVAÇÕES
                    Application.ThisWorkbook.Worksheets("Registos").Cells(last + 2, 18) = registos.ComboBox7                                    'TIPO
                    GoTo salto
                End If
            registos.Hide
            registos.Show
            registos.TextBox3.Text = ""
            registos.TextBox3.SetFocus
    End If
    registos.Hide
    registos.Show
    registos.TextBox3.Text = ""
    registos.TextBox3.SetFocus
 End If

Я добавил еще немного кода, чтобы вы могли понять, что происходит, и, возможно, увидеть то, что я не осознал.

1 Ответ

0 голосов
/ 06 июня 2018

Ошибка указывает на некоторую перегрузку.Вы можете попытаться изменить структуру кода таким образом, чтобы поместить каждую (большую часть) повторяющихся инструкций в подпрограмму / функцию, поскольку подпрограмма освобождает все переменные (включая объекты) при возврате и освобождает память.

У меня есть еще несколько предложений / вопросов:

  1. Я бы использовал With ... End With вот так:

    Dim regSh as Worksheet
    Set regSh = ThisWorkbook.Worksheets("Registos")
    With regSh
        .Cells(last + 2, 1) = Now()
        .Cells(last + 2, 6) = registos.ComboBox2
        ....
    End With
    

Этот метод загружает объект листа в память только один раз и сохраняет его там до End With, что приводит к некоторому улучшению производительности.

Я бы реструктурировал код, чтобы избежать GoTos. Немного неясно, почему вы Me.Show лист сразу после Me.Hide Похоже, вы снимаете защиту со всех листовв книге в каждом цикле.Вы уверены, что это необходимо?Это требует больших усилий.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...