Cómo impido que el usuario deje filas vacías cuando completa la tabla?

Arme una tabla que tiene cuatro columnas que el usuario debe completar y luego seguir con la fila siguiente, luego oprime un botón que se llama Registrar que ejecuta una macro que pasa los datos a una base de datos en el libro, pero si el usuario deja una fila vacía o no comienza en la primer fila la Macro no copia correctamente los datos y genera un error.

Me gustaría saber como puedo hacer una macro que controle que en la fila superior a la que se encuentra cargando los datos esté completa y que en caso que no sea así no lo deje ingresar el dato y le aparezca un mensaje en que se lo advierta.

Tengo nociones básicas de Macros pero no logro entender como funcionan las que se refieren a eventos que suceden dentro de una misma hoja. Si de paso me dicen donde puedo aprender más de ello.

1 Respuesta

Respuesta
2

¿Puedes mandarme el libro?

Es que es la mejor forma de responder exactamente a lo que necesitas y para que entienda mejor lo que quieres.

MI correo es [email protected]

Pon como asunto el título de la pregunta y como nombre del libro

ImpedirFilasVacias.XLSM

Hola! Que rapidez!

Ya te envié el libro, espero ansioso novedades, todo el día llevo tratando de solucionarlo.

Gracias!

Saludos

Me olvide aclarar...

La tabla en cuestión es la que se encuentra en la hoja Orden de Compra es la que tiene los dos botones.

Saludos nuevamente

De momento simplemente he colocado bien las lineas de la macro para que se pueda ver como se ejecuta. Yo creo que es una macro gigante, seguramente la podre simplificar mucho.

Pero he aquí que una de las condiciones que pones para que se pueda registrar es

cuentafila = 4

donde

cuentafila = WorksheetFunction.Count(Range("C9:F9"))

Pero las cuatro columnas no son números, porque he visto que en descripción pones letras. Entonces cuando yo pongo letras en descripción el número máximo que me da cuentafila es 3 y no se registra. Tengo que poner un número en descripción para que funcione.

Yo creo que ese comportamiento no es el que quieres y por lo tanto hay que poner

cuentafila = WorksheetFunction.CountA(Range("C9:F9"))

Que esa función devuelve todas las celdas que tienen algo.

Asimismo veo que esa comprobación solo la haces en la primera fila, con lo cual yo puedo ponerte bien la primera fila pero en las siguientes puedo ponerte filas vacías y las admite.

Imagino que esto también habrá corregirlo.

Espero me contestes a esas dos cuestiones antes de seguir.

Si, se nota lo poco que se por lo larga que es... es la primer macro que hago escribiendo yo, que se le va a hacer...

Tenes razón con lo de la función contar corresponde contara

Lo puse solo en la primera fila porque pensé que podía por un lado hacer eso para que la Macro se detenga en caso que no haya un valor en la primera fila y por el otro generar un código que me impida poner datos en la segunda si en la primera no hay nada y lo mismo para la tercera respecto de la segunda y así seguiría la lógica hasta la última, no se si es la mejor manera pero es la que se me ocurrió.

¿Entonces lo que quieres es que no registre nada si hay alguna fila defectuosa?

Lo más sencillo creo que es contar las filas y luego ver si las celdas con contenido son 4 veces el número de filas. Entonces si alguna está vacía no se registra nada.

El tema es que no necesariamente tiene que completar todas la filas, el tema es tiene que completar la cantidad de filas que necesite pero siempre tienen que estar completas las cuatro columnas y ademas todas las filas tienen que estar una abajo de la otra sin saltear ninguna en blanco porque si no la macro no la va a copiar.

Perdón si no soy del todo claro...

Si, no lo había leído pero eso es lo que he hecho. Voy a poner aquí la macro por si a alguien le sirve alguna de las técnicas. No te asustes, hace lo mismo que la que tenías y un poco más.

Sub RegistrarOC()
'By ValeroASM
Dim CuentaCeldas, UltimaFila, Filas, Posicion, PosicionFin As Integer
UltimaFila = WorksheetFunction.Max(Range("C51").End(xlUp).Row, Range("D51").End(xlUp).Row, _
             Range("E51").End(xlUp).Row, Range("F51").End(xlUp).Row)
Filas = UltimaFila - 8
CuentaCeldas = WorksheetFunction.CountA(Range("C9:F" & UltimaFila))
If Filas < 1 Or CuentaCeldas <> 4 * Filas Then
   MsgBox ("Faltan datos, deben ir todos en las primeras líneas y no faltar ninguno")
   Exit Sub
End If
If Range("G2") <> Empty And Range("C4") <> Empty And Range("C5") <> Empty And Range("C55") <> Empty And Range("F55") <> Empty Then
   Application.ScreenUpdating = False
   Range("C9", Range("C9").End(xlToRight).End(xlDown)).Copy
   With Sheets("BBDD OC")
      Posicion = WorksheetFunction.Max(2, .Range("G2").End(xlDown).Offset(1, 0).Row)
      PosicionFin = Posicion + Filas - 1
      .Select
      .Cells(Posicion, "G").Select
      .Paste
      Application.CutCopyMode = False
      .Range(.Cells(Posicion, "A"), .Cells(PosicionFin, "A")) = Sheets("Orden de compra"). Range("G2")
      .Range(.Cells(Posicion, "B"), .Cells(PosicionFin, "B")) = Sheets("Orden de compra"). Range("C4")
      .Range(.Cells(Posicion, "C"), .Cells(PosicionFin, "C")) = Sheets("Orden de compra"). Range("C5")
      .Range(.Cells(Posicion, "D"), .Cells(PosicionFin, "D")) = Sheets("Orden de compra"). Range("F55")
      .Range(.Cells(Posicion, "E"), .Cells(PosicionFin, "E")) = Sheets("Orden de compra"). Range("C55")
      .Range(.Cells(Posicion, "F"), .Cells(PosicionFin, "F")) = "No"
      .Range(.Cells(Posicion, "K"), .Cells(PosicionFin, "K")) = Sheets("Orden de compra").Range("G3")
   End With
   Sheets("Orden de compra").Select
   ActiveSheet.PrintPreview
   Range("C9:F50,G2:G3,C4:G5,C55:D55,F55:G55").ClearContents
   Application.ScreenUpdating = True
Else
   MsgBox "Presione la tecla Nueva OC e ingrese los datos necesarios para registrar la OC"
End If
End Sub

Ahora te envío el fichero para que lo pruebes. Si no entiendes algo o hay algún fallo dímelo. Y si ya está bien no olvides puntuar.

Muchísimas gracias! Además de solucionar mi problema aprendí muchísimo con la optimización que le hiciste a la macro.

Para otra vez me queda pendiente aprender a utilizar las funciones referidas a eventos que se disparen ante la modificación de una celda, pero oportunidades no van a faltar.

Muchas gracias de nuevo.

Saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas