3

最適化しようとしているスプレッドシートがあります。

列の各値を取得し、SQL サーバーから 3 つの「対応する」値を取得する必要があります。以前の方法では、各列の値が 1 つの SQL ルックアップになるため、1 つのシートを更新するだけで、 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 個の空白が追加されることです。

それぞれに 25.000 セルを含む 3 つの列をループして 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

細胞の処理にかかる時間はわずか2秒です75000(100% の細胞にはトリミングが必要です)。

したがって、レコードセットで直接トリミングする別の方法をまだ探している理由がわかりません。

すべてを配列に貼り付けることもできますが、上記が約1時間しかかからない場合、これはおそらくやり過ぎです。2秒。

私のマシンでは配列の所要時間は 1 秒未満です

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 に答える