3

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

我必须获取列中的每个值,并从 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”记录集,完成后,我执行以下操作:

CopyFromRecordSet rs

问题是,其中的字段rs长度是固定的,所以如果“registreringsnr”是 2 个字符,那么它将附加 48 个空格。

有没有办法删除空格,而不必遍历 3 列,每列有 25.000 个单元格并删除 WhiteSpaces ?

4

1 回答 1

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

处理细胞仅需275000秒(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
于 2013-10-30T13:00:39.663 回答