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

#6 Diego LB
29/12/2007 - 14:59 | Informe spam
Hola Iván, agradezco mucho tu esfuerzo, sin embargo con el ejemplo anterior
que me pasaste (con rangos) comprendí que podía hacer un bucle y este me
funcionó bien, sólo que me quedan todos los datos en una misma columna pero
eso no es problema ya con esto resuelvo mi situación. esto es más o menos lo
que hice

NumArchivo = FreeFile
On Error Resume Next
Open "c:\texto.txt" For Output As #NumArchivo
If Err Then Close #NumArchivo

For Col = 1 To UBound(Matriz1, 1)
For Fil = 1 To UBound(Matriz1, 2)
Matriz1(Col, Fil) = Str(Col) & "-" & Str(Fil)
Print #NumArchivo, Matriz1(Col, Fil)
Next
Next

Close #NumArchivo

gracias, nuevamente
hasta pronto.
DEL


"Ivan" escribió:

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
#7 Ivan
30/12/2007 - 01:34 | Informe spam
hola Hector (y Diego y demas foreros)

disculpa la tardanza, pero estos dias ando liado y cuando llego a
casa, mi neurona suele estar para pocos trotes.

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

[yo]=>"(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"





... para excel (USA) en matrices constantes (o entre llaves {}) las columnas se separan por coma y las filas por punto_y_coma







a ver si encuentro un hueco en la [mentada] neurona y consigo
grabarlo. [te] lo habre leido mil veces, pero otras tantas se me
olvida

  (ademas considerando que el punto_y_coma NO es un caracter utilizable para matrices en VBA)..







solo como curiosidad (y lo mismo es otra de mis idas de olla) ¿existe
alguna forma de representar [todos] los elementos de una matriz de mas
de una dimension en vba? me refiero a algo tipo a cuando se usa la
funcion array => matriz = array(elemento1, elemento2,,...,elementoN)

fuera de vba las de 2 dimensiones son faciles de imaginar (como una
tabla), incluso las de 3 (como un cubo), a partir de ahi no puedo
imaginarlo, pero al menos para 2 dimensiones ¿existe esa forma,
llamemosle grafica, de representarlas?
.
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)







aqui es donde esta ese 'cacao mental' del que te hablaba, reflejado en
mis comentarios.

cuando hablaba de elementos, en realidad queria decir dimensiones, y
me referia (+/-) a que las matrices de una dimension, al menos en su
'interpolacion' con excel, devolverian una misma/sola fila, con lo
que, como tu aclaras, todos sus elementos serian elementos/columnas de
una misma fila, de ahi que al intentar cargarla en un rango vertical,
en realidad cargaria solo el primer elemento de la matriz, equvalente
a la 1ª columna (por cierto, gracias por 'transpose', no sabia que se
pudiera usar tambien directamente con una matriz)

y mi cacao estaba en que realmente no lograba visualizarlo, ni
siquiera describirlo (creo que se ha notado), pero tus comentarios y
apuntes han supuesto ese pequeño toque que a veces nos falta para
lograr entender algo

bueno, aunque parezca una exageracion, o lo que por aqui se llama una
'chorrada', creo que salgo del hilo con una 'vision' bastante mas
clara de las matrices. Gracias una vez mas

y por ultimo otra duda referida al final del hilo

¿es posible cargar en un registro/linea de un txt los elementos de
una matriz unidimensional, pero consiguiendo que respete sus tipos y
los mantenga como columnas, y sin tener que enumerarlos uno a uno?

supongo que se pueden concatenar, incluido algun separador, y luego al
leerlos usar algo tipo split, pero me refiero a que esto no fuera
necesario y se pudiera leer directamente con input recuperando sus
campos tal cual.

de nuevo solo como curiosidad, pero nunca sobran los datos (aunque no
se si se me habra entendido algo)

bueno, muchas gracias en cualquier caso

un saludo
Ivan

PD: voy a echarle un ojo al otro hilo. Tengo un mensaje pendiente.
Respuesta Responder a este mensaje
#8 Héctor Miguel
30/12/2007 - 02:27 | Informe spam
hola, Ivan !

solo como curiosidad (y lo mismo es otra de mis idas de olla)
existe alguna forma de representar [todos] los elementos de una matriz de mas de una dimension en vba?
me refiero a algo tipo a cuando se usa la funcion array => matriz = array(elemento1, elemento2,,...,elementoN)
fuera de vba las de 2 dimensiones son faciles de imaginar (como una tabla), incluso las de 3 (como un cubo)
a partir de ahi no puedo imaginarlo, pero al menos para 2 dimensiones existe esa forma, grafica, de representarlas?



las matrices en vba tambien "merecen" su capitulo aparte
revisa (como "punto de entrada") la pagina de Chip Pearson:
-> Functions For VBA Arrays
http://www.cpearson.com/Excel/VBAAr...Dimensions

y no te pierdas de pagina de indice otros temas acerca de las matrices (o arrays)
-> http://www.cpearson.com/Excel/Topic.aspx

y por ultimo otra duda referida al final del hilo
es posible cargar en un registro/linea de un txt los elementos de una matriz unidimensional
pero consiguiendo que respete sus tipos y los mantenga como columnas, y sin tener que enumerarlos uno a uno?
supongo que se pueden concatenar, incluido algun separador, y luego al leerlos usar algo tipo split
pero me refiero a que esto no fuera necesario y se pudiera leer directamente con input recuperando sus campos tal cual.



(supongo que habria que hacer algunas pruebas)
revisa los ejemplos para trabajar con archivos de texto de:
-> J. E. McGimpsey
Saving XL files as Text/CSV
http://www.mcgimpsey.com/excel/textfiles.html

si cualquier duda (o informacion adiiconal)... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#9 Ivan
30/12/2007 - 04:51 | Informe spam
hola Hector, muchas gracias de nuevo

creo que de esta tanda no me libro de meterle mano a mi precario
ingles

la verdad es que me da mucha 'rabia' no poder disfrutar a fondo de las
paginas de C. Person, Ron de Bruin, JW, y demas monstruos del tema.

aunque por suerte, por aqui tenemos a HM, que dicho con todo el
respeto y sin entrar en comparaciones de ningun tipo, creo que no
tiene nada que envidiarles

por cierto ¿veremos algun dia eso de 'www.hectormiguel.com'? estoy
seguro que no le faltarian visitas

bueno, de todas formas, mientras sigas por aqui, creo que ya es un
lujo

un saludo
Ivan
Respuesta Responder a este mensaje
#10 Ivan
31/12/2007 - 00:53 | Informe spam
hola Diego,

me alegro lo hayas resuelto y cracias a ti tambien por el FeedBack

un saludo
Ivan
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida