Страницы: 1
RSS
Долго вносятся данные из формы
 
Уважаемые форумчане!  
Заполняю таблицу при помощи формы. На кнопке "Ввести данные" следующий код:  
Private Sub ВнестиДанные_Click()  
ScreenUpdating = False  
n = Cells(Rows.Count, 1).End(xlUp).Row + 1  
Cells(n, 1).Value = Label8.Caption  
Cells(n, "g").Value = TextBox1.Value  
Cells(n, "c").Value = TextBox2.Value  
Cells(n, "b").Value = Cells(ActiveCell.Row, "b").Value  
Cells(n, "d").Value = Cells(ActiveCell.Row, "d").Value  
Cells(n, "e").Value = Cells(ActiveCell.Row, "e").Value  
Cells(n, "f").Value = Cells(ActiveCell.Row, "f").Value  
Cells(n, "j").Value = Cells(ActiveCell.Row, "j").Value  
Cells(n, "k").Value = Cells(ActiveCell.Row, "k").Value  
Cells(n, "l").Value = Cells(ActiveCell.Row, "l").Value  
Cells(n, "m").Value = Cells(ActiveCell.Row, "m").Value  
Cells(n, "n").Value = Cells(ActiveCell.Row, "n").Value  
Cells(n, "o").Value = Cells(ActiveCell.Row, "o").Value  
Cells(n, "p").Value = Cells(ActiveCell.Row, "p").Value  
Cells(n, "q").Value = Cells(ActiveCell.Row, "q").Value  
Cells(n, "s").Value = "текст"  
Cells(n, "t").Value = ComboBox2.Value  
Cells(n, "u").Value = ComboBox1.Value  
Cells(n, "v").Value = Val(TextBox3.Value)  
Cells(n, "w").Value = TextBox4.Value  
Cells(n, "x").Value = TextBox6.Value  
Cells(n, "y").Value = TextBox5.Value  
ScreenUpdating = True  
End Sub  
Данные вносятся, но происходит это в течение нескольких минут.  
Можете подсказать, в чем загвоздка?
 
Возможных причин всего 2:  
1) много формул, а вы не отключаете их пересчёт на вермя работы макроса  
2) присутствуют макросы обработки событий листа    
(например, что-то запускается при изменении значений ячеек)  
 
Решение: добавьте в начало макроса строки  
Application.Calculation = xlCalculationManual  
Application.enableevents = false  
Application.screenupdating = false  
 
а в конец макроса - это:  
Application.Calculation = xlCalculationAutomatic  
Application.enableevents = true  
Application.screenupdating = true
 
Формул действительно много (около 100 столбцов, где примерно половина вычисляемые), более 3000 строк. Плюс несколько вспомогательных листов, где тоже вычисления.  
Однако без формы новая строка создается быстро, просто операторы допускают ошибки при вводе, поэтому я и хочу использовать форму.  
Макросов обработки листа нет.  
Предложенный Вами вариант ускорил работу очень незначительно. При этом когда я попробовал на "пустой" таблице (2-3 строки) скорость заполнения такая же низкая.  
Думаю (почти уверен), что код неоптимален. Может, кто-то подскажет, как его улучшить?  
И еще сюда же вопрос:  
я использую 2007 и у меня на листе используется таблица. Если новая строка вводится вручную, то все вычисляемые поля "дублируются" в соответствующих ячейках новой записи. Если строка создается при помощи предложенного кода, то в полях, где должны быть вычисления, пусто. Как решить еще эту задачу?  
Всем откликнувшимся - заранее спасибо
 
Попробуй так  
 
   Dim arrayAG(1 To 1, 1 To 5) As Variant  
   Dim arrayJY(1 To 1, 10 To 25) As Variant  
   Dim source As Variant, sN As Long, sRow As Long  
     
   Application.Calculation = XlCalculation.xlCalculationManual  
   ActiveSheet.EnableCalculation = False  
   Application.EnableEvents = False  
   Application.ScreenUpdating = False  
   sN = CStr(Cells(Rows.Count, 1).End(xlUp).Row + 1)  
   sRow = CStr(ActiveCell.Row)  
   source = Range("B" & sRow & ":Q" & sRow).Value  
     
   arrayAG(1, 1) = Label8.Caption  
   arrayAG(1, 2) = source(1, 1)  
   arrayAG(1, 3) = TextBox2.Value  
   arrayAG(1, 4) = source(1, 3)  
   arrayAG(1, 5) = source(1, 4)  
   arrayAG(1, 6) = source(1, 5)  
   arrayAG(1, 7) = TextBox1.Value  
     
   arrayJY(1, 1) = source(1, 9)  
   arrayJY(1, 2) = source(1, 10)  
   arrayJY(1, 3) = source(1, 11)  
   arrayJY(1, 4) = surce(1, 12)  
   arrayJY(1, 5) = source(1, 13)  
   arrayJY(1, 6) = source(1, 14)  
   arrayJY(1, 7) = source(1, 15)  
   arrayJY(1, 8) = source(1, 16)  
   arrayJY(1, 19) = "òåêñò"  
   arrayJY(1, 20) = ComboBox2.Value  
   arrayJY(1, 21) = ComboBox1.Value  
   arrayJY(1, 22) = Val(TextBox3.Value)  
   arrayJY(1, 23) = TextBox4.Value  
   arrayJY(1, 24) = TextBox6.Value  
   arrayJY(1, 25) = TextBox5.Value  
   Range("A" & sN & ":G" & sN).Value = arrayAG  
   Range("J" & sN & ":Y" & sN).Value = arrayJY  
     
   Application.Calculation = XlCalculation.xlCalculationAutomatic  
   ActiveSheet.EnableCalculation = True  
   Application.EnableEvents = True  
   Application.ScreenUpdating = True  
   ActiveSheet.Calculate
 
{quote}{login=anvg}{date=05.12.2011 09:39}{thema=}{post}Попробуй так  
 
     
   arrayAG(1, 6) = source(1, 5)  
     
   ActiveSheet.Calculate{/post}{/quote}  
 
На этой строке вылетает ошибка. Увы...
 
Ну, ошибся я. Мог бы и сам подправить, измени  
Dim arrayAG(1 To 1, 1 To 5) As Variant  
на  
Dim arrayAG(1 To 1, 1 To 7) As Variant  
 
А эта строка при чём?  
ActiveSheet.Calculate
 
> Думаю (почти уверен), что код неоптимален. Может, кто-то подскажет, как его улучшить?  
 
Код, конечно, неоптимален, - но это не должно сказываться на производительности.  
Вы же всё равно не заметите разницу в тысячные доли секунды.  
 
А виноват во всем, наверняка, пересчёт формул.  
 
1) попробуйте код на новом файле без формул (не этот файл очистите, а новый создайте)  
Обнаружите, что ввод данных в ячейки выполняется моментально  
 
2) Попробуйте на вашем файле, только предварительно вручную отключите пересчёт формул  
(или удалите все формулы)  
Сразу поймёте, в чем причина.  
 
PS: Могут быть формулы в именах книги  
PPS: Во время тормозов что отображается в строке состояния Excel ?  
Надпись "Расчёт ячеек...", или что?
 
To ANVG:  
Извините, я пока профан, только учусь. Аналогичная ошибка вылетела на строке arrayJY(1, 1) = source(1, 9)  
Но по аналогии я исправил Dim arrayJY(1 To 1, 10 To 25) As Variant на Dim arrayJY(1 To 1, 1 To 25) As Variant - сработало.  
Строка ActiveSheet.Calculate в цитате, конечно, лишняя.  
 
To EducatedFool:  
На новом файле, действительно, работает "влет". Но мне-то в реальности нужна моя таблица, в которой формулы нужны.  
В строке состояния идет надпись "Расчет 2 Процессоры ххх%" и висит довольно долго.  
В используемых именах формул нет, но имена используются довольно активно.  
 
Прикладываю файл, практически очищенный от "лишних" для данной темы листов и имен (чтобы вместиться в 100к). Формат 2007
 
сорри, файл не прицепился
 
Идея у меня простая. Запись массивов быстрее, чем запись в каждую отдельную ячейку. Соответственно второй индекс массива отвечает за номер столбца в таблице. Тут у меня и ошибка. Правильно всё же 10 to 25. Проставь правильные номера столбцов. У меня нет исходника, чтобы тестировать правильность выполнения - написано навскидку.    
В принципе, EducatedFool - прав. Можно оставить и твой код, скорость не сильно упадёт, но добавить блокировку вычислений на листе  
ActiveSheet.EnableCalculation = False  
Не забудь включить в конце процедуры. Поэтому  
ActiveSheet.Calculate  
не лишнее, а команда на пересчёт внесённых изменений
Страницы: 1
Читают тему
Наверх
Loading...