Bueno, intentaré comentarte las dudas, ya que inicialmente te comenté de crear las funciones multiuso y parece que te confundió un poco.
En primer lugar los valores intermedios en un Type están ya declarados y no es necesario volver a hacerlo, es mas, no se puede.
Yo utilizó en todos mis programas archivos random y acostumbro a crear una Rutina de control del Archivo como la Siguiente, supongamos que tengo un archivo llamado Clientes, entonces haría mas o menos:
Código vb:
Ver originalOption Explicit
Private Type CamposClientes
Codigo As String * 10
Nombre As String * 40
Domicilio As String * 40
Poblacion As String * 40
' Posiciones disponibles en el Registro. Con esto consigo la longitud deseada, por ejemplo 256
Libres As String * 126
End Type
Dim RegistroClientes As CamposClientes
Sub FicheroClientes(Opcion As String, Registro As Single)
' Variable de número de Fichero. Estática para guardarla en la Rutina.
Static Numero As Integer
' Si Número = Cero el archivo no está abierto. Lo asignamos y Abrimos.
If Numero = 0 Then
Numero = FreeFile
Open "CLIENTES.DAT" For Random As #Numero Len = 256
End If
Select Case LCase(Opcion)
Case Is = "leer"
' Si pido un registro que no está en el fichero o Registro = 0 devolvemos Registro = -1
If Registro = 0 Or Registro > LOF(Numero) / 256 Then
Registro = -1
Exit Sub
End If
Get #Numero, Registro, RegistroClientes
Case Is = "grabar"
' Si no indico número de registro, añadirá al final. Si se le indica lo actualizará
If Registro = 0 Then Registro = LOF(Numero) / 256 + 1
Put #Numero, Registro, RegistroClientes
Case Is = "cerrar"
Close #Numero
Numero = 0
Case Is = "registros"
' Devuelve en Registro el número de Registros que contiene el fichero
Registro = LOF(Numero) / 256
End Select
End Sub
Analiza este código y veras que resulta muy simple y personalmente lo considero práctico.
Por ejemplo, necesito hacer un bucle que me lea todos los registros, puedo hacer dos cosas.
FicheroClientes "registros", Registros
For Registro = 1 to Registros
FicheroClientes "leer", Registro
' Procesar el registro leido
Next
o tambien puedo hacer
Do
Registro=Registro + 1
FicheroClientes "leer", Registro
If Registro = -1 Then Exit do
' Procesar el registro leido ya que tienes acceso a sus valores
Loop
Depende de ti, en el primer caso puedes poner una barra de progreso tal que así
FicheroClientes "registros", Registros
Barra.Min = 1
Barra.Max = Registros
For Registro = 1 to Registros
FicheroClientes "leer", Registro
Barra.Value = Registro
' Procesar el registro leido
Next
Lógicamente cuando quieras puedes hacer RegistroClientes "cerrar", 0 ' El cero es necesario porque el parámetro no se ha definido como opcional
Si se hubiera definido
Sub FicheroClientes(Opcion As String, Optional Registro As Single)
podrías cerrarlo así RegistroClientes "cerrar"
Nos vemos