Problema con una macro en Microsoft Excel

Hola !
Tengo una macro en donde estoy tratando de que desde un formulario al teclear una cantidad en un textbox vaya a la hoja activa y en una determinada columna (L) en la ultima fila que contenga datos, que en este caso es un saldo en cantidades, si el saldo es menor que la cantidad tecleada en el textbox envíe un mensaje de "Saldo negativo" y no permita que la macro se ejecute.
En esta macro aunque no se de la condición de cualquier forma me sale el mensaje.
Private Sub CANTIDAD_AfterUpdate()
Application.ScreenUpdating = False
saldo = ActiveSheet.Range("L" & Rows.Count).End(xlUp).Value
If saldo < Me.CANTIDAD.Value Then
MsgBox "GENERA SALDO NEGATIVO", vbOKOnly + vbInformation, "**CORREGIR"
End If
Me.COD.Value = ""
Me.DES.Value = ""
Me.REFER.Value = ""
Me.CLIENT.Value = ""
Me.PROYE.Value = ""
Me.CANTIDAD.Value = ""
Me.COD.SetFocus
Exit Sub
Application.ScreenUpdating = True
End Sub
Gracias de antemano.
Saludos

1 Respuesta

Respuesta
1
Pueden haber dos errores posibles:
1.- Que no estés tomando el valor de la celda que deseas tomar.
Para comprobarlo de forma fácil, luego que haces la asignación a saldo, puedes poner un Msgbox saldo, para verificar que efectivamente estás asignando el valor deseado.
2.- Que te esté evaluando los valores como cadenas de texto y no como cantidades, en tal caso un valor "2" llega a ser mayor que "1000", porque "2" es mayor que "1"
Para solucionar esto tienes dos soluciones
- declaras la variable saldo como: Dim saldo as Double
o haces la comparación:
If CDbl(saldo) < CDbl(Me.CANTIDAD.Value) Then
Si nada de eso te resulta, me dices...
Gracias por tu pronta respuesta.
El mensaje me da cero.
Dim saldo as Double sigue el problema
If CDbl(saldo) < CDbl(Me.CANTIDAD.Value) Then se presenta error "No coinciden los tipos"
Saludos
El mensaje te da cero ¿Es cero lo que hay en la celda?, si lo que hay en la celda no es cero, estás tomando mal el valor.
Con respecto a la comparación, utiliza
Dim saldo as Double
Pero en lugar de la propiedad value, en CANTIDAD, utiliza la propiedad Text
Me. CANTIDAD.Text
Hola buenas tardes y disculpa la molestia.
Partiendo de que el mensaje me da cero y del comentario que me hiciste, parece ser que el problema es que toma como hoja activa, otra, y no la que debe ser, esto es porque en otro textbox llamo a esa otra hoja para que realize una instrucción.Lo que hice fue seleccionar la hoja que debe de ser la que el proviene de otro textbox. Si se da la condición me envía el mensaje correctamente solo que al oprimir el botón de "Salir" me envía un error(9) "subíndice fuera de rango".
Te envío todo el código del formulario para que por favor le des una checada y seguramente encontrarás que estoy haciendo mal.
Private Sub ACEPTAR_Click()
Application.ScreenUpdating = False
Dim CANTIDAD As Double
Dim COD As String
Dim DES As String
Dim PROYE As String
Dim CLIENT As String
Dim REFER As String
If Me.CANTIDAD.Value = Empty Or _
Me.COD.Value = Empty Or _
Me.DES.Value = Empty Or _
Me.PROYE.Value = Empty Or _
Me.CLIENT.Value = Empty Or _
Me.REFER.Value = Empty Then
    MsgBox "FAVOR COMPLETAR DATOS", vbOKOnly + vbInformation, "**INFORMACION INCOMPLETA"
Exit Sub
End If
Sheets(Me.COD.Value).Select
libre = ActiveSheet.Range("B65536").End(xlUp).Row + 1
ActiveSheet.Cells(libre, 2) = Date
ActiveSheet.Cells(libre, 3) = "SALIDA"
ActiveSheet.Cells(libre, 4) = Me.REFER
ActiveSheet.Cells(libre, 5) = Me.CLIENT
ActiveSheet.Cells(libre, 6) = Me.PROYE.Text
ActiveSheet.Cells(libre, 11) = Val(Me.CANTIDAD)
ActiveSheet.Cells(libre, 12) = ActiveSheet.Cells(libre - 1, 12) - Val(Me.CANTIDAD)
ActiveSheet.Cells(libre, 15) = Val(Me.CANTIDAD) * ActiveSheet.Cells(libre, 13)
ActiveSheet.Cells(libre, 16) = ActiveSheet.Cells(libre - 1, 16) - ActiveSheet.Cells(libre, 15)
Me.COD.Value = ""
Me.DES.Value = ""
Me.REFER.Value = ""
Me.CLIENT.Value = ""
Me.PROYE.Value = ""
Me.CANTIDAD.Value = ""
Me.COD.SetFocus
Application.ScreenUpdating = True
End Sub
Private Sub CANCELAR_Click()
Me.COD.Value = ""
Me.DES.Value = ""
Me.REFER.Value = ""
Me.CLIENT.Value = ""
Me.PROYE.Value = ""
Me.CANTIDAD.Value = ""
Me.COD.SetFocus
End Sub
Private Sub CANTIDAD_AfterUpdate()
Dim saldo As Double
Application.ScreenUpdating = False
Sheets(Me.COD.Value).Select ' Aqui es donde marca el error

saldo = ActiveSheet.Range("L" & Rows.Count).End(xlUp).Value
If saldo < Me.CANTIDAD.Value Then
MsgBox "GENERA SALDO NEGATIVO" & Chr(13) & "SALDO ACTUAL UNIDADES " & Chr(58) & saldo, vbOKOnly + vbInformation, "**CHECAR"
Me.COD.Value = ""
Me.DES.Value = ""
Me.REFER.Value = ""
Me.CLIENT.Value = ""
Me.PROYE.Value = ""
Me.CANTIDAD.Value = ""
Me.COD.SetFocus
Exit Sub
End If
Application.ScreenUpdating = True
End Sub
Private Sub COD_Change()
Application.ScreenUpdating = False
Sheets("Catalogo Producto").Select
filalibre = Range("A1").End(xlDown).Row
NUMERO = Me.COD
rango = "A1:A" & filalibre
Set midato = ActiveSheet.Range(rango).Find(NUMERO, LookIn:=xlValues, LookAt:=xlWhole)
If Not (midato) Is Nothing Then
ubica = midato.Address(False, False)
Me.DES.Value = Range(ubica).Offset(0, 1).Value
End If
Set midato = Nothing
Sheets("MENU").Select
Application.ScreenUpdating = True
End Sub
Private Sub SALIR_Click()
Unload SALIDA
End Sub
Saludos
Ese error te lo da cuando el argumento que le das a sheets(argumento) no es encontrado dentro de la colección de hojas, sea este argumento númerio o el nombre de la hoja.
Evalúa en ese lugar cual es el valor que trae Me. COD. Value, para que verifiques si realmente indica la hoja que deseas referenciar (puede ser con MsgBox).
Si el valor de Me. COD.Value es el índice numérico, utiliza CDbl(Me. COD. Value) o cualquier conversor numérico, porque si no, te lo tomará como texto.
Ej: Me.COD.Value = 1
     Sheets(Me. COD. Value) equivale a sheets("1"), en cambio
     Sheets(CDbl(Me. COD. Value)) equivale a sheets(1)
Si el valor de Me. COD. Value no es numérico al momento de evaluar, CDbl(Me. COD. Value) te arrojará un error de tipo.
Hola que tal.
Parece ser que ya encontré la falla. Cheque como me lo indicaste y el mensaje muestra la hoja correctamente solo que después tiene la instrucción de borrar toda la información que hay en todos los textbox entonces borra el correspondiente Me.Cod e inmediatamente aparece el error. La cuestión es que no quiero eliminar esa instrucción, hay manera de evitarlo.?
Saludos.
Una forma fácil de solucionar el problema es almacenar el valor del campo Me. Cod en una variable que se conozca en todo el formulario, antes de borrar su contenido.
Para ello, en la sección (General) del formulario puedes declarar la variable de la siguiente forma:
Dim dblCod as Double
Ahora te resta escoger el evento en que harás esta asignación.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas