** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Copiar Matriz en otra Matriz VBA
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Copiar Matriz en otra Matriz VBA

 Responder Responder
Autor
Mensaje
Cooltan Ver desplegable
Nuevo
Nuevo


Unido: 29/Septiembre/2016
Localización: Spain
Estado: Sin conexión
Puntos: 36
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Cooltan Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Copiar Matriz en otra Matriz VBA
    Enviado: 17/Julio/2017 a las 14:56
Buenos días a todos/as

Tengo un problema, estoy tratando un archive y estoy usando matrices, estoy recorriendo un archivo y la primera vez mi matriz es de 200 elementos, como no se cuantos elementos voy a tener, la asigno como Matriz as Variant().
Matriz(x,20).

El problema es que una vez que he leido todos los archivos la Matriz tiene ahora una tamaño de Matriz(200,20). Y cuando quiero redimensionar la matriz no puedo o no se, porque lo que puedo redimensionar es el Segundo element no el primero, y lo que quiero es redimensionar el primer element, para ir leyendo otro archivo y seguir almacenando la información en la misma matriz.

Alguien sabe como podría hacerlo? Se me ocurre no se hacer otra matriz y copier su contenido en otra matriz, pero claro tengo que leer 5 archivos, y de ser así, tendria que crear 5 matrices independientes, y lo que yo quiero es al final de leer todos los archivos, tener almacenada en una única matriz toda la información. Si se pudiera ir redimensionandola sería un lujo, pero no se como hacerlo. Visual Basic.

Gracias.
Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: Alcalá Meco
Estado: Sin conexión
Puntos: 2916
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita lbauluz Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 17/Julio/2017 a las 16:10
No indicas lo que haces, pero lo lógico sería

ReDim Preserve Matriz (200, 20)

Con eso la matriz pasaría a tener 200 x 20 y mantendría el contenido 
(Preserve hace que se mantenga el contenido, sin preserve se borra todo el contenido)
Si quieres otro tamaño, solo hay que cambiar los valores, por ejemplo 
ReDim Preserve Matriz (720, 83)

Te redefiniria los tamaños a 720 filas de 83 cada una.
Un saludo.

Luis



Quod natura non dat, Salmantica non præstat
Arriba
Cooltan Ver desplegable
Nuevo
Nuevo


Unido: 29/Septiembre/2016
Localización: Spain
Estado: Sin conexión
Puntos: 36
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Cooltan Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 17/Julio/2017 a las 16:19
Hola Luis muchas gracias de antemano. Lo que hago es esto:

MLFileName = Mydir & MyFile
    Oxmlfile.Load (XMLFileName)
    Set nodes = Oxmlfile.SelectNodes("//AINVOICELIST/*")
    aux_node = nodes.Length
    n = aux_node
    ReDim Preserve Matriz(n, 30)
    n = 0
        For Each node1 In nodes
        y = 0
               Matriz(n, y) = node1.SelectSingleNode("INVOICEBRUT").nodeTypedValue()
              
               Matriz(n, y + 1) = Fact & node1.SelectSingleNode("INVOICENO").nodeTypedValue()                                        Matriz(n, y + 2) = node1.SelectSingleNode("DATE").nodeTypedValue()
               Matriz(n, y + 3) = node1.SelectSingleNode("DEBITOR-       n= n+1
next
El problema es que cuando intento redimensionar la Matriz no me deja.      
Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: Alcalá Meco
Estado: Sin conexión
Puntos: 2916
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita lbauluz Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 18/Julio/2017 a las 19:07
¿Como has definido la matriz? (supongo que la habrás definido antes)
¿Qué valor tiene n?, ¿qué tipo es n, long, int, double...?


Por cierto, ¿qué tiene que ver esto con copiar una matriz en otra?


Luis




Editado por lbauluz - 18/Julio/2017 a las 22:03
Quod natura non dat, Salmantica non præstat
Arriba
Cooltan Ver desplegable
Nuevo
Nuevo


Unido: 29/Septiembre/2016
Localización: Spain
Estado: Sin conexión
Puntos: 36
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Cooltan Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 19/Julio/2017 a las 11:24
Buenos días Luis,

Dim Matriz () as Variant
Dim n as Integer

En un principio quería ir redimensionando la matriz a medida que iba leyendo ficheros, pero el redim preserve solo deja redimensionar el ultimo element, y yo quiero Redimensionar Matriz(n,30) pero la n no me deja. Entonces otra opción es Copiar de una matriz a otra, es decir.

Trato el primer fichero y copio la info en la Matriz, una vez tratado el fichero, copio la información de Matriz en Matriz2, y borro Matriz, leo el Segundo fichero, y una vez acabado, añado en Matriz2 la info de Matriz y asi sucesivamente hasta que termine, pero no se como copier de matriz a matriz.
Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: Alcalá Meco
Estado: Sin conexión
Puntos: 2916
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita lbauluz Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 19/Julio/2017 a las 17:59
Efectivamente, en VBA solo puedes cambiar la última dimension del array.

Lo único que se me ocurre es que hagas una transposición de valores, es decir en lugar de

Oxmlfile.Load (XMLFileName) 
Set nodes = Oxmlfile.SelectNodes("//AINVOICELIST/*")
aux_node = nodes.Length 
n = aux_node
ReDim Preserve Matriz(n, 30) 
n = 0
For Each node1 In nodes 
y = 0
        Matriz(n, y) = node1.SelectSingleNode("INVOICEBRUT").nodeTypedValue()
        Matriz(n, y + 1) = Fact & node1.SelectSingleNode("INVOICENO").nodeTypedValue()                                        
Matriz(n, y + 2) = node1.SelectSingleNode("DATE").nodeTypedValue()
        Matriz(n, y + 3) = node1.SelectSingleNode("DEBITOR- ").nodeTypedValue()  
n= n+1
next
' etc


Poner 

xmlfile.Load (XMLFileName) 
Set nodes = Oxmlfile.SelectNodes("//AINVOICELIST/*")
aux_node = nodes.Length 
n = aux_node
ReDim Preserve Matriz(30, n) 
n = 0
For Each node1 In nodes 
y = 0
        Matriz(y, n) = node1.SelectSingleNode("INVOICEBRUT").nodeTypedValue()
        Matriz(y + 1, n) = Fact & node1.SelectSingleNode("INVOICENO").nodeTypedValue()                                        
Matriz(y + 2, n) = node1.SelectSingleNode("DATE").nodeTypedValue()
        Matriz(y + 3, n) = node1.SelectSingleNode("DEBITOR- ").nodeTypedValue()  
n= n+1
next
' etc


Con eso debería funcionar

Luis
Quod natura non dat, Salmantica non præstat
Arriba
prga Ver desplegable
Moderador
Moderador


Unido: 16/Noviembre/2004
Localización: España
Estado: Sin conexión
Puntos: 2855
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita prga Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 20/Julio/2017 a las 11:58
Hola.
Una alternativa a las matrices son los recordsets ado. En un principio son más complicados pero tienen 'más posibilidades'.
En el siguiente ejemplo de trabajo:

Public Sub cosasmatrices()
Dim mirec As Object 'ADODB.Recordset
Dim nn As Long
Dim jj As Long
Set mirec = CreateObject("adodb.recordset")
For nn = 1 To 100
' mirec.Fields.Append "campo" & nn, 129, 50 'adChar, 50
' mirec.Fields.Append "campo" & nn, 3 'adInteger
 mirec.Fields.Append "campo" & nn, 200, 50 'adVarChar, 50
Next
mirec.Open
For jj = 1 To 1000
 mirec.AddNew
  For nn = 1 To 100
    mirec.Fields("campo" & nn).Value = jj & "_" & nn
  Next
  mirec.Update
Next
mirec.Sort = "[campo12] desc"
mirec.Filter = ("[campo23] < '15'")
mirec.MoveFirst
Do Until mirec.EOF
 Debug.Print mirec.Fields("campo10").Value
mirec.MoveNext
Loop
mirec.Filter = ""
mirec.Sort = ""
If Dir(CurrentProject.Path & "\mirecordset.adtg") <> "" Then
 Kill CurrentProject.Path & "\mirecordset.adtg"
End If

mirec.Save CurrentProject.Path & "\mirecordset.adtg", 0 'adPersistADTG
mirec.Close
mirec.Open CurrentProject.Path & "\mirecordset.adtg", , , , 256 'adCmdFile
MsgBox (mirec.RecordCount)
MsgBox (mirec.Fields("campo23"))
End Sub


se crea un recordset en memoria con 100 campos tipo texto variable, se añaden 1000 registros, se ordena por un campo, se filtra por otro y se 'lista'. Después se quita el filtro y la ordenación para guardarlo en disco. posteriromente se recupera la información guardada.
Repito que es un ejemplo de trabajo para 'ver' las posibilidades de esta otra opción.
Espero que ayude a resolver la duda
Ya comentas.
Un saludo a todos
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable