Visual Basic - Error 94 en tiempo de ejecución, uso no valido de Null

Life is soft - evento anual de software empresarial
 
Vista:

Error 94 en tiempo de ejecución, uso no valido de Null

Publicado por Gravy (2 intervenciones) el 08/09/2021 08:55:23
Hola Amigos necesito su ayuda para solucionar el error 94, uno no valido de Null, Les comparto mi código, estoy trabajando en Excel con VBA, pero cuando lo ejecuto me aparece el error 94.

Agradeceré me puedan ayudar, la verdad soy nueva trabajando con esta aplicación.

Dim vExistencia As Integer

Private Sub LimpiarCajas()

ComboCliente.Text = ""
TxtTelefono.Text = ""
TxtDireccion.Text = ""
TxtEmail.Text = ""
ComboProducto.Text = ""
TxtCantidad.Text = ""
TxtPrecio.Text = ""
TxtImpuesto.Text = ""
TxtTotal = ""
TxtSubTotal.Text = ""
TxtSubTotal1.Text = ""
TxtImpuesto1.Text = ""
TxtTotalPagar.Text = ""
LblFactura.Caption = ""
ListaFactura.Clear
TxtFecha.Text = ""

End Sub

Private Sub BloquearCajas(ByVal CF As Boolean)

ComboCliente.Locked = CF
TxtTelefono.Locked = CF
TxtDireccion.Locked = CF
TxtEmail.Locked = CF
ComboProducto.Locked = CF
TxtCantidad.Locked = CF
TxtPrecio.Locked = CF
TxtImpuesto.Locked = CF
TxtTotal.Locked = CF
TxtSubTotal.Locked = CF
TxtImpuesto1.Locked = CF
TxtTotalPagar.Locked = CF

End Sub

Private Sub BloquearBotones(ByVal PB As Boolean, ByVal SB As Boolean)

cmdNuevo.Enabled = PB
cmdSalir.Enabled = PB

cmdGuardar.Enabled = SB
cmdCancelar.Enabled = SB

End Sub

Private Sub CargarProducto()

Dim Conn As New ADODB.Connection
Dim RProductos As New ADODB.Recordset
Dim DBPATH As String, sconnect As String
Dim vSQL As String


DBPATH = ThisWorkbook.FullName

sconnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
DBPATH & ";Extended Properties=Excel 12.0;"

Conn.Open sconnect

vSQL = "Select CodigoPro,Descripcion, " & _
"PrecioVenta, Existencias from [Productos$]"
RProductos.Open vSQL, Conn

ComboProducto.BoundColumn = 1
ComboProducto.ColumnCount = 4
ComboProducto.TextColumn = 2
ComboProducto.ColumnWidths = "0;150pt;;0"

Dim i As Integer
i = 0

While Not RProductos.EOF

ComboProducto.AddItem
ComboProducto.List(i, 0) = RProductos![CodigoPro]
ComboProducto.List(i, 1) = RProductos![Descripcion]
ComboProducto.List(i, 2) = Format(Val(RProductos![PrecioVenta]), "#,###.00")
'ComboProducto.List(i, 3) = IIf(IsNull(RProductos![Existencias]), 0, RProductos![Existencias])

i = i + 1

RProductos.MoveNext
Wend

End Sub

Private Sub CargarCliente()

Dim Conn As New ADODB.Connection
Dim RCliente As New ADODB.Recordset
Dim DBPATH As String, sconnect As String
Dim vSQL As String

DBPATH = ThisWorkbook.FullName

sconnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
DBPATH & ";Extended Properties=Excel 12.0;"

Conn.Open sconnect

vSQL = "Select id_Cliente,Nombre,Direccion,Telefono,Email from [Clientes$]"
RCliente.Open vSQL, Conn

ComboCliente.BoundColumn = 1
ComboCliente.ColumnCount = 5
ComboCliente.TextColumn = 2
ComboCliente.ColumnWidths = "0;150pt;0;0;0"

Dim i As Integer
i = 0

While Not RCliente.EOF

ComboCliente.AddItem
ComboCliente.List(i, 0) = RCliente![id_Cliente]
ComboCliente.List(i, 1) = RCliente![Nombre]
ComboCliente.List(i, 2) = RCliente![Direccion]
ComboCliente.List(i, 3) = RCliente![Telefono]
ComboCliente.List(i, 4) = RCliente![Email]

i = i + 1

RCliente.MoveNext
Wend

End Sub

Private Sub ObtenerNumFactura()

Dim Conn As New ADODB.Connection
Dim DBPATH As String, vConectar As String
Dim ListaRegistrosF As New ADODB.Recordset

DBPATH = ThisWorkbook.FullName

vConectar = "Provider=Microsoft.ACE.OLEDB.12.0;DataSource0" & _
DBPATH & ";Extended Properties=Excel 12.0;"
Conn.Open vConectar 'Abrir la conexion

Dim ConsultaSQL As String

ConsultaSQL = "SELECT Max(Factura)As MaxCod_Factura FROM [Salidas$]"

ListaRegistrosF.Open ConsultaSQL, Conn, adOpenDynamic

If Not IsNull(ListaRegistrosF!MaxCod_Factura) Then
codmax = ListaRegistrosF!MaxCod_Factura
LblFactura.Caption = codmax + 1
Else
LblFactura.Caption = 1000
End If
Set ListaRegistrosF = Nothing
Conn.Close
Set Conn = Nothing

End Sub

Private Sub UserForm_Initialize()
Call CargarProducto
Call CargarCliente
Call LimpiarCajas
Call BloquearCajas(True)
Call BloquearBotones(True, False)

End Sub

Private Sub TxtCantidad_Change()
Dim impuesto As Double, stotal As Double, precio As Double
Dim tpagar As Double, Cantidad As Integer

Cantidad = Val(TxtCantidad.Text)
precio = Val(TxtPrecio.Text)

If Val(TxtCantidad.Text) > vExistencia Then

MsgBox "Valor maximo a vender: " & vExistencia, vbCritical, "Fuera de rango"

TxtCantidad.Text = Empty
TxtSubTotal.Text = Empty
TxtImpuesto.Text = Empty
TxtTotal.Text = Empty
Exit Sub
End If

stotal = Cantidad * precio
impuesto = stotal * 15 / 100
tpagar = stotal + impuesto

TxtSubTotal.Text = Format(stotal, "#,###.00")
TxtImpuesto.Text = Format(impuesto, "#,###.00")
TxtTotal.Text = Format(tpagar, "#,###.00")

End Sub

Private Sub ComboProducto_Click()
TxtPrecio.Text = ComboProducto.Column(2)
vExistencia = Val(ComboProducto.Column(3))

End Sub

Private Sub ComboCliente_Click()
TxtTelefono.Text = ComboCliente.Column(3)
TxtDireccion.Text = ComboCliente.Column(2)
TxtEmail.Text = ComboCliente.Column(4)

End Sub


Private Sub cmdAgregar_Click()
Dim vImpuesto As Double
Dim vSubTotal As Double
Dim vTotal As Double

vSubTotal = CDbl(Val(TxtSubTotal1.Text))
vImpuesto = CDbl(Val(TxtImpuesto1.Text))
vTotal = CDbl(Val(TxtTotalPagar.Text))

ListaFactura.AddItem
ListaFactura.List(ListaFactura.ListCount - 1, 0) = ComboProducto.Value
ListaFactura.List(ListaFactura.ListCount - 1, 1) = TxtCantidad.Text
ListaFactura.List(ListaFactura.ListCount - 1, 2) = ComboProducto.Text
ListaFactura.List(ListaFactura.ListCount - 1, 3) = TxtPrecio.Text
ListaFactura.List(ListaFactura.ListCount - 1, 4) = TxtSubTotal.Text
ListaFactura.List(ListaFactura.ListCount - 1, 5) = TxtImpuesto.Text
ListaFactura.List(ListaFactura.ListCount - 1, 6) = TxtTotal.Text
ListaFactura.List(ListaFactura.ListCount - 1, 7) = vExistencia

TxtSubTotal1.Text = vSubTotal + CDbl(TxtSubTotal.Text)
TxtImpuesto1.Text = vImpuesto + CDbl(TxtImpuesto.Text)
TxtTotalPagar.Text = vTotal + CDbl(TxtTotal.Text)

ComboProducto.Text = Empty
TxtCantidad.Text = Empty
TxtPrecio.Text = Empty
TxtSubTotal.Text = Empty
TxtImpuesto.Text = Empty
TxtTotal.Text = Empty

End Sub

Private Sub cmdNuevo_Click()
Call LimpiarCajas
Call BloquearCajas(False)
Call BloquearBotones(False, True)
Call ObtenerNumFactura

Worksheets("Factura").Range("A8:A12").ClearContents
Worksheets("Factura").Range("A14:G28").ClearContents
Worksheets("Factura").Range("F8:G8").ClearContents
Worksheets("Factura").Range("F5:G5").ClearContents
Worksheets("Factura").Range("H5").ClearContents
Worksheets("Factura").Range("H30") = 0

TxtFecha.Text = Format(Now(), "dd/mm/yyyy")


End Sub

Private Sub cmdGuardar_Click()
Dim Conn As New ADODB.Connection
Dim DBPATH As String, vConectar As String

DBPATH = ThisWorbook.FullName

vConectar = " Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
DBPATH & ";Extended Properties=Excel 12.0;"
Conn.Open vConectar

Dim TotalFilas As Integer
Dim FilaHoja As Integer

TotalFilas = ListaFactura.ListCount

FilaHoja = 14

Worksheets("Factura").Range("A8").Value = "Nombre: " & ComboCliente.Text
Worksheets("Factura").Range("A9").Value = "Direccion: " & TxtDireccion.Text
Worksheets("Factura").Range("A10").Value = "Telefono: " & TxtTelefono.Text
Worksheets("Factura").Range("A11").Value = "Email: " & TxtEmail.Text
Worksheets("Factura").Range("F8").Value = ComboCliente.Value
Worksheets("Factura").Range("F5").Value = LblFactura.Caption
Worksheets("Factura").Range("H30").Value = TxtImpuesto1.Text

For i = 0 To TotalFilas - 1

Dim NExistencia As Integer
Dim Cantidad As Integer
Cantidad = ListaFactura.List(i, 1)
NExistencia = vExistencia - Cantidad

Dim CControlMovimientos As New ADODB.Command
Dim SQLControlMovimientos As String
Dim vOrigen As String
vOrigen = "Fac-" & LblFactura.Caption

SQLControlMovimientos = "Insert INTO[ControlMovimientos$](CodProducto, " _
& "Existencias,Salidas,Stock,Fecha, Origen)" _
& "Values (" & ListaFactura.List(i, 0) & "," _
& "" & vExistencia & "," _
& "'" & Cantidad & "'," _
& "" & NExistencia & "," _
& "'" & TxtFecha.Value & "'," _
& "'" & vOrigen & "')"

CControlMovimientos.ActiveConnection = Conn
CControlMovimientos.CommandText = SQLControlMovimientos
CControlMovimientos.Execute

Set CControlMovimientos = Nothing

Dim CActualizarExistencia As New ADODB.Command
Dim SQLActualizarExistencia As String

SQLActualizarExistencia = "UPDATE [Productos$] SET " _
& "Existencia = " & NExistencia & "" _
& " Where CodigoPro =" & ListaFactura.List(i, 0) & ""

CActualizarExistencia.ActiveConnection = Conn
CActualizarExistencia.CommandText = SQLActualizarExistencia
CActualizarExistencia.Execute

Set CActualizarExistencia = Nothing

Dim CSalidas As New ADODB.Command
Dim SQLSalidas As String
Dim a As Integer

SQLSalidas = "Insert INTO [Salidas$](Factura, Fecha," _
& "CodProducto,Cantidad,Precio,Impuesto,SubTotal,Total,IdCliente)" _
& " Values ('" & LblFactura.Caption & "'," _
& "'" & TxtFecha.Value & "'," _
& "" & ListFactura.List(i, 0) & "," _
& "" & Cantidad & "," _
& "" & ListFactura.List(i, 3) & "," _
& "" & CDbl(ListaFactura.List(i, 5)) & "," _
& "" & CDbl(ListaFactura.List(i, 4)) & "," _
& "" & CDbl(ListaFactura.List(i, 6)) & "," _
& "" & ComboCliente.Value & ")"

CSalidas.ActiveConnection = Conn
CSalidas.CommandText = SQLSalidas
CSalidas.Execute
Set CSalidas = Nothing

If FilaHoja <= 28 Then

Worksheets("Factura").Range("A" & FilaHoja).Value = ListaFactura.List(i, 2)
Worksheets("Factura").Range("F" & FilaHoja).Value = ListaFactura.List(i, 1)
Worksheets("Factura").Range("G" & FilaHoja).Value = ListaFactura.List(i, 3)
FilaHoja = FilaHoja + 1

End If

Next

Conn.Close
Set Conn = Nothing

Call BloquearCajas(True)

Call LimpiarCajas

Call BloquearBotones(True, False)

Worksheets("Factura").PrintOut Copies:=1, Preview:=True, Collate:=True


End Sub

Private Sub cmdCancelar_Click()
Call BloquearCajas(True)
Call LimpiarCajas
Call BloquearBotones(True, False)

End Sub





Private Sub cmdSalir_Click()

Unload Me

End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 355
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Error 94 en tiempo de ejecución, uso no valido de Null

Publicado por raul (160 intervenciones) el 08/09/2021 15:51:41
Hola Gravy, veras asi solo con el codigo es muy dificil predecir donde se produce el error, te sugiero subas el ejemplo con la database.
Si por problemas de seguridad no puede ser te dejo mi correo para que lo envies en privado.

Ahora, aqui te van una serie de sugerencias sobre el codigo:

1- Declaración de RECORDSET sin parametros auxiliares

vSQL = "Select id_Cliente,Nombre,Direccion,Telefono,Email from [Clientes$]"
RCliente.Open vSQL, Conn

R/ Aunque por defecto VBA y VB6 asumen tu conexion sin ningun problema, al solicitar algunas propiedades como el BOOKMARK no estaran disponibles o te mostrarán un valor incoherente. La primera recomendación es que declares estos:

RCliente.Open vSQL, Conn, adOpenDynamic, adLockOptimistic

2- Inicias la carga de los datos sin verificar si estos existen, lo logico seria

if RCliente.recordcount > 0 then
RCLIENTE.movefirst 'Mover al primer registro
... 'copiar datos
end if

3- Mal uso de las propiedades TEXT y VALUE aunque en apariencia son practicamente lo mismo; no lo son; por defecto las celdas tienen TEXT = "" y VALUE = VARIANT ( o sea ""; 0; "01/01/1900" ... etc); o sea que para alimentar una celda excel debes emplear

.VALUE = RCLIENTE!CAMPO_ELECCION

Ahora para procesar/leer su contenido puedes emplear indistintamente VALUE y TEXT

Otra cosa es el uso de EMPTY [traducción sin inicializar], que en algunos casos esta asignacion es el equivalente a .TEXT = NULL
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error 94 en tiempo de ejecución, uso no valido de Null

Publicado por Gravy (2 intervenciones) el 09/09/2021 16:36:51
Muchas gracias ya te comparto el archivo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar