Matrices, F. Array() y rangos

14/06/2006 - 19:46 por klomkbock | Informe spam
Hola a todos de nuevo

Hace no mucho estuve leyendo, no se si directamente en este foro(tu
tiempo) o directamente en los de google, una consulta sobre matrices y
rangos creo que contestada por KL y ahora no consigo encontrarla y me
suena que era mas o menos lo que ando buscando. De todas formas suelto mi
duda por si podeis echarme un cable:

Hasta ahora solo he usado la funcion array para crear matrices, y,
cuando se trata de rangos (en general los campos de un unico registro para
rellenar con algun bucle for o algo similar), no se hacerlo si no es
introduciendo los campos uno a uno (pej: with celda: miarray=Array(.value,
.Offset(0,1).value, ). ¿Se puden introducir con la f. array todo el
rango junto (pej: miarray=Array("a1:k1") o miarray=Array("a" & i &":k" 6
i))?. Con matrices creo recordar que si por aquella y otras consultas que
he leido, pero no se muy bien como, y creo que en la ayuda no lo indica
(al menos para la f. array) de una manera clara.

Por otro lado, para rellenar otro rango, o, pej. un textbox, cuando se
trata de buscar entre varios miles de registros(no mas de diezmil) y para
alrededor de 15 campos,¿que seria mas rapido (o como puedo comprobarlo)de
estas opciones?:

(with celda): (miarray)
TextBox1 = .Offset(0,1).value o TextBox1 = miarray(j)

En cualquier caso si me podeis facilitar la direccion de dicha consulta o
de cualquier otra mas o menos especifica sobre el tema (me he dado unas
cuantas vueltas por los foros pero no he encontrado nada claro; lo de una
aguja en ...) os lo agradezco.

Un saludo y hasta pronto
Ivan

Preguntas similare

Leer las respuestas

#1 KL
14/06/2006 - 20:09 | Informe spam
Hola Ivan,

Si te he entendido bien, entonces la cosa es mas simple:

1) para asignar los valores de un rango a una variable en formato matriz basta la siguiente expresion:

Dim MiMatriz As Variable
MiMatriz=Range("A1:K1").Value

Esta expresion vale tanto para rangos unidimensionales como los bidimensionales. Ojo - al asignar la matriz de esta manera Excel automaticamente crea una matriz bidimensional tanto para ambos tipos de matrices con la base 1, p.ej. la instruccion

Dim MiMatriz As Variable
MiMatriz=Range("A1:K1").Value

generaria una matriz con los siguientes elementos:

MiMatriz(1,1)
MiMatriz(1,2)
MiMatriz(1,3)
MiMatriz(1,4)
MiMatriz(1,5)
MiMatriz(1,6)
MiMatriz(...)
MiMatriz(1,11)

2) en base a lo anterior y suponiendo que estamos hablando de los controles TextBox en un UserForm, asignarias los valores a los textboxes de la siguiente manera:

For i=1 to UBound(MiMatriz)
Controls("TextBox" & i)=MiMatriz(1,i)
Next i

En todo caso, para esta situacion seria mas eficiente evitar la creacion de la matriz hacer algo asi:

For i=1 to Range("A1:K1").Count
Controls("TextBox" & i)=Range("A1:K1")(i).Value
Next i

Saludos,
KL


"Ivan" wrote in message news:
Hola a todos de nuevo

Hace no mucho estuve leyendo, no se si directamente en este foro(tu
tiempo) o directamente en los de google, una consulta sobre matrices y
rangos creo que contestada por KL y ahora no consigo encontrarla y me
suena que era mas o menos lo que ando buscando. De todas formas suelto mi
duda por si podeis echarme un cable:

Hasta ahora solo he usado la funcion array para crear matrices, y,
cuando se trata de rangos (en general los campos de un unico registro para
rellenar con algun bucle for o algo similar), no se hacerlo si no es
introduciendo los campos uno a uno (pej: with celda: miarray=Array(.value,
Offset(0,1).value, ). ¿Se puden introducir con la f. array todo el
rango junto (pej: miarray=Array("a1:k1") o miarray=Array("a" & i &":k" 6
i))?. Con matrices creo recordar que si por aquella y otras consultas que
he leido, pero no se muy bien como, y creo que en la ayuda no lo indica
(al menos para la f. array) de una manera clara.

Por otro lado, para rellenar otro rango, o, pej. un textbox, cuando se
trata de buscar entre varios miles de registros(no mas de diezmil) y para
alrededor de 15 campos,¿que seria mas rapido (o como puedo comprobarlo)de
estas opciones?:

(with celda): (miarray)
TextBox1 = .Offset(0,1).value o TextBox1 = miarray(j)

En cualquier caso si me podeis facilitar la direccion de dicha consulta o
de cualquier otra mas o menos especifica sobre el tema (me he dado unas
cuantas vueltas por los foros pero no he encontrado nada claro; lo de una
aguja en ...) os lo agradezco.

Un saludo y hasta pronto
Ivan


Respuesta Responder a este mensaje
#2 KL
14/06/2006 - 20:15 | Informe spam
Opps! Fe de erratas: el siguiente codigo:

-
For i=1 to UBound(MiMatriz)
Controls("TextBox" & i)=MiMatriz(1,i)
Next i
-

deberia sustituirse por:

-
For i=1 to UBound(MiMatriz,2)
Controls("TextBox" & i)=MiMatriz(1,i)
Next i
-

Saludos,
KL
Respuesta Responder a este mensaje
#3 klomkbock
15/06/2006 - 01:28 | Informe spam
Hola KL, muchas gracias por tu atencion.

Esto es exactamente lo que queria, pero si tienes tiempo y puedes, me
gustaria consultarte algunos puntos de tu respuesta. Aunque te aviso que
te estoy respondiendo nada mas leer el mensaje, sin haber probado ni
consultado nada, cosa que posiblemente hubiese disminuido ¿o aumentado?
mis dudas. Vamos alla:

Dim MiMatriz As Variable



1º ¿Variable = Variant, o es una forma especifica de asignacion de tipo?

2º ¿no es nacesario el uso de parentesis al declarar la matriz? pensaba
que esto era solo cuando se creaba con la f. array

3º>"ambos tipos de matrices con la base 1", ¿en este caso entonces no seria
necsario declarar option base =1? (por tu comentario parece claro que no, pero
no se por que, con las cosas evidentes casi siempre me queda el gusanillo de
la duda)

MiMatriz=Range("A1:K1").Value =>> para mi esto vale un tesoro



En cuanto al bucle que viene a continuacion (que tambien vale un tesoro):

For i=1 to Range("A1:K1").Count
Controls("TextBox" & i)=Range("A1:K1")(i).Value
Next i



1ºNo sabia que se podia asignar un contador a un rango de esta forma
[Range("A1:K1")(i)]. ¿me podrias explicar como/porque funciona/es
posible?. Creo entender que no tiene que ver con la declaracion y
asignacion anteriores (Dim MiMatriz..:MiMatriz=Ran...), sino que es una
opcion diferente, y por lo que dices mas eficiente/¿rapida? que la matriz.

2ºEn cuanto a los textbox, un pequeño problema, aunque facilmente
subsanable,
en el caso de controles con nombre, ¿como se les podria asignar el indice
para que coincidiera con el contador?,¿Quizas en base al orden de
tabulacion? Otro cosa que habia pensado es en usar For each Control in
Userform1, o en una matriz de controles y otra del rango y asignar el
rango al control con el contador(en realidad algo muy similar a tu otro
bucle), pero cuando he probado algo parecido a esto:
MiMatriz1(i)=MiMatriz2(i) no he conseguido resultados. ¿no se puede
asignar el valor de una matriz al de otra matriz?.

Si me puedes aclarar las dudas te lo agradezco (y sino tambien).

Un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#4 KL
15/06/2006 - 08:17 | Informe spam
Hola Ivan,

1º ¿Variable = Variant, o es una forma especifica de asignacion de tipo?



Si, tienes razon - es un error de imprenta :-)

2º ¿no es nacesario el uso de parentesis al declarar la matriz? pensaba
que esto era solo cuando se creaba con la f. array



No lo es porque no declaras una matriz sino una variable Variant

3º>"ambos tipos de matrices con la base 1", ¿en este caso entonces no seria
necsario declarar option base =1? (por tu comentario parece claro que no, pero
no se por que, con las cosas evidentes casi siempre me queda el gusanillo de
la duda)



option base =1 NO es necesario en este caso

For i=1 to Range("A1:K1").Count
Controls("TextBox" & i)=Range("A1:K1")(i).Value
Next i



1ºNo sabia que se podia asignar un contador a un rango de esta forma
[Range("A1:K1")(i)]. ¿me podrias explicar como/porque funciona/es
posible?.



Pues simplemente es una forma de referirse a celdas en un rango que existe y debe ser +/- lo mismo que lo que hacemos con las matrices (Range("A1:B10")(2,5) o MiMatriz(2,5)) ya que los rangos y las matrices tienen algunas caracteristicas similares.

Creo entender que no tiene que ver con la declaracion y
asignacion anteriores (Dim MiMatriz..:MiMatriz=Ran...), sino que es una
opcion diferente, y por lo que dices mas eficiente/¿rapida? que la matriz.



Exactamente, con Range("A1:K1")(i) no necesitas crear la matriz. Es mas eficiente porque accedes a los valores del rango directamente sin necesidad de crear previamente una matriz.

2ºEn cuanto a los textbox, un pequeño problema, aunque facilmente
subsanable,
en el caso de controles con nombre, ¿como se les podria asignar el indice
para que coincidiera con el contador?,¿Quizas en base al orden de
tabulacion? Otro cosa que habia pensado es en usar For each Control in
Userform1, o en una matriz de controles y otra del rango y asignar el
rango al control con el contador(en realidad algo muy similar a tu otro
bucle),



Quizas podrias hacer algo como

MisControles=Array("Control1", "Control2", ...)
For i=0 To Ubound(MisControles)
Controls(MisControles(i))=MiMatriz(1,i+1)
Next i

pero cuando he probado algo parecido a esto:
MiMatriz1(i)=MiMatriz2(i) no he conseguido resultados. ¿no se puede
asignar el valor de una matriz al de otra matriz?.



Si, se puede asignar el valor de una matriz al de otra matriz, pero debes hacerlo correctamente:

MiMatriz(1,i) y no MiMatriz(1) ya que la matriz que sacamos de un rango es bidimensional a pesar de tener solo una columna. Ademas vigila que ambas matrices tengan la misma base, p.ej. si MiMatriz1 tiene la base 1, MiMatriz2 tiene la base 0, y usas el contador que empieza por 1, deberas hacer lo siguiente:

For i=1 To Ubound(MiMatriz1,2)
MiMatriz1(1,i)=MiMatriz2(i-1)
Next i

o al reves

For i=0 To Ubound(MiMatriz2)
MiMatriz1(1,i+1)=MiMatriz2(i)
Next i

Saludos,
KL
Respuesta Responder a este mensaje
#5 klomkbock
15/06/2006 - 12:17 | Informe spam
Hola KL, muchas gracias por todo.

Me has aclarado muchas dudas y muy "serias". Ahora a ver si consigo
llevarlas a la practica.

Gracias de nuevo y un saludo
Ivan
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida