Macro en access o excel para auto completar un campo alfanumérico creado.

ParaSveinbjorn El Rojo

Sveinbjorn El Rojo

Hola, el caso es que mediante al ayuda de un experto logré crear un campo alfanumérico con el código BVA en access, dicho código se ejecuta como podrán ver después de actualizar el combobox Programa..

Private Sub Programa_AfterUpdate()
Dim ultimoAN As String
Dim ultimoANNum As Long
If Not IsNull(Me.Expe) Then Exit Sub
ultimoAN = Nz(DMax("Expe", "Colaboradores", "Año=" & Me.Año & " AND Programa ='" & Me.Programa & "'"), "")
If ultimoAN = "" Then
    Me.Expe = Me.Año & " " & Me.Programa & " " & Format(1, "0000")
    Exit Sub
End If
ultimoANNum = CLng(Right(ultimoAN, 4))
ultimoANNum = ultimoANNum + 1
Me.Expe = Me.Año & " " & Me.Programa & " " & Format(ultimoANNum, "0000")
End Sub

Esto me resulta de maravillas para los nuevos registros, pero tengo casi 1000 registros anteriores a los cuáles tendría que recorrer uno a uno, reseleccionandole el Programa para que me asigne el código alfanumédico que le pertenece...

Necesito autocompletar si existe alguna forma el campo para los registros ya guardados en la taba..

Me da igual si se hace en access directamente, o si exporto la tabla para Excel, lo hago y luego pego la columna creada en Access.

Se usarían los campos o columnas para ello, Año, Programa y el autonumérico resultante del código BVA..

1 respuesta

Respuesta
1

Es muy fácil: lo único que has de hacer es, en el evento de un botón que luego borrarás, crear un recordset sobre tu tabla, y un bucle que lo recorra todo ejecutando el mismo código (pero adaptado al recordset). Para evitar problemas yo borraría los datos que ya tienes en tu campo "autonumérico".

Private Sub ..._Click()
Dim rst As DAO.Recordset
Dim ultimoAN As String
Dim ultimoANNum As Long
Set rst=CurrentDb.OpenRecordset("Colaboradores")
rst.MoveNext
Do Until rst.EOF
  'If Not IsNull(Me.Expe) Then Exit Sub
  ultimoAN = Nz(DMax("Expe", "Colaboradores", "Año=" & rst("Año") & " AND Programa ='" & rst("Programa") & "'"), "")
  rst.Edit
  If ultimoAN = "" Then
      rst("Expe")=rst("Año") & " " & rst("Programa") & " " & Format(1, "0000")
  Else
       ultimoANNum = CLng(Right(ultimoAN, 4))
       ultimoANNum = ultimoANNum + 1
       rst("Expe") = rst("Año") & " " & rst("Programa") & " " & Format(ultimoANNum, "0000")
  End If
  rst.Update
  rst.MoveNext
Loop
End Sub

Creo que el código está correcto, pero por si acaso, haz una copia de tu bd antes de ejecutarlo.

Un saludo.


Un nuevo foro de access, visítanos: http://nksvaccessolutions.com/Foro/ 

Hola Sveinbjorn El Rojo

Sveinbjorn El Rojo funciona al 100.. ahora, tengo otra condicional que logré agregarla al código como estaba anterior mente, pero ahora no se donde encaja ahora en este nuevo que me envías que solo sería para llevar los registros ya existentes, y luego utlizaría la primera versión del código.

If Me.Estatus_colab = "FIN" Then Exit Sub

Nada, que tendo también un grupo de personas que quedan en el registro pero ya no tiene sentido asignarle un número de expediente pues ya no están.. son "FIN" .. quiero que salte a esas personas cuando recorra los registros..

Gracias!

Si te he entendido bien, quieres que si Estatus_colab tiene el valor Fin no actualice el autonumérico, ¿no? Te pongo las modificaciones en negrita:

...

Do Until rst.EOF

If rst("Estatus_colab")="FIN" Then Goto Siguiente:

'Código existente

Siguiente:

Rst. MoveNext
Loop

Hola, me señala un Goto Siguiente:

y me dice: Error de complicación, no se ha definido la etiqueta.... repetí loop

____________________________________________

Private Sub Comando1252_Click()
Dim rst As DAO.Recordset
Dim ultimoAN As String
Dim ultimoANNum As Long
Do Until rst.EOF
If rst("Estatus_colab") = "FIN DE MISION" Then GoTo Siguiente:
Set rst = CurrentDb.OpenRecordset("Colaboradores")
'Código existente
rst.MoveNext
Do Until rst.EOF
  'If Not IsNull(Me.Expe) Then Exit Sub
  ultimoAN = Nz(DMax("Expe", "Colaboradores", "Año=" & rst("Año") & " AND Programa ='" & rst("Programa") & "'"), "")
  rst.Edit
  If ultimoAN = "" Then
      rst("Expe") = rst("Año") & " " & rst("Programa") & " " & Format(1, "0000")
  Else
       ultimoANNum = CLng(Right(ultimoAN, 4))
       ultimoANNum = ultimoANNum + 1
       rst("Expe") = rst("Año") & " " & rst("Programa") & " " & Format(ultimoANNum, "0000")
  End If
  rst.Update
  rst.MoveNext
  rst.MoveNext
Loop
Loop
End Sub

Gracias!!

Dariel, has de fijarte mejor en lo que te decimos, no es coger y pegar a lo loco...

En mi última respuesta, te marco en negrita las líneas que has de modificar o añadir a tu código, y donde pongo Código existente es para que pongas el código que ya tenías en entre las líneas en negrita.

Por cierto, se me coló un errata, en la primera línea en negrita le sobran los dos puntos (:) del final.

Tiene toda la razón, lo hice como indicaba anteriormente y todo marcha bien.

Muchas gracias!!

NO hay de qué!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas