Declarar matriz como constante publica

08/07/2006 - 00:25 por klomkbock | Informe spam
Hola a todos

Estoy intentando declarar una matriz como constante publica. Si no he
entendido mal la ayuda en linea, se pueden declarar matrices como
constantes, pero por mas que lo intento de las formas que creo deberia
hacerse, no lo consigo. Quizas me este equivocando y no se pueda.

Si alguien puede aclararme la duda, se lo agradezco.

Un saludo y hasta pronto.
Ivan

Preguntas similare

Leer las respuestas

#1 KL
08/07/2006 - 03:37 | Informe spam
otra forma de usar el rango podria ser esta:

Sub test1()
For i = 1 To Sheets("Hoja1").Range("A1:A5").Count
MsgBox Sheets("Hoja1").Range("A1:A5")(i)
Next
End Sub



Saludos,
KL


"KL" wrote in message
news:
Hola Ivan,

Creo que lo mas productivo y ademas mas seguro (por si algun fallo del
codigo) seria tener la matriz en un rango o en un nombre definido. Asi
siempre tendras la matriz disponible, sin necesidad de declarar ni asignar
y no te ariesgaras a perderla.

P.ej.:

si el rango A1:A100 de la hoja Hoja1 contiene los valores de la matriz,
podrias usarla asi:

Sub test1()
Dim MiMatriz
MiMatriz = Sheets("Hoja1").Range("A1:A5")
For i = 1 To UBound(MiMatriz)
MsgBox MiMatriz(i, 1)
Next
End Sub

o si en la Hoja1 has definido el nombre "Matriz" (menu
Insertar>Nombre>Definir...) con la formula ={"a"\"b"\"c"\...\"z"}, podrias
hacer esto:

Sub test2()
Dim MiMatriz
MiMatriz = Evaluate(ThisWorkbook.Names("Matriz").Value)
For i = 1 To UBound(MiMatriz)
MsgBox MiMatriz(i, 1)
Next
End Sub

Saludos,
KL

"Ivan" wrote in message
news:
Hola de nuevo KL, disculpame por no haberlo pensado antes, pero me
gustaria preguntarte otra cosa en relacion a la consulta.

¿que seria mas "productivo", o sea, menos ralentizante?: inicializarla de
esta manera, es decir, al abrir el libro, o irla inicializandola con cada
procedimiento que la use, aunque esto suponga repetir la matriz en cada
uno de ellos, o al menos en cada modulo.

Se trata de una matriz fija que se corresponde con las letras de cada
columna (de la "a" a la "z") y que uso en bastantes procedimientos, sobre
todo en formularios, para redefinir rangos/campos segun diferentes
criterios.

Hasta ahora la he inicializado asi (dentro de los procedimientos) y con
la
funcion array:

Dim letraCol as Variant
letraCol = Array("a", "b", "c",..,"y", "z")

Si me puedes aclarar esta nueva duda, ten por seguro que me acostare
sabiendo muchisimo mas que esta mañana, y seguramente me levantare con un
bucle infinito menos en la cabeza.

En cualquier caso muchas gracias.

Un saludo
Ivan







Respuesta Responder a este mensaje
#2 klomkbock
08/07/2006 - 04:21 | Informe spam
Hola KL, muchas gracias de nuevo.

Me temo que a estas horas ya estoy un poco espeso, y que hasta mañana no
sere capaz de analizarlo con detenimiento, pero en cualquier caso creo
intuir por donde van los tiros, aunque nunca he usado rangos para
"almacenar" matrices.

Si no te importa te pongo un ejemplo (aproximado, pues es de memoria
espesa) de uno de los usos de la matriz a ver como lo ves, y mañana te
vuelvo a enviar una respuesta con lo que haya visto/sacado en claro de tus
respuestas.

Uno de los usos coge el valor del listidex de un combobox que contiene los
titulos de campo/columna y se lo asigna a la matriz para rellenar otro
combo con el campo correspondiente:

un fragmento del codigo seria algo asi:

Sub rellenarCombo2()
.
x=Combo1.ListIndex

For each celda in range(Range(letraCol(x) & 2), _
Range(letraCol(x) & 65356).End(xlup))
Combo2.Additem Celda.Value
Next

End Sub

En cualquier caso muchas gracias por todo, y, aunque me temo que hoy me
voy a la cama con un bucle aun mas gordo, creo que mañana pueden ser
varios y no uno los que elimine.

Un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#3 KL
08/07/2006 - 13:39 | Informe spam
Hola Ivan,

un fragmento del codigo seria algo asi:

Sub rellenarCombo2()
.
x=Combo1.ListIndex

For each celda in range(Range(letraCol(x) & 2), _
Range(letraCol(x) & 65356).End(xlup))
Combo2.Additem Celda.Value
Next

End Sub



Yo personalmente lo haria asi (sin los bucles que te atormentan por las
noches :-)) :

Sub rellenarCombo2()
x=Combo1.ListIndex
Lista=Range(Range(letraCol(x) & 2), _
Range(letraCol(x) & 65356).End(xlup))
Combo2.List=Lista
End Sub

Saludos,
KL
Respuesta Responder a este mensaje
#4 klomkbock
08/07/2006 - 20:14 | Informe spam
Hola KL, lo primero, muchas gracias de nuevo. Siento no haber podido
contestar antes, pero hasta ahora no me he podido poner a ello.

He estado haciendo pruebas con tus indicaciones y al fin he coseguido
(reconozco que con unos cuantos errores) que funcione bastante bien, pero,
como no podia ser menos, han vuelto a aparecer unas cuantas dudas que paso
a comentarte despues de el codigo resultante

Private Sub Combo1_Change()
Call PruebaMatrizHoja
End Sub
Private Sub PruebaMatrizHoja()
Dim x As Byte, Lista
x = Combo1.ListIndex + 1
Lista = Sheets("Listado").Range(Range(ltrCol(x, 1) & 2), _
Range(ltrCol(x, 1) & 65536).End(xlUp))
Combo2.List = Lista
End Sub
Private Sub UserForm_Activate()
Dim i As Byte
'carga los titulos de cada campo en el Combo1
For i = 1 To 26
Combo1.AddItem Sheets("Listado").Range("a1")(1, i)
Next
ltrCol = Sheets("Matrices").Range("a1:a26")
'' Combo1.List = Sheets("Listado").Range("a1:a26")
End Sub

Paso a hacerte las consultas, pero no tengas ningun compromiso, con lo que
me has ayudado ya, se me han quitado varios bucles, aunque, quizas por
suerte, hayan aparecido otros.

1.-por un lado, ¿como se deben declarar las variables ltrCol y Lista?¿como
range, o como variant?¿o es indiferente?

2.-como veras ltrCol la he inicializado en el evento Activate del
formulario. Volvemos un poco a la consulta anterior ¿es mejor asi?

3.-si te fijas en el comentario con dos comillas del Activate, he
intentado asignar el rango de titulos directamente al Combo1 pero no me lo
permite, ¿es posible o tiene que ser mediante una variable?

4.-por ultimo, lo que hago, al menos de momento, es rellenar el Combo2 con
una coleccion para evitar las repeticiones, en lugar de con el rango
entero. Luego, en funcion de lo que se va escribiendo en el, se rellena un
listbox de 4 columnas con seleccion multiple con los datos de las columnas
a, b, c y d. Aunque todavia no me he puesto a ello, supongo que no habra
problemas para aplicar todo lo anterior en estos casos, aunque si tienes
alguna sugerencia sera muy bien recibida.

En cualquier caso muchas gracias.
Un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#5 KL
08/07/2006 - 22:31 | Informe spam
Hola Ivan,

1.-por un lado, ¿como se deben declarar las variables ltrCol y Lista?¿como
range, o como variant?¿o es indiferente?



Las variables ItrCol y Lista deben declararse como Variant. Array y Range no
son lo mismo aunque tengan algunas caracteristicas en comun y por tanto NO
da igual.

2.-como veras ltrCol la he inicializado en el evento Activate del
formulario. Volvemos un poco a la consulta anterior ¿es mejor asi?



No se que es lo que contiene el rango Sheets("Matrices").Range("a1:a26")
del que rellenas ItrCol, pero si son letras de columnas por orden alfabetico
y sin saltar ninguna, entonces no seria necesaria la utilizacion de esta
matriz para rellenar Combo2. Por ejemplo, suponiendo que las columnas
empiezan por la [D], podrias usar el ListIndex directamente con una
correccion:

x=Combo1.ListIndex
Lista=Range(Cells(2, x+4), Cells(65356, x+4).End(xlup))

3.-si te fijas en el comentario con dos comillas del Activate, he
intentado asignar el rango de titulos directamente al Combo1 pero no me lo
permite, ¿es posible o tiene que ser mediante una variable?



Tiene que ser mediante una variable ya que la propiedad List no admite
rangos. La que si los admite (como referencia en formato texto) es la
propiedad RowSource.

4.-por ultimo, lo que hago, al menos de momento, es rellenar el Combo2 con
una coleccion para evitar las repeticiones, en lugar de con el rango
entero. Luego, en funcion de lo que se va escribiendo en el, se rellena un
listbox de 4 columnas con seleccion multiple con los datos de las columnas
a, b, c y d. Aunque todavia no me he puesto a ello, supongo que no habra
problemas para aplicar todo lo anterior en estos casos, aunque si tienes
alguna sugerencia sera muy bien recibida.



Es dificil emitir un opinion definitiva sobre el asunto sin tener el archivo
delante, pero me parece logico el proceso.

Saludos,
KL
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida