Cómo reemplazar el valor de un textbox que es resultado de una operación en una celda de Excel

Tengo una duda sobre un código, lo que quiero es que el resultado de una operación que lo tengo en un textbox reemplace al de la celda donde está el dato con el que uso para la operación.

P. Ej. Tengo la cantidad existente en una columna en excel y ya que selecciono con el formulario el producto me aparece la cantidad, en otro textbox tengo el valor que quiero restar de esa cantidad existente y en otro textbox tengo el reusltado de la resta que es mi cantidad final. Quiero que el resultado de la cantidad final sustituya al de la cantidad existente.

Me sale que tengo un erro9: subíndice fuera de intervalo en la fila

ActiveSheet = Sheets("Inventario(almacén)")

Lo que quiero es que al darle click en el botón me agregue en una pestaña unos datos y que en otra pestaña me reemplace una información, no se si sea el código correcto para hacer ediciones en dos diferentes pestañas.

Les dejo el código:

Private Sub CommandButton1_Click()
If CbDNA.Text = "" Then
MsgBox ("No se han registrado datos")
ListaBox1.Clear
Txtcantidad.Text = ""
Txtfinal.Text = ""
CbDNA.SetFocus
Else
a = ListaBox1.ListIndex
With Sheets("Salida (almacén)")
.Rows("8:8").Insert Shift:=xlUp
.Rows("8:8").Interior.Pattern = xINone
.Range("B8").Value = Txtcantidad.Text
.Range("D8").Value = ListaBox1.List(a, 0)
.Range("C8").Value = ListaBox1.List(a, 2)
.Range("E8").Value = ListaBox1.List(a, 3)
.Range("F8").Value = CbDNA.Text
ActiveWorkbook.Save
Sheets("Inventario (almacén)").Select
End With
ListaBox1.Clear
CbDNA.Text = ""
Txtcantidad.Text = ""
CbDNA.SetFocus
End If
Dim celda As Range
Dim dato As Variant
Dim r As String
Dim uf As String
Dim d1, d2 As String
Application.ScreenUpdating = False
conta = 0
' On Error Resume Next
Set currcell = ActiveCell
ActiveSheet = Sheets("Inventario(almacén)")
ActiveCell = Range("L8").Select
uf = Range("L" & Rows.Count).End(x1Up).Row
r = "E8:E" & uf
currcell.Select
'For Each celda In Range(r)
currcell = celda
currcell.Offset(0, -1).Select
If Txtfinal.Value <= 0 Then
MsgBox "Material Insuficiente"
Else
With Sheets("Inventario(almacén)").celda
d1 = ListaBox1.List(a, 5)
d2 = Sheets("Inventario(almacén)").celda
If d1 = d2 Then
'currcell = celda
'currcell.Offset(0, -1).Select
Sheets("Inventario(almacén)").celda = CDbl(Txtfinal.Text)
Else
End If
End With
Txtfinal.Text = ""
End If
'End With
ActiveWorkbook.Save
Sheets("Inventario (almacén)").Select

End Sub

Graciaaaaaas!

1 Respuesta

Respuesta
1

El error es porque tienes esto:

ActiveSheet = Sheets("Inventario(almacén)")

Me parece que el nombre correcto es con un espacio después de inventario:

"Inventario (almacén)"


Si corriges el nombre, ahora te marcaría el error:

"Se ha producido el error '438' en tiempo de ejecución: El objeto no admite esta propiedad o método"


La pregunta es, qué quieres hacer con esta línea:

ActiveSheet = Sheets("Inventario(almacén)")

Si quieres seleccionar la hoja "Inventario (almacén)", tienes que hacerlo así:

Sheets("Inventario (almacén)").Select

Si quieres otra acción, entonces explícame qué necesitas.


Después tienes todo esto:

    Dim celda As Range
    Dim dato As Variant
    Dim r As String
    Dim uf As String
    Dim d1, d2 As String
    Application.ScreenUpdating = False
    conta = 0
    ' On Error Resume Next
    Set currcell = ActiveCell
    ActiveSheet = Sheets("Inventario(almacén)")
    ActiveCell = Range("L8").Select
    uf = Range("L" & Rows.Count).End(x1Up).Row
    r = "E8:E" & uf
    currcell.Select
    'For Each celda In Range(r)
    currcell = celda
    currcell.Offset(0, -1).Select
    If txtfinal.Value <= 0 Then
    MsgBox "Material Insuficiente"
    Else
    With Sheets("Inventario(almacén)").celda
    d1 = ListaBox1.List(a, 5)
    d2 = Sheets("Inventario(almacén)").celda
    If d1 = d2 Then
    'currcell = celda
    'currcell.Offset(0, -1).Select
    Sheets("Inventario(almacén)").celda = CDbl(txtfinal.Text)
    Else
    End If
    End With

Si quieres poner un dato en la celda L8, simplemente en una línea queda así:

Sheets("Inventario (almacén)").Range("L8").Value = txtfinal.Value

Creo que quedaría así:

Sub calab()
    If CbDNA.Text = "" Then
        MsgBox ("No se han registrado datos")
        ListaBox1.Clear
        Txtcantidad.Text = ""
        txtfinal.Text = ""
        CbDNA.SetFocus
    Else
        a = ListaBox1.ListIndex
        With Sheets("Salida (almacén)")
            .Rows("8:8").Insert Shift:=xlUp
            .Rows("8:8").Interior.Pattern = xINone
            .Range("B8").Value = Txtcantidad.Text
            .Range("D8").Value = ListaBox1.List(a, 0)
            .Range("C8").Value = ListaBox1.List(a, 2)
            .Range("E8").Value = ListaBox1.List(a, 3)
            .Range("F8").Value = CbDNA.Text
        End With
    End If
    Sheets("Inventario(almacén)").Range("L8").Value = txtfinal.Value
    '
    ActiveWorkbook.Save
    ListaBox1.Clear
    CbDNA.Text = ""
    Txtcantidad.Text = ""
    CbDNA.SetFocus
    txtfinal.Text = ""
End Sub

Tal vez falten afinar algunos detalles, pero si lo explicas con imágenes, tal vez me quede más claro.


[sal u dos

Gracias! Mira tengo esta hoja de cálculo (Inventario (almacén)) y tengo un formulario (Salida), cuando agrego un código en el formulario (código DNA) y selecciono el producto y lleno el recuadro de cantidad de salida, se calcula automáticamente el de cantidad final. Hay unos datos (producto, marca ,tamaño) qur yo seleccioné que vana a llenar un formulario que tengo en otra hoja de excel. Y lo que yo quiero es que al presionar el botón de agregar, la cantidad final que tengo me sustituya a la que me aparece en la hoja de cálculo de inventario de almacén. Pero no le puedo poner en la celda L8 como me mencionas porque tiene que ser el producto que seleccioné. 

Entonces quería que se seleccionara la fila que tuviera el lote igual (en laa tabla y el que selecciono en el formulario) y ya que me reemplazara la celda de cantidad final(columna k).

Necesitas almacenar el número de fila en el listbox.

Puedes poner el código completo, supongo que cuando seleccionas un "código DNA" filtras en el listbox. Pero tengo que ver cómo llenas el listbox.

Private Sub CbDNA_Change()
Application.ScreenUpdating = False
Dim Fila, a As Integer
Dim dato, var As String
ListaBox1.Clear
ListaBox1.ColumnCount = 7
'a = 0
Fila = 8
While Sheets("Inventario (almacén)").Cells(Fila, 4) <> Empty
dato = CbDNA
var = Sheets("Inventario (almacén)").Cells(Fila, 4)
If var = dato Then
a = ListaBox1.ListCount
ListaBox1.AddItem
'Producto
ListaBox1.List(a, 0) = Sheets("Inventario (almacén)").Cells(Fila, 2)
'Marca
ListaBox1.List(a, 1) = Sheets("Inventario (almacén)").Cells(Fila, 3)
'Tamaño
ListaBox1.List(a, 2) = Sheets("Inventario (almacén)").Cells(Fila, 5)
'Descripción
ListaBox1.List(a, 3) = Sheets("Inventario (almacén)").Cells(Fila, 6)
'Costo
ListaBox1.List(a, 4) = Sheets("Inventario (almacén)").Cells(Fila, 8)
'Lote
ListaBox1.List(a, 5) = Sheets("Inventario (almacén)").Cells(Fila, 12)
'Existencia
ListaBox1.List(a, 6) = Sheets("Inventario (almacén)").Cells(Fila, 11)
Else
ListaBox1 = Clear
End If
Fila = Fila + 1
Wend
Application.ScreenUpdating = True
End Sub

Private Sub CommandButton1_Click()
If CbDNA.Text = "" Then
MsgBox ("No se han registrado datos")
ListaBox1.Clear
Txtcantidad.Text = ""
Txtfinal.Text = ""
CbDNA.SetFocus
Else
a = ListaBox1.ListIndex
With Sheets("Salida (almacén)")
.Rows("8:8").Insert Shift:=xlUp
.Rows("8:8").Interior.Pattern = xINone
.Range("B8").Value = Txtcantidad.Text
.Range("D8").Value = ListaBox1.List(a, 0)
.Range("C8").Value = ListaBox1.List(a, 2)
.Range("E8").Value = ListaBox1.List(a, 3)
.Range("F8").Value = CbDNA.Text
ActiveWorkbook.Save
Sheets("Inventario (almacén)").Select
End With
Dim celda As Range
Dim dato As Variant
Dim r As String
Dim uf As String
Dim d1, d2 As String
Application.ScreenUpdating = False
conta = 0
' On Error Resume Next
Set currcell = ActiveCell
Sheets("Inventario (almacén)").Select
ActiveCell = Range("L8").Select
uf = Range("L" & Rows.Count).End(x1Up).Row
r = "E8:E" & uf
currcell.Select
'For Each celda In Range(r)
currcell = celda
currcell.Offset(0, -1).Select
If Txtfinal.Value <= 0 Then
MsgBox "Material Insuficiente"
Else
With Sheets("Inventario (almacén)").celda
d1 = ListaBox1.List(a, 5)
d2 = Sheets("Inventario (almacén)").celda
If d1 = d2 Then
'currcell = celda
'currcell.Offset(0, -1).Select
Sheets("Inventario (almacén)").celda = CDbl(Txtfinal.Text)
Else
End If
End With
Txtfinal.Text = ""
End If
'End With
ActiveWorkbook.Save
Sheets("Inventario (almacén)").Select
ListaBox1.Clear
CbDNA.Text = ""
Txtcantidad.Text = ""
CbDNA.SetFocus
End If


End Sub

Private Sub CommandButton2_Click()
Sheets("Inventario (almacén)").Select
End
End Sub

Private Sub CommandButton3_Click()
ListaBox1.Clear
CbDNA.Text = ""
Txtcantidad.Text = ""
Txtfinal.Text = ""
CbDNA.SetFocus
End Sub

Private Sub Txtcantidad_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim num1, num2, resultado As Integer
num1 = ListaBox1.List(a, 6)
num2 = Txtcantidad.Value
resultado = num1 - num2
Txtfinal = resultado

End Sub


Private Sub UserForm_Initialize()
'DNA (no se repitan)
Dim sd As New Collection
Dim celda As Range
Dim dato As Variant
Dim r As String
Dim uf As String
Application.ScreenUpdating = False
On Error Resume Next
conta = 0
CbDNA.Clear
Sheets("Inventario (almacén)").Select
Range("D8").Select
uf = Range("D" & Rows.Count).End(xlUp).Row
r = "D8:D" & uf
For Each celda In Range(r)
sd.Add celda.Value, CStr(celda.Value)
Next celda
For Each dato In sd
CbDNA.AddItem dato
conta = conta + 1
Next dato
Application.ScreenUpdating = True

End Sub

Te regreso todo el código actualizado:

Private Sub CbDNA_Change()
'CARGAR LISTBOX
    Application.ScreenUpdating = False
    Dim Fila, a As Integer
    ListaBox1.Clear
    ListaBox1.ColumnCount = 7
    Fila = 8
    Set h = Sheets("Inventario (almacén)")
    While h.Cells(Fila, 4) <> Empty
        If h.Cells(Fila, 4).Value = CbDNA.Value Then
            a = ListaBox1.ListCount
            ListaBox1. AddItem
            ListaBox1.List(a, 0) = h. Cells(Fila, 2) 'Producto
            ListaBox1.List(a, 1) = h. Cells(Fila, 3) 'Marca
            ListaBox1.List(a, 2) = h. Cells(Fila, 5) 'Tamaño
            ListaBox1.List(a, 3) = h. Cells(Fila, 6) 'Descripción
            ListaBox1.List(a, 4) = h. Cells(Fila, 8) 'Costo
            ListaBox1.List(a, 5) = h. Cells(Fila, 12) 'Lote
            ListaBox1.List(a, 6) = h. Cells(Fila, 11) 'Existencia
            ListaBox1.List(a, 7) = Fila                 'guardamos número de fila
        End If
        Fila = Fila + 1
    Wend
    Application.ScreenUpdating = True
End Sub
'
Private Sub CommandButton1_Click()
'ACTUALIZAR INVENTARIO
    If CbDNA.Value = "" Then
        MsgBox "No se han registrado datos"
        Exit Sub
    End If
    If Txtcantidad.Value = "" Then
        MsgBox "Falta introducir la cantidad"
        Exit Sub
    End If
    '
    a = ListaBox1.ListIndex
    If a = -1 Then
        MsgBox "Debes seleccionar un dato del listbox"
        Exit Sub
    End If
    '
    'ACTUALIZA HOJA SALIDA
    With Sheets("Salida (almacén)")
        .Rows("8:8").Insert Shift:=xlUp
        .Rows("8:8").Interior.Pattern = xINone
        .Range("B8").Value = Txtcantidad.Text
        .Range("D8").Value = ListaBox1.List(a, 0)
        .Range("C8").Value = ListaBox1.List(a, 2)
        .Range("E8").Value = ListaBox1.List(a, 3)
        .Range("F8").Value = CbDNA.Text
    End With
    '
    'ACTUALIZA HOIJA INVENTARIO
    Fila = ListaBox1.List(a, 7) 'obtenemos el número de fila
    Set h = Sheets("Inventario (almacén)")
    h.Cells(Fila, "K").Value = Val(Txtfinal.Value)
    '
    ActiveWorkbook.Save
    MsgBox "Se actualizó el inventario"
End Sub
'
Private Sub CommandButton2_Click()
    Sheets("Inventario (almacén)").Select
    End
End Sub
'
Private Sub CommandButton3_Click()
    ListaBox1.Clear
    CbDNA.Text = ""
    Txtcantidad.Text = ""
    Txtfinal.Text = ""
    CbDNA.SetFocus
End Sub
'
Private Sub Txtcantidad_Change()
'CALCULAR TXTFINAL
    a = ListaBox1.ListIndex
    Txtfinal = Val(ListaBox1.List(a, 6)) - Val(Txtcantidad.Value)
End Sub
'
Private Sub UserForm_Initialize()
    'DNA (no se repitan)
    Dim sd As New Collection
    Dim celda As Range
    Dim dato As Variant
    Dim r As String
    Dim uf As String
    Application.ScreenUpdating = False
    On Error Resume Next
    conta = 0
    CbDNA.Clear
    Sheets("Inventario (almacén)").Select
    Range("D8").Select
    uf = Range("D" & Rows.Count).End(xlUp).Row
    r = "D8:D" & uf
    For Each celda In Range(r)
    sd.Add celda.Value, CStr(celda.Value)
    Next celda
    For Each dato In sd
    CbDNA.AddItem dato
    conta = conta + 1
    Next dato
    Application.ScreenUpdating = True
End Sub

'.[Sal u dos. Dante Amor. No olvides valorar la respuesta. 
'.[Avísame cualquier duda

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas