Habrás solucionado tu problema pero al final nadie te ha explicado otra que has pedido crear subprocedimientos... ya te lo explico yo...
Sea que tienes un código de 40.000 líneas o las que sean ejemplo:
public sub elProcedimiento()
codigo linea 1
codigo linea 2
.
.
.
codigo linea 39999
codigo linea 40000
end sub
pués se trata de añadir un módulo (menú proyecto añadir módulo) o más...
y hacer algo como esto:
public sub elProcedimiento() 'esto sería la función inicial
call codigo1_10000
call codigo10001_20000
call codigo20001_30000
call codigo30001_40000
end sub
' este otro código iría en el módulo añadido
public sub codigo1_10000
codigo linea 1
codigo linea 2
.
.
.
codigo linea 9999
codigo linea 10000
end sub
public sub codigo10001_20000
codigo linea 10001
codigo linea 10002
.
.
.
codigo linea 19999
codigo linea 20000
end sub
public sub codigo20001_30000
....
end sub
public sub codigo30001_40000
.... ídem
end sub
Como ves hemos dividido el código en 4 rutinas con nombre sin significado alguno, a fin de que te quede más claro...
Lo lógico no es partir el código arbitrariamente por cualquier línea, sino hacerlo por 'tareas'... supongamos que tu código varias veces toma una cadena, busca algo en ella y si lo encuentra lo remplaza por otra, pués esa funcionalidad es una tarea específica que puede ser despejada a un módulo como una función, que por ejemplo podría llamarse remplazar_Cadena ahora revisando todo tu código cada vez que hagas esa dentro de ella deberías sustituirlo por algo como lo siguiente:
call remplazar_Cadena(cadenaOriginal, CadenaABuscar, ramplazo)
Naturalmente antes habría que haber trasladado el código que hace esa tarea al módulo que sería algo como esto:
public sub remplazar_Cadena(byref cadenaOrigen as string, buscar as string, remplazarCon as string)
código que busca la cadena y lo remplaza...
end sub
Cuando trabajas en un módulo se debe tener en cuenta el ámbito de las variables, esto es el 'alcance'. todas las variables de una función son reconocidas dentro de la función, pero una variable que es 'local' a una función no es accesible desde otra función, cuando se necesita disponer de variables accesibles desde diferentes funciones, hay que declaralas públicas en un módulo algo así como
public estaVariable as integer
public otraVariable as string
public unaMatriz() as byte
Estas variables así declaradas en un módulo estarán disponibles en el formulario y por tanto podrás usarlas en todas las funciones..
Cuando sales de una función, todas las variables declaradas dentro de la función son borradas, al acceder nuevamente a la función las variables son nuevamente creadas, con el valor que les des, si no les das valor tomarán el que les es propio por fecto (0 para las numéricas, "" para los strings, etc..). entonces si quieres que una función 'recuerde' una variable entre llamadas, esto es que no la borre al salir de la función hay que declararla como Static, ejemplo:
' este ejemplo siempre la variable acumulador pierde su valor
public function Sumar( valor as integer) as long
dim acumulador as long ' cada vez que entre acumulador vale 0
acumulador=acumulador + valor
sumar=acumulador 'cuando salga acumulador dejará de existir
end function
' en este ejemplo la variable acumulador guarda su valor..
public function Sumar( valor as integer) as long
static acumulador as long ' cada vez que entre acumulador vale lo que valía la última vez que se salió
acumulador=acumulador + valor
sumar=acumulador 'cuando salga acumulador seguirá existiendo
end function
por último indicarte que desde un módulo para acceder a los controles situados en el formulario, deberás indicar además del nombre del control también el nombre del formulario, de otro modo no lo reconocerá, ejemplo: si tenía text1.text="Mi casa" desde un módulo tendrás que indicarlo así: Form1.text1.text="Mi casa" (form1 es el nombre que le hayas dado al formulario). Si tienes que usar muchas veces 'form1' en vez de usarlo cada vez puedes abreviarlo así:
public sub Sumar(valor as integer)
static acumulador as long
with form1
.text1.text= acumulador + valor
.command1.enabled=true
end with
end sub
observa que se escribe with nombreDelFormulario y se cierra con un 'end nombredelformulario' y nota que cada control referenciado lleva delante de su nombre un punto.
Saludos.