我有一个电子表格,我正在尝试优化。
我必须在列中获取每个值,并从SQL服务器获取3个“对应”值, 以前的方式是每个列值导致1个SQL查找,所以只是为了更新单个表,调用了超过75.000个sql请求。 (7.5小时)
然后重写它,只做一个SQL调用,并将整个表放入“本地”记录集,并将每个列值与记录集进行比较并写入相应的列(50分钟)
为了进一步改进,我创建了一个本地记录集
Set rs = New ADODB.Recordset
With rs.Fields
.Append "registreringsnr", adChar, 50
.Append "security_type", adChar, 50
.Append "security_group", adChar, 128
End With
将每个列值与SQL中的记录集进行比较,并将值添加到我的“rs”Recordset中,当我完成后,我执行:
CopyFromRecordSet rs
问题是,rs
中的字段长度是固定的,所以如果“registreringsnr”是2个字符,那么它将附加48个空格。
有没有办法删除空格,而不必遍历3列,每列包含25.000个单元格并删除WhiteSpaces?
答案 0 :(得分:1)
使用以下代码填充一系列3 x 25000个单元格(仅用于测试目的)
Sub Fill()
Application.ScreenUpdating = False
Dim i As Long, j As Long
For i = 1 To 25000
For j = 1 To 3
Cells(i, j) = Chr(32) & Chr(32) & Chr(32) & Int((50 - 0 + 1) * Rnd + 0) & _
Chr(32) & Chr(32) & Chr(32)
Next j
Next i
Application.ScreenUpdating = True
End Sub
并正在运行
Sub Trimming()
Application.ScreenUpdating = False
Dim stNow As Date
stNow = Now
Dim i As Long, j As Long
For i = 1 To 25000
For j = 1 To 3
Cells(i, j) = Trim(Cells(i, j))
Next j
Next i
Debug.Print DateDiff("s", stNow, Now)
Application.ScreenUpdating = True
End Sub
仅需 2 秒来处理75000
个单元格(100%单元格需要修剪)。
所以我不确定你为什么还在寻找一种替代方法来直接在记录集中修剪它。
你可以把它全部放在一个数组中,但如果以上只需要大约,这可能是一个过度杀伤。 2秒。
数组在我的机器上只需不到一秒
Sub TrimminArr()
Application.ScreenUpdating = False
Dim stNow As Date
stNow = Now
Dim arr As Variant
arr = Range("A1:C25000")
Dim i As Long, j as long
For i = LBound(arr, 1) To UBound(arr, 1)
For j = LBound(arr, 2) To UBound(arr, 2)
arr(i, j) = Trim(arr(i, j))
Next j
Next i
Range("A1:C25000").ClearContents
Range("A1").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
Debug.Print DateDiff("s", stNow, Now)
Application.ScreenUpdating = True
End Sub