Dividir un gran procedimiento de Excel

Tengo dos procedimientos que se quedan sin memoria debido a que mi conjunto de datos en Excel supera una cantidad muy grande.

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

Arriba está el procedimiento que he estado usando para dividir/recortar una columna de datos en varias filas/columnas.

He puesto los datos en dos columnas, cada una de las cuales consta de 60k filas cada una, lo que tengo que hacer es una vez que haya leído BL, lea BO y continúe donde lo dejó, colocando la segunda fila de datos debajo de la nueva fila desde donde sea que esté la primera. terminado

preguntado el 12 de junio de 12 a las 14:06

¿Qué es una cantidad "muy grande" de datos? ¿Cuántas filas/columnas? -

¿Has probado usar Data->Text To Columns...? -

@TimWilliams Tengo una columna "B3" que lee alrededor de 391349 filas. -

El texto de @Gaffi en columnas no tiene el efecto deseado, los datos para cada sección se dividen por === y luego se llenan desde un - ap transversal. la función funciona cuando el conjunto de datos es más pequeño, pero obviamente, como es bastante grande, necesito una nueva forma de solucionarlo:

arriba está el código editado, por lo que dos columnas con 60k cada una, una vez que haya terminado el proceso a través de la primera columna, quiero que lea donde terminó, la fila 1194, por ejemplo, luego haga lo mismo para la columna dos escribiendo debajo ... gracias de antemano -

1 Respuestas

Algo como esto (NO PROBADO) podría funcionar para usted. Evita crear una enorme matriz 2D mediante el uso de bloques de menor tamaño.

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

Respondido el 14 de junio de 12 a las 02:06

Me aparece un error en: 'd.Add x(1, i), i' La clave ya está asociada con un elemento de esta colección que no puedo descifrar mi título: Zenáforo

¿No son sus encabezados únicos? Eso solo ocurriría si hay más de un encabezado con el mismo contenido. Si desea ignorar eso, vuelva a su sintaxis Item() anterior, o use If Not d.Exists(x(1,i)) Then d.Add, x(1,i), i - tim williams

el encabezado no es único, hay varios departamentos, etc. de todos modos, pero deben manipularse varias veces, no me gusta la función de agregar todavía o volver a mi función anterior con el bloque, así que me conformé con importar un bloque a la vez de 60k filas en la hoja desde la que acabo de volver a ejecutar esta función y le digo que continúe desde la parte inferior, gracias por toda su ayuda. una última pregunta si puedo al final [a2] funcionar allí - Zenáforo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.