2016-08-24 5 views
0

Я использую динамическую кнопку на одном листе для отправки данных в базу данных/сводный лист в той же книге в Excel.Ввод данных на excel: лист формы в лист базы данных

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

Это работает, но это кропотливо медленно. Пожалуйста, сообщите, как выполнить эту задачу с меньшим спросом на процессор.

'enter into database 
NextSPGP.Value = Range("B7").Value 
NextDate.Value = Format(Range("M7").Value, "mm/dd/yyyy") 
NextStart.Value = Format(Range("A12").Value, "hh:mm") 
NextFinish.Value = Format(Range("B12").Value, "hh:mm") 
NextMix = Range("C12").Text 
NextBatch.Value = Range("D12").Value 
NextGrouter.Value = Range("J7").Value 
NextPump.Value = Range("H7").Value 
NextPass.Value = Range("F7").Value 
NextDepth.Value = Range("E12").Value 
NextSleeve.Value = Range("F12").Value 
NextInitPress.Value = Range("G12").Value 
NextFinalPress.Value = Range("H12").Value 
NextFlow.Value = Range("I12").Value 
NextVol.Value = Range("J12").Value 
NextMove.Value = Range("K12").Value 
NextComment.Value = Range("L12").Value 
+0

Установите 'Application.Screenupdating = False' во время работы. Вы определяете все диапазоны назначения в каком-то другом коде? –

+0

Спасибо за идею. Я всегда хотел знать, как остановить это, но он не обновлял экран от листа до листа, так что это не помогло времени обработки. Целевые диапазоны (т.е. NextSPGP) определяются диапазонами в форме: Set NextSPGP = LastGroutEntry.Offset (1, 0) – Clayton

+0

Если все эти диапазоны NextXxxxx находятся в одной строке, вы можете более эффективно заполнять значения, используя массив, который можно разместить на листе за одну операцию. –

ответ

0

Я обычно начинаю мои процедуры с чем-то вроде этого:

Dim bScreenUpdating As Boolean  'Screen Updating Flag 
    Dim bEnableEvents As Boolean 
    Dim lCalculation As Long 

    With Application 
     bScreenUpdating = .ScreenUpdating 
     bEnableEvents = .EnableEvents 
     lCalculation = .Calculation 
     .ScreenUpdating = False 
     .EnableEvents = False 
     .Calculation = xlCalculationManual 
    End With 

... и закончить их с чем-то вроде этого:

With Application 
     .ScreenUpdating = bScreenUpdating 
     .EnableEvents = bEnableEvents 
     .Calculation = lCalculation 
    End With 

... так что вы поворачиваете что может замедлить прогресс и впоследствии восстановить среду пользователей.

Кроме того, если у вас нет причины использовать .value, используйте .value2. См. Excel MVP и Recalculation. Гуру Чарльз Уильямс отвечает на следующую тему: What is the difference between .text, .value, and .value2?

Обратите внимание, что определение диапазонов в коде VBA, как вы делаете, является рецептом катастрофы. Как только кто-то вставляет/удаляет строку/столбец, все ваши ссылки VBA указывают на неправильные ячейки. I всегда дайте каждому из моих диапазонов интересов именованный диапазон, а затем укажите это имя в VBA.

Кроме того, вы не предоставили нам много информации о вашей настройке рабочей книги. Сколько ценностей мы говорим здесь? Сотни? Тысячи? И что-нибудь ссылается на ячейки назначения в листе адресата? Что еще вы можете рассказать нам об этой книге? т. е. действительно ли это большой файл с множеством формул? Какие формулы? VLOOKUPS? OFFSET или другие летучие функции? Вы записываете эти значения в таблицу Excel, а также ListObject? Они могут действительно замедлить работу, особенно если вы не временно отключите вычисления.

Смотрите следующий пост я написал некоторое время назад для получения более подробной формулы волатильности: http://chandoo.org/wp/2014/03/03/handle-volatile-functions-like-they-are-dynamite/

0

Вместо этого

NextSPGP.Value = Range("B7").Value 
NextDate.Value = Format(Range("M7").Value, "mm/dd/yyyy") 
NextStart.Value = Format(Range("A12").Value, "hh:mm") 
NextFinish.Value = Format(Range("B12").Value, "hh:mm") 
NextMix = Range("C12").Text 
NextBatch.Value = Range("D12").Value 
NextGrouter.Value = Range("J7").Value 
'etc... 

Вы можете сделать что-то вроде:

Dim Arr 
Arr = Array(Range("B7").Value, Format(Range("M7").Value, "mm/dd/yyyy"), _ 
      Format(Range("A12").Value, "hh:mm"),Format(Range("B12").Value, "hh:mm"), _ 
      Range("C12").Text, Range("D12").Value, Range("J7").Value) 


NextSPGP.Resize(1,UBound(Arr)+1).Value = Arr 'populate row in one shot 
+0

Тим, очень ценю вашу помощь. Я знал, что массив или строковая функция были решением, но я не мог найти решение в любом месте в Интернете. Время обработки меньше <2 секунд. Ты мужчина! – Clayton

0

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

MsgBox "Starting data input..." 
enter log data into database 

Dim NewData 
Dim Duration As Date 
Dim PressureDiff As Long 

Duration = Format((Range("B12") - Range("A12")), "hh:mm") 
PressureDiff = (Range("H12") - Range("G12")) 

NewData = Array(Range("B7").Value, Format(Range("M7").Value, "mm/dd/yyyy"), Format(Range("A12").Value, "hh:mm"), _ 
Format(Range("B12").Value, "hh:mm"), Duration, Range("C12").Text, Range("D12").Value, Range("J7").Value, _ 
Range("H7").Value, Range("F7").Value, Range("E12").Value, Range("F12").Value, Range("G12").Value, _ 
Range("H12").Value, PressureDiff, Range("I12").Value, Range("J12").Value, Range("K12").Value, Range("L12").Value) 

NextSPGP.Resize(1, UBound(NewData) + 1).Value = NewData 
MsgBox "Data input complete!" 
Смежные вопросы