2016-08-15 13 views
0

enter image description here
Это пользовательская форма, созданная мной. Затем он используется как входная платформа. Существуют несколько разных таблиц, например ,.2016, 2017 .... Логика этой кнопки сохранения - это поиск Года (Дата), в который пользователь вводит и размещает правильный рабочий лист. Затем он найдет последнюю строку этого листа.Как улучшить скорость сбережения для пользовательской формы в excel VBA

Например, последняя строка строка 1000. Первая строка UserForm будет сэкономить на строке 1001.The второй строке UserForm будет сэкономить на строке 1002 ....

Вопрос

Однако, когда я тестирую в реальном файле excel, скорость сбережения слишком низкая. Поскольку реальный файл excel большой (вокруг строк 1XXXX на каждом рабочем листе). Он использует 8 секунд для сохранения одной строки для пользовательской формы, 13 секунд для сохранения двух строк ,

Очевидно, что экономия скорости неприемлема. Любой метод может его улучшить?

If ComboBox3.Value = "2016" Then 
    Worksheets("2016").Activate 
    j = WorksheetFunction.CountA(Worksheets("2016").Range("A:A")) + 1 
    End If 

    If ComboBox3.Value = "2017" Then 
    Worksheets("2017").Activate 
    j = WorksheetFunction.CountA(Worksheets("2017").Range("A:A")) + 1 
    End If 



    '1st 



    If ComboBox4.Value = "" Then 
    Else 
    Cells(j, 1) = ComboBox434.Value 
    Cells(j, 5) = ComboBox1.Value 
    Cells(j, 4) = ComboBox2.Value 
    Cells(j, 3) = ComboBox3.Value 
    If ComboBox4.ListIndex <> -1 Then 
    Cells(j, 6) = TimeValue(ComboBox4.Value & ":" & ComboBox5.Value) 
    Cells(j, 24) = ComboBox4.Value 
    Cells(j, 25) = ComboBox5.Value 
    Else 
    Cells(j, 6) = "" 
    End If 
    Cells(j, 7) = ComboBox6.Value 
    Cells(j, 8) = ComboBox7.Value 
    Cells(j, 9) = ComboBox8.Value 
    Cells(j, 10) = TextBox2.Value 
    Cells(j, 11) = TextBox3.Value 
    Cells(j, 12) = TextBox4.Value 
    Cells(j, 13) = TextBox5.Value 
    Cells(j, 14) = TextBox42.Value 
    Cells(j, 15) = TextBox43.Value 
    Cells(j, 16) = TextBox44.Value 
    Cells(j, 17) = TextBox666.Value 

    'If ComboBox4.Value = "" Then 

    End If 

    '2nd 

    j = j + 1 

    If ComboBox9.Value = "" Then 
    Else 
    Cells(j, 1) = ComboBox434.Value 
    Cells(j, 5) = ComboBox1.Value 
    Cells(j, 4) = ComboBox2.Value 
    Cells(j, 3) = ComboBox3.Value 
    If ComboBox9.ListIndex <> -1 Then 
    Cells(j, 6) = TimeValue(ComboBox9.Value & ":" & ComboBox10.Value) 
    Cells(j, 24) = ComboBox9.Value 
    Cells(j, 25) = ComboBox10.Value 
    Else 
    Cells(j, 6) = "" 
    End If 
    Cells(j, 7) = ComboBox11.Value 
    Cells(j, 8) = ComboBox12.Value 
    Cells(j, 9) = ComboBox13.Value 
    Cells(j, 10) = TextBox6.Value 
    Cells(j, 11) = TextBox7.Value 
    Cells(j, 12) = TextBox8.Value 
    Cells(j, 13) = TextBox9.Value 
    Cells(j, 14) = TextBox45.Value 
    Cells(j, 15) = TextBox46.Value 
    Cells(j, 16) = TextBox47.Value 
    Cells(j, 17) = TextBox617.Value 
+1

Вы ничего не можете с этим сделать - кроме изменения базы данных. Возможно, вы сможете сэкономить некоторое время, сохранив элементы управления пользователя в массиве и затем сразу же выведя массив в диапазон ячеек. Но я думаю, что настоящий roadblock - это чтение пользовательской формы и запись рабочего листа. – dbmitch

+0

или использовать свойство 'ComboBox.LinkedCell' – Slai

ответ

2

Возможно, вы сэкономите некоторое время, переключив расчет на ручной и затем вычислив после того, как информация была вставлена.

В частности, в начале вашего кода:

With Application 
    .ScreenUpdating = False 
    .EnableEvents = False 
    .Calculation = xlCalculationManual 
End With 

и снова в конце кода:

With Application 
    .ScreenUpdating = True 
    .EnableEvents = True 
    .Calculation = xlCalculationAutomatic 
End With 

Кроме того, вы можете хранить ваши данные в варианте массива , который может быть вставлен в рабочий лист всего за один раз, или массив и изменение размера Cells(j,1) до размера массива

например

Cells(j, 1).resize(Ubound(arr,1), Ubound(arr,2)) = arr 'Need to check for exact syntax 

Это может свести к минимуму количество ударов рабочих листов.