使用CopyFromRecordSet时修剪空格

时间:2013-10-30 12:47:24

标签: excel excel-vba recordset vba

我有一个电子表格,我正在尝试优化。

我必须在列中获取每个值,并从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?

1 个答案:

答案 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