Hola, como te dice
Valentino, debes setear el recordset al entrar en la función, pero lo que ya no tiene sentido es poner esta instrucción:
If rst_actualiza.State = adStateOpen Then rst_actualiza.Close
Porque cuando se asigna el recordset a la variable 'rst_actualiza' el objeto recordset siempre está cerrado.
Por otra parte, hay algunas cosas que me llaman la atención:
rst_actualiza!p_uni = rst_actualiza!p_uni * 1
¿Qué es lo que quieres hacer? pues le estás asignando el mismo valor (el resultado de un número multiplicado por la unidad es siempre el mismo número).
For i = 0 To Val(frm_presupuesto.MSHFlexGrid1.Rows) - 1 Step 1
La función
Val sobra, ya que la propiedad Rows del control MSHFlexGrid devuelve un
Long.
La instrucción
Step 1 sobra ya que en un bucle For..Next siempre se salta paso a paso (de uno en uno).
Esta instrucción se suele poner si quieres realizar el bucle de dos en dos (o mas) o si se quiere hacer de atrás hacia adelante (Step -1).
Saludos