En este grupo En todos

Foro de Excel



¿Como pasar un array de un modulo a otro en VBA?

AAni
3 ddd
Escrito por Aani Aaas
el 28/05/2010

Cuando comienzo a programar en un modulo de Excel llega un momento es que he escrito tanto que no me deja seguir escribiendo dentro de ese modulo,bueno realmente si deja seguir escribiendo pero a la hora de guardarlo me dice que me he pasado y es demasiado codigo para un solo modulo,la solucion que hago es hacer una llamada call a un segundo modulo e ir metiendolo ahí os pongo un ejemplo


Option explicit

Sub a()

Dim x as integer

(todo el codigo)

Call b(x)

End sub

Y luego en ese Segundo modulo


Sub b(x as integer)

Continuo con el codigo

End sub

El problema que tengo es si quiero pasar arrays a traves del call en lugar de pasar simplemente variables, ¿Si quisiera pasar un array x(9) en lugar de x ¿Se puede pasar a este segundo modulo?


Como solucion alternativa lo que hago es declarar el array x(9) como publico en todo el proyecto pero me gustaria poder pasarlo localmente como hago con x

Gracias
Un saludo

Abraham Valencia
Computacion e informatica microsoft mv...
Escrito por Abraham Valencia
el 28/05/2010

Pues lo correcto es eso, declarar la variable como publica, lo que no me queda claro es que te refieres con "en todo el proyecto" y a que te refieres con "pasarlo localmente"

Las variables publicas se declaran UNA SOLA VEZ y en modulos "normales" y FUERA de las rutina (se las declara en la parte "superior" de los modulos)

Ejemplo:

----------------------------
"Local" - Para todos los procedimientos del "modulo"

Dim x As Integer
Sub ccc ()
x=78
Msgbox x
End Sub
------------------------------

----------------------------
"rutina" - solo para la respectiva rutina

Sub ccc ()
Dim x As Integer
x=78
Msgbox x
End Sub
------------------------------

----------------------------
"publica" - para cualquier rutina de cualquier modulo

Public x As Integer

Sub ccc ()
x=78
Msgbox x
End Sub
------------------------------

Abraham

Escrito por Aani Aaas
el 28/05/2010

No me he explicado bien, lo que quiero es pasar el valor de una variable del modulo 1 al modulo 2 sin necesidad de declararla como publica ,si la variable es X es facil pero si es un array bidimensional del tipo dim x(8,9) as integer ya no lo se hacer no se que tengo que poner en el call y tampoco dentro del sub del segundo modulo que va a recibir el valor

si es solo X es asi
call A (x)

sub A(dim x as integer)

pero si es un array y pongo esto

call A (x(8,9))

sub A(dim A(8,9) as integer)

no me lo coje el programa asi que me imagino que sera de otra forma de ahi la duda

Un saludo y gracias por el interes llevo mucho tiempo detras de esto.

Abraham Valencia
Computacion e informatica microsoft mv...
Escrito por Abraham Valencia
el 28/05/2010

- Para usar una variable entre rutinas y/o eventos de distintos modulos, es OBLIGADA la declaracion como publica

- No termino de entender lo que deseas hacer, y no se entienden las lineas que envias

- Una forma de pasar Arrays como parametros:

Sub xxxx (cosa () as Integer)



Abraham

Escrito por Aani Aaas
el 29/05/2010

Abraham un detalle, no es del todo exacto eso que dices de que para usar variables entre distintos modulos es obligado que sea publica

copiate esto en un modulo de excel
Option explicit
Sub moduloA()
`declaro x como local en el modulo A
Dim x as integer
'ahora llamo a un segundo modulo llamado moduloB y le paso el valor de X que es local en el modulo A
x=5
Call moduloB(x)
hoja1. Cells(1,1)=x
End sub


Y luego en ese Segundo modulo recibes el valor de x (haces lo que tengas que hacer con x y devuelves el valor de x al modulo A

Option explicit
Sub moduloB(x as integer)
x=5+x
End sub

en este ejemplo no declaro variables publicas y la variable x la muevo entre diferentes modulos al final el resultado es 10

Mi problema es ¿Como hago lo mismo si es un array en lugar de una variable monodimensional cuando hago la llamada con call en el primer modulo y cuando la recibo con sub en el segundo ¿Como lo escribo para que me acepte el codigo y que no se me ponga en rojo?

Un saludo y perdon por la paciencia

Abraham Valencia
Computacion e informatica microsoft mv...
Escrito por Abraham Valencia
el 29/05/2010

¿Te percatas que en relidad son 2 variables diferentes con el mismo nombre y no una? Ya te dije, NO se puede... Estas mal interpretando.

Si explicas mejor que es puntualemente lo que deseas tratare de ayudarte

Abraham

Escrito por Héctor Miguel Orozco Díaz
el 29/05/2010

Hola,!

como dice Abraham, es mejor abandonar el cripticismo si buscas propuestas concretas?
en via de mientras (por lo que pudiera valer), analiza los siguientes comentarios y

Si cualquier duda (o informacion adicional... ) comentas?
saludos,
hector.

Al usar Call estas cediendo (temporalmente) el control de la macro
por ello es que la variable puede ser alterada en el procedimiento llamado (p.e.)

Sub A_2_Sub()
Dim x As Integer
x = 5
Call B(x)
[a1] = x
End Sub
Sub B(x As Integer)
x = 5 + x
End Sub

Lo que equivale a usar un procedimiento Function de la forma siguiente:

Sub A_2_Function()
Dim x As Integer
x = 5
[a1] = fxB(x)
End Sub
Function fxB(x As Integer) As Integer
fxB = 5 + x
End Function

En otras palabras, con respecto de la instruccion Call (segun {F1} de excel/vba):

1) Transfiere el control a un procedimiento Sub, a un procedimiento Function
o a un procedimiento de biblioteca de vinculos dinamicos (DLL)

2) si utiliza cualquiera de las formas de la sintaxis Call para llamar a cualquier funcion...
se descartara el valor devuelto por la funcion

3) para transferir una matriz completa a un procedimiento
utilice el nombre de la matriz seguida de parentesis vacios

Escrito por Aani Aaas
el 29/05/2010

HOLA HECTOR la idea de usar 2 modulos en lugar de modulo+funcion es porque escribo tanto codigo que llega un momento que el modulo 1 se queda pequeño ademas como el modulo 2 va a ser igual de grande o mas que el modulo 1 eso me da mas orden que usando modulo+funciones

Creo que ya esta con esto que me decis para transferir una matriz completa a un procedimiento
utilice el nombre de la matriz seguida de parentesis vacios

LO QUE QUIERO ES ESTO

OPTION EXPLICIT

SUB MODULO1

DIM Z AS INTEGER

DIM X(2,2) AS INTEGER

X(1,1)=1

X(2,2)=2

CALL(Z,x() )

HOJA1. CELLS(1,1)=Z

END SUB

OPTION EXPLICIT

SUB MODULO2(Z AS INTEGER,x() as integer)

‘HAGO CALCULOS

Z=X(1,1)+X(2,2)

END SUB

Gracias a todos voy a probarlo
Un saludo

Escrito por Aani Aaas
el 06/06/2010

GRACIAS A TODOS YA ESTA SOLUCIONADO ERA ALGO TAN TONTO COMO ESTO,METER EL PARENTESIS!

CALL(x() )
SUB MODULO2(x() as integer)

Cacho Rodríguez
Ingeniería electrónica universidad nac...
Escrito por Cacho Rodríguez
el 06/06/2010

Fueron muy "amigables" las sugerencias de Abraham y de Héctor.
Mas: ¡No me quedó muy claro cual era el problema de fondo...!

Pero si ya encontraste la solución...
Hasta la próxima, Cacho.