Matrices

27/12/2007 - 18:17 por Diego LB | Informe spam
Hola grupo,
Alguien me pude decir como hago para pasar una matriz de una o dos
dimensiones de caracter numérico o cadena a un archivo de texto o bien a una
hoja de cálculo

gracias
DEL

Preguntas similare

Leer las respuestas

#1 Ivan
28/12/2007 - 00:37 | Informe spam
hola Diego

como hago para pasar una matriz de una o dos


dimensiones de caracter numérico o cadena a un archivo de texto o bien a una
hoja de cálculo



si quieres prueba algo +/- asi

para 2 dimensiones:

Sub Matriz_Rango()
Dim f As Integer, c As Integer, matriz(10, 10)
For f = 1 To 10
For c = 1 To 10
matriz(f, c) = f * c
Next
Next
Range(Cells(1, 1), Cells(f, c)) = matriz
End Sub


para una dimension (creada con la funcion Array, pero igual te valdria
con una matriz normal [creo])

Sub Array_Rango()
Range("b1:k1") = Array("Titulo1", "Titulo2", "Titulo3", "Titulo4", _
"Titulo5", "Titulo6", "Titulo7", "Titulo8", "Titulo9", "Titulo10")
End Sub

solo ten en cuenta que (si no me equivoco) excel siempre toma/adjudica
el 1er elemento de la matriz a las filas y el segundo (en el caso de
bidimensionales) a las columnas. Con lo que por ej. la siguiente
expresion =>

Range("A1:a5") = array(1, 2, 3, 4, 5)

te devolveria 1 para todas las celdas, y en el caso de las
bidimensionales, aunque la matriz y el rango tengan el mismo numero de
elementos/celdas, si el orden y nº. de estas no es igual al de los
elementos no te cuadraria el resultado, es decir, si pej. tubieras una
matriz de 2 x 3 => matriz(2,3), podrias ponerla sin problemas en un
rango de 2 filas y 3 columnas pero si probaras en uno de 3 filas y 2
columnas [creo que] solo te rellenaria las celdas de las 2 primeras
filas, que serian algo asi como la interseccion de ambos

bueno, no me hagas demasiadop caso y corre unas pruebas, que seguro es
como mejor lo ves

un saludo
Ivan
Respuesta Responder a este mensaje
#2 Héctor Miguel
28/12/2007 - 05:30 | Informe spam
hola, chicos !

Ivan: solo en relacion con la siguiente propuesta...

solo ten en cuenta que (si no me equivoco) excel siempre toma/adjudica el 1er elemento de la matriz a las filas
y el segundo (en el caso de bidimensionales) a las columnas.
Con lo que por ej. la siguiente expresion => Range("A1:a5") = array(1, 2, 3, 4, 5)
te devolveria 1 para todas las celdas... aunque la matriz y el rango tengan el mismo numero de elementos/celdas (...)



hablando "intrinsecamente" de dos caracteristicas (+/- generalmente) conocidas/entendidas/aceptadas ?/...
1) VBA es US-Centric
2) para excel (USA) en matrices constantes (o entre llaves {}) las columnas se separan por coma y las filas por punto_y_coma
(ademas considerando que el punto_y_coma NO es un caracter utilizable para matrices en VBA)...

la instruccion que te devuelve solo el primer elemento de una matriz (horizontal/coma=columnas) en un rango (vertical)...
-> Range("a1:a5") = Array(1, 2, 3, 4, 5)
la puedes (re)convertir de columnas a filas cambiando la instruccion +/- a lo siguiente:
-> Range("a1:a5") = Application.Transpose(Array(1, 2, 3, 4, 5))

saludos,
hector.
Respuesta Responder a este mensaje
#3 Diego LB
28/12/2007 - 16:32 | Informe spam
Héctor e Iván, muchas gracias por responderme

Me sirvió de gran ayuda, probé con el bucle para matrices de 2 dimensiones y
también cargando la matriz a un rango, utilicé las instrucciones
Range("a1:c5") = Application.Transpose(Matriz) para que me pasara los
valores y no los números 1, de ambas formas logré lo que esperaba; ahora,
saben como pasar esta matriz a un archivo de texto, algo así como si quisiera
guardar una tabla (matriz de 2 dimensiones).

Les quedo muy agradecido

DEL


"Héctor Miguel" escribió:

hola, chicos !

Ivan: solo en relacion con la siguiente propuesta...

> solo ten en cuenta que (si no me equivoco) excel siempre toma/adjudica el 1er elemento de la matriz a las filas
> y el segundo (en el caso de bidimensionales) a las columnas.
> Con lo que por ej. la siguiente expresion => Range("A1:a5") = array(1, 2, 3, 4, 5)
> te devolveria 1 para todas las celdas... aunque la matriz y el rango tengan el mismo numero de elementos/celdas (...)

hablando "intrinsecamente" de dos caracteristicas (+/- generalmente) conocidas/entendidas/aceptadas ?/...
1) VBA es US-Centric
2) para excel (USA) en matrices constantes (o entre llaves {}) las columnas se separan por coma y las filas por punto_y_coma
(ademas considerando que el punto_y_coma NO es un caracter utilizable para matrices en VBA)...

la instruccion que te devuelve solo el primer elemento de una matriz (horizontal/coma=columnas) en un rango (vertical)...
-> Range("a1:a5") = Array(1, 2, 3, 4, 5)
la puedes (re)convertir de columnas a filas cambiando la instruccion +/- a lo siguiente:
-> Range("a1:a5") = Application.Transpose(Array(1, 2, 3, 4, 5))

saludos,
hector.



Respuesta Responder a este mensaje
#4 Ivan
28/12/2007 - 18:14 | Informe spam
hola Diego (y Hector )

estas son 3 adaptaciones de la ayuda que tenia`por ahi. Aunque estan
hechas para rangos, son facilmente adaptables a matrices.

de todas formas seguro que Hector, o alguien mas pueden darte algo
mejor.

ahor voy con prisa, pero prueba a ver y si quieres comentas

un saludo
Ivan

PD Hector, muchas gracias por las puntualizaciones. Voy con prisilla y
aun no he podido estudiarlo. Si puedo luego te añado mis comentarios
con los del otro mensaje

'codigos para pasar rangos a archivos txt -

'--pegar en modulo normal

Sub testArchivoTexto_1()
Dim f As Integer, Nombre As String
With Worksheets("Hoja1")
Nombre = .[a1] & "_" & .[b2]
' Abre el archivo para operaciones de salida.
Open Nombre & ".txt" For Output As #1
Write #1,
Write #1, Nombre, 234 ' Delimita con comas los datos
introducidos.
Write #1, ' Coloca una línea en blanco.
For f = 4 To .[a65536].End(xlUp).Row
Write #1, .Cells(f, 1); .Cells(f, 2); .Cells(f, 3); .Cells(f, 4)
Next
Close #1 ' Cierra el archivo.
End With
End Sub
Sub testArchivoTexto_2()
Dim col As Byte, f As Integer, Linea, Nombre As String
With Worksheets("Hoja1")
Nombre = .[a1] & "_" & .[b2]
Open Nombre & ".txt" For Output As #1
Write #1,
Write #1, Nombre, 234
Write #1,
For f = 4 To .[a65536].End(xlUp).Row
Linea = ""
For col = 1 To .[a1].End(xlToRight).Column
Linea = Linea & Cells(f, col).Value & ","
Next
Linea = Left(Linea, Len(Linea) - 1)
Write #1, Linea
Next
Close #1
End With
End Sub
Sub testArchivoTexto_Print()
Dim col As Byte, f As Integer, Linea, Nombre As String
Nombre = Worksheets("Inicio").Range("c10").Value & ".txt"
With Worksheets("datos1")
Open Nombre For Output As #1
Print #1,
Print #1, Nombre
Print #1,
For f = 1 To .[a65536].End(xlUp).Row
Linea = ""
For col = 1 To .[a1].End(xlToRight).Column
Linea = Linea & Cells(f, col).Value & "|"
Next
Linea = Left(Linea, Len(Linea) - 1)
Print #1, Linea
Next
Close #1
End With
End Sub
Respuesta Responder a este mensaje
#5 Ivan
29/12/2007 - 02:32 | Informe spam
On 28 dic, 16:32, Diego LB wrote:
Héctor e Iván, muchas gracias por responderme

Me sirvió de gran ayuda, probé con el bucle para matrices de 2 dimensiones y
también cargando la matriz a un rango, utilicé las instrucciones
Range("a1:c5") = Application.Transpose(Matriz) para que me pasara los
valores y no los números 1, de ambas formas logré lo que esperaba; ahora,
saben como pasar esta matriz a un archivo de texto, algo así como si quisiera
guardar una tabla (matriz de 2 dimensiones).

Les quedo muy agradecido

DEL

"Héctor Miguel" escribió:



> hola, chicos !

> Ivan: solo en relacion con la siguiente propuesta...

> > solo ten en cuenta que (si no me equivoco) excel siempre toma/adjudica el 1er elemento de la matriz a las filas
> > y el segundo (en el caso de bidimensionales) a las columnas.
> > Con lo que por ej. la siguiente expresion => Range("A1:a5") = array(1, 2, 3, 4, 5)
> > te devolveria 1 para todas las celdas... aunque la matriz y el rango tengan el mismo numero de elementos/celdas (...)

> hablando "intrinsecamente" de dos caracteristicas (+/- generalmente) conocidas/entendidas/aceptadas ?/...
> 1) VBA es US-Centric
> 2) para excel (USA) en matrices constantes (o entre llaves {}) las columnas se separan por coma y las filas por punto_y_coma
>     (ademas considerando que el punto_y_coma NO es un caracter utilizable para matrices en VBA)...

> la instruccion que te devuelve solo el primer elemento de una matriz (horizontal/coma=columnas) en un rango (vertical)...
> -> Range("a1:a5") = Array(1, 2, 3, 4, 5)
> la puedes (re)convertir de columnas a filas cambiando la instruccion +/- a lo siguiente:
> -> Range("a1:a5") = Application.Transpose(Array(1, 2, 3, 4, 5))

> saludos,
> hector.- Ocultar texto de la cita -

- Mostrar texto de la cita -



hola de nuevo, Diego ( y Hector, aunque a ti espero responderte en tu
propio mensaje, pues si he conseguido entender tus palabras creo que
resuelven uno de mis cacaos mentales, pero todavia estoy intentando
comprenderlo del todo, no vaya a ser que vuelva a soltar algun
disparate)

bueno, Diego, disculpa mi ultimo mensaje, pero lo tenia muy a mano de
unas pruebas relizadas hace poco y con las prisas lo mande sin
remirarlo demasiado, creyendo que era mas generico (aunque realmente
lo referido a la carga del txt creo que es bastante sencilla de
adaptar a matrices)

a la espera de alguna de las maravillas de Hector (o de algun otro
experto) y de sus comentarios te pongo una adaptacion para matrices
bidimensionales,

pero antes un comentario (o mas bien consulta ). Por un lado cuando en
mi 1er mensaje hablaba de 1er y 2º elemento, mas bien queria decir [o
debia haber dicho] 1ª y 2ª dimension. Lo comento por lo que viene
ahora:

el txt se carga con un bucle por el nº de elementos de la 1ª dimension
(1 to 100 en el ej) el cual puede ser variable sin problemas con solo
cambiar la declaracion(1 to 15, 10 to 200, etc)

pero en lo que se refiere a la 2ª dimension [creo que] hay que
enumerar/poner cada uno de los elementos a la hora de cargarlos con
Write/Print, pues aunque podrias usar otro bucle por el nº de la 2ª
dimension, creando una sola variable para pasarselos de un golpe, como
en el 3er codigo de mi anterior mensaje, en este caso, a la hora de
leerlos te devolveria una sola cadena en un bloque por linea y no
campo a campo, ni respetando los tipos de datos de estos.

he estado probando a ver si era posible pasarselos como una matriz de
una dimension, pero yo al menos no lo he logrado

en fin, todo esto es para comentarte que, al menos desde mi nivel (que
es mas bien bajo), por lo que se ve, si la 2ª dimension fuese muy
amplia aun asi tendrias que poner cada campo a la hora de cargar la
linea (siempre y cuando quieras mantener la lista integra y recuperar
los datos con su tipo original.

de todas formas si Hector o cualquier otro se anima a aclararnoslo y/o
a comentar cualquier otra posibilidad estaria bien

bueno, estos son los codigos

el 1º relamente es solo para crear una mariz para las pruebas y
pasarselo al segundo, que es el que realmente hace la carga

pegalos en un modulo normal y ejecuta la 2ª macro()

'-para crear una matriz de forma aleatoria de 2 dimensiones
'-OJO para este intervalo en la 2ª dimension=> (1 To 6)
'
Sub MatrizAleatoria(MiMatriz As Variant)
Dim n As Integer, i As Integer, Nombre As String, _
Valor1 As Long, Valor2 As Long, mtr
Nombre = "co pa pe to ra ho sa"
For n = LBound(MiMatriz) To UBound(MiMatriz)
Valor1 = Int(10000 * Rnd): Valor2 = Int(10000 * Rnd)
mtr = Array(n, CDate(36892 + Int(365 * Rnd + 1)), _
Split(Nombre)(Int(6 * Rnd)) & Split(Nombre)(Int(6 * Rnd)), _
Valor1, Valor2, Valor1 + Valor2)
For i = 1 To 6
MiMatriz(n, i) = mtr(i + (LBound(mtr) = 0))
Next
Next
End Sub
' carga la matriz creada aleatoriamente en un archivo de texto
'
Sub Txt_Matriz()
Dim f As Integer, nombreTxt As String, Matriz(1 To 100, 1 To 6)
nombreTxt = InputBox("Escribe el nombre del txt")
If nombreTxt = "" Then nombreTxt = ThisWorkbook.Name
MatrizAleatoria Matriz
Open nombreTxt & ".txt" For Output As #1
Write #1,
Write #1, nombreTxt; Now
Write #1,
For f = LBound(Matriz) To UBound(Matriz)
Write #1, Matriz(f, 1); Matriz(f, 2); Matriz(f, 3); Matriz(f,
4); _
Matriz(f, 5); Matriz(f, 6)
Next
Close #1
End Sub

espero te ayude y no te fies demasiado (aunque a mi parece irme bien)

un saludo
Ivan
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida