我在一张工作表上使用动态按钮将数据发送到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 :(得分: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 Guru Charles Williams'回到以下主题: What is the difference between .text, .value, and .value2?
请注意,像您一样在VBA代码中定义范围是一种灾难。只要有人插入/删除行/列,所有VBA引用都指向错误的单元格。我总是为我的每个感兴趣的范围提供一个命名范围,然后在VBA中引用该名称。
另外,您还没有向我们提供有关您的工作簿设置的大量信息。我们在这里讨论多少个值?数百?成千上万的?是否有任何引用目标表中的目标单元格?关于这本工作簿你还能告诉我们什么?即它是一个包含大量公式的大文件?什么样的公式? VLOOKUPS? OFFSET或其他易变函数?您是否将这些值写入Excel表格ListObject?这些可以真正减慢速度 - 特别是如果你不暂时关闭计算。
请参阅以下文章,我写了一些时间回来了解有关公式波动率的更多信息: http://chandoo.org/wp/2014/03/03/handle-volatile-functions-like-they-are-dynamite/
答案 1 :(得分: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
答案 2 :(得分: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!"