Excel - Matrices VBA Subindice fuera del intervalo

 
Vista:
sin imagen de perfil

Matrices VBA Subindice fuera del intervalo

Publicado por Cooltan (3 intervenciones) el 18/07/2017 14:43:14
Hola a todos/as

Tengo varios archivos xml, que voy tratando uno por uno. Cojo el primero lo trato y me quedo con su información y cuando termino de recorrerlo paso al siguiente, y así hasta que ya no me queden mas archivos por tratar.

El problema es que cuando intento redimensionar la matriz, no me deja, ya que me da un erro de subíndice fuera del intervalo. No se como hacer para que la matriz vaya incrementándose cada vez que trato un nuevo fichero, eso sí manteniendo la información. Les detallo lo que tengo:

La variable Matriz () as Variant. La tengo declarada de esta forma.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
While MyFile <> ""
    Workbooks("Fichero.xlsm").Activate
    XMLFileName = Mydir & MyFile
    Oxmlfile.Load (XMLFileName)
    Set nodes = Oxmlfile.SelectNodes("//AINVOICELIST/*")
    aux_node = nodes.Length  'Longitud del nodo
    n = n + aux_node
    j = 1
    ReDim Preserve Matriz(n, 30)
    n = 0
    For Each node1 In nodes         
      y = 0
      Matriz(n, y) = node1.SelectSingleNode("SC").nodeTypedValue()
      Matriz(n, y + 1) = Fact & node1.SelectSingleNode("I").nodeTypedValue()
      Matriz(n, y + 2) = node1.SelectSingleNode("DATE").nodeTypedValue()
      n = n + 1
    Next

Posteriormente llamo a una function que se encarga de llevarme el fichero tratado a otra carpeta y empezar con el siguiente.
Traslado_fichero (MyFile)
1
MyFile = Dir(Path & MyExtension)

Cuando empiezo a tratar el Segundo fichero e intento redimensionar la matriz, es cuando ya me salta el error. Justo aquí ReDim Preserve Matriz(n, 30), me muestra el mensaje "Subindice fuera del intervalo"

Me han comentado que el problema es que la variable Matriz es una matriz multidimensional, de hecho, bidimensional, y ReDim sólo redimensiona la última de las dimensiones.

Podrían decirme como podria solucionarlo, alguna idea??

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Matrices VBA Subindice fuera del intervalo

Publicado por Antoni Masana (2478 intervenciones) el 19/07/2017 07:21:12
El problema del Redim es el Preserve.

El primer ejemplo SI funciona

1
2
3
4
5
6
Private Sub Boton_Click()
    Dim Matriz(), n
    For n = 1 To 100
        ReDim Matriz(n, 30)
    Next
End Sub

y el segundo ejemplo NO funciona

1
2
3
4
5
6
Private Sub Boton_Click()
    Dim Matriz(), n
    For n = 1 To 100
        ReDim Preserve Matriz(n, 30)
    Next
End Sub

pero así SI que funciona

1
2
3
4
5
6
Private Sub Boton_Click()
    Dim Matriz(), n
    For n = 1 To 100
        ReDim Preserve Matriz(30, n)
    Next
End Sub

Hay dos opciones:

1.- Leer primero los ficheros para saber la dimensión de la tabla y posteriormente volver a leerlos para tratar la información.
2.- Invertir las dimensiones

ReDim Preserve Matriz(n ,30) --> ReDim Preserve Matriz(30,n)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
While MyFile <> ""
    Workbooks("Fichero.xlsm").Activate
    XMLFileName = Mydir & MyFile
    Oxmlfile.Load (XMLFileName)
    Set nodes = Oxmlfile.SelectNodes("//AINVOICELIST/*")
    aux_node = nodes.Length  'Longitud del nodo
    n = n + aux_node
    j = 1
    ReDim Preserve Matriz(30, n)
    n = 0
    For Each node1 In nodes
      y = 0
      Matriz(y, n) = node1.SelectSingleNode("SC").nodeTypedValue()
      Matriz(y + 1, n) = Fact & node1.SelectSingleNode("I").nodeTypedValue()
      Matriz(y + 2, n) = node1.SelectSingleNode("DATE").nodeTypedValue()
      n = n + 1
    Next

Me quedo con la segunda.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Matrices VBA Subindice fuera del intervalo

Publicado por Cooltan (3 intervenciones) el 19/07/2017 10:56:17
Buenos días Antoni, muchas gracias por tu respuesta,

Pero la cosa es que necesito que sea n filas por 30 columnas siempre, entonces, si invierto las dimensiones como lo trato?

Otra opción que se me ocurre seria, trato el primer fichero y relleno la matriz, una vez acabe de tartar el primer fichero, copio la información de la matriz en otra matriz, y borro la matriz primera, voy al Segundo fichero, lo trato y una vez tratado, copio la información en la otra matriz a partir del siguiente element, y borro la primera y así sucesivamente, pero no se como hacerlo, podrías ponerme algún ejemplo please.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Matrices VBA Subindice fuera del intervalo

Publicado por Cooltan (3 intervenciones) el 19/07/2017 12:36:47
lo hice gracias, al final use la 1º pción queme dijiste, y fue genial muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Matrices VBA Subindice fuera del intervalo

Publicado por Antoni Masana (2478 intervenciones) el 19/07/2017 23:17:23
De hecho invertir los Indices en la tabla Matriz no debería afectarte en nada. Es lo mismo Matriz(Col, Fil) que lo mismo es Matriz(Fil,Col)

Cuando guardes los datos lo haces en el formato que quieras pero en memoria no hay ninguna diferencia, es mas esta tabla no puede existir por que no tenemos 4 dimensiones:

1
Dim Tabla(15, 48, 10, 34)

Es una tabla de 4 indices que se puede crear.

Estos dos ejemplo te dan el mismo resultado:

Ejemplo 1
1
2
3
4
5
For Fila = 1 to n
    For Columna = 1 to 30
        Cells(Fila, Columna) = Matriz(Fila, Columna)
    Next
Next


Ejemplo 2
1
2
3
4
5
For Fila = 1 to n
    For Columna = 1 to 30
        Cells(Fila, Columna) = Matriz(Columna, Fila)
    Next
Next

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar