1

Excel のデータ セットが非常に膨大な量を超えているため、どちらもメモリ不足になる 2 つの手順があります。

Sub format()
Dim x, Y(), i&, j&, k&, s

x = Range("A1", Cells(1, Columns.count).End(xlToLeft)).Value
With CreateObject("Scripting.Dictionary")
.CompareMode = 1
For i = 1 To UBound(x, 2)
    .Item(x(1, i)) = i
Next i

x = Application.Trim(Range("BL3", Cells(Rows.count, "BL").End(xlUp)).Value)
ReDim Y(1 To UBound(x), 1 To .count): j = 1

For i = 1 To UBound(x)
    If InStr(x(i, 1), "==") = 0 Then
        s = Split(x(i, 1))

        If .Exists(s(0)) Then
        k = .Item(s(0)): Y(j, k) = mid(x(i, 1), Len(s(0)) + 2)
        End If
    Else
        j = j + 1
    End If
Next i
End With

[a2].Resize(j, UBound(Y, 2)).Value = Y()

End Sub

上記は、データの列を複数の行/列に分割/トリミングするために使用してきた手順です。

私はデータを 2 つの列に入れました。それぞれが 60k 行で構成されています。必要なことは、BL を介して読み取り、BO を介して読み取り、中断したところから続行して、最初の行から新しい行の下に 2 番目の行のデータを配置することです。終了した

4

1 に答える 1

1

このようなもの(未テスト)がうまくいくかもしれません。小さいサイズのブロックを使用することで、巨大な 2D 配列の作成を回避します。

Sub format()

Const BLOCK_SIZE As Long = 10000
Dim x, Y(), i&, j&, k&, s
Dim d As Object
Dim rOffset As Long
Dim xCount As Long

    Set d = CreateObject("Scripting.Dictionary")
    d.CompareMode = 1

    x = Range("A1", Cells(1, Columns.Count).End(xlToLeft)).Value
    For i = 1 To UBound(x, 2)
          'using Add: you probably want this to error if duplicates exist...
          d.Add x(1, i), i         
    Next i

    x = Application.Trim(Range("BL3", Cells(Rows.Count, "BL").End(xlUp)).Value)
    xCount = UBound(x)
    rOffset = 0

    ReDim Y(1 To BLOCK_SIZE, 1 To d.Count)
    j = 1

    For i = 1 To xCount
        If InStr(x(i, 1), "==") = 0 Then
            s = Split(x(i, 1))

            If d.Exists(s(0)) Then
                k = d(s(0))
                Y(j, k) = Mid(x(i, 1), Len(s(0)) + 2)
            End If
        Else
            j = j + 1
            If j > BLOCK_SIZE Then
                [a2].Offset(rOffset, 0).Resize(BLOCK_SIZE, d.Count).Value = Y()
                ReDim Y(1 To BLOCK_SIZE, 1 To d.Count)
                j = 1
                rOffset = rOffset + BLOCK_SIZE
            End If
        End If
    Next i

    [a2].Offset(rOffset, 0).Resize(BLOCK_SIZE, d.Count).Value = Y()

End Sub
于 2012-06-13T20:32:30.700 に答える