Como guardar datos de varios combos ...
Hola mi pregunta es la siguiente tengo un formulario en excel en donde tengo varios combos que su propiedad es siempre combobox.visible =false y que tiene una condicion que los vuelve true y conjuntamente aparece un textbox.
Ok cada combo tiene su nombre (ej. Quimico1) así también como el textbox (producto1) entonces tengo un commandbutton que es para guardar los datos, tengo una hoja llamada fórmulas donde en el rango de celdas b1 hasta bh1 están los nombres de los químicos que aparecen en los combos.
Ok en la celda a1 debe aparecer nombre de la fórmula y en las demás celdas de adelante (b2, c2, ..., etc) debe aparecerme la porción química que dígito en (producto1, producto2, etc) ej. 023b-1226-118 - 2.0 - 0.048 - 0.510 - 0.074 - 4.83 - 17 - etc. Entonces hay 7 productos básicos pero de esos mismo productos hay nombres casi iguales (ej. Amina 3020, amina 2050, amina 4218, etc) y se mezclan entonces debo poner la proporción que se mezcla de cada uno de los producto por asunto de inventario y así sacar el consumo por día, entonces si por ejemplo una fórmula tiene 9 productos de 15 que son que los demás se pongan en 0 para que me rellenen la linea, así cuando yo agregue otro que no tenia valor que no se coloque en la celda de arriba.
No se si con buscarv se pueda pero yo intente con esto.:
if quimico1.visible = true and quimico1.value <> "" then
'aqui debes especificar el nombre de la hoja y ampliar el rango de la base de datos donde va a buscar el dato del combo.
sheets("formulas").range("b1:bh1").select
selection.find(what:=quimico1, after:=activecell, lookin:=xlformulas, lookat _
:=xlwhole, searchorder:=xlbyrows, searchdirection:=xlnext, matchcase:= _
false, searchformat:=false).activate
on error goto mensaje
'limpiar_click
exit sub
mensaje:
end if
'bajamos hasta encontrar la fila vacía
do while not isempty(activecell)
'bajamos una fila
activecell.offset(1, 0).select
loop
'grabamos los datos en la primera fila vacía
'colocamos el producto
activecell.offset(0, 1) = productos1.text
end sub
creo que esa es la idea pero no se bien como plantearla a ver si me ayudas. Mi e-mail es [email protected]
Ok cada combo tiene su nombre (ej. Quimico1) así también como el textbox (producto1) entonces tengo un commandbutton que es para guardar los datos, tengo una hoja llamada fórmulas donde en el rango de celdas b1 hasta bh1 están los nombres de los químicos que aparecen en los combos.
Ok en la celda a1 debe aparecer nombre de la fórmula y en las demás celdas de adelante (b2, c2, ..., etc) debe aparecerme la porción química que dígito en (producto1, producto2, etc) ej. 023b-1226-118 - 2.0 - 0.048 - 0.510 - 0.074 - 4.83 - 17 - etc. Entonces hay 7 productos básicos pero de esos mismo productos hay nombres casi iguales (ej. Amina 3020, amina 2050, amina 4218, etc) y se mezclan entonces debo poner la proporción que se mezcla de cada uno de los producto por asunto de inventario y así sacar el consumo por día, entonces si por ejemplo una fórmula tiene 9 productos de 15 que son que los demás se pongan en 0 para que me rellenen la linea, así cuando yo agregue otro que no tenia valor que no se coloque en la celda de arriba.
No se si con buscarv se pueda pero yo intente con esto.:
if quimico1.visible = true and quimico1.value <> "" then
'aqui debes especificar el nombre de la hoja y ampliar el rango de la base de datos donde va a buscar el dato del combo.
sheets("formulas").range("b1:bh1").select
selection.find(what:=quimico1, after:=activecell, lookin:=xlformulas, lookat _
:=xlwhole, searchorder:=xlbyrows, searchdirection:=xlnext, matchcase:= _
false, searchformat:=false).activate
on error goto mensaje
'limpiar_click
exit sub
mensaje:
end if
'bajamos hasta encontrar la fila vacía
do while not isempty(activecell)
'bajamos una fila
activecell.offset(1, 0).select
loop
'grabamos los datos en la primera fila vacía
'colocamos el producto
activecell.offset(0, 1) = productos1.text
end sub
creo que esa es la idea pero no se bien como plantearla a ver si me ayudas. Mi e-mail es [email protected]
1 respuesta
Respuesta de Isaac Reyes
1
1
Isaac Reyes, Es mejor enseñar a pescar que dar el pescado
¿Cómo se llama la hoja donde guardas los datos de productos?
¿Qué relación tiene dicha hoja con la hoja con la hoja fórmula?
<ok en la celda a1 debe aparecer nombre de la formula y en las demas celdas de adelante (b2, c2, ...,etc) debe aparecerme la porcion quimica que digito en (producto1, producto2 ,etc)>
¿Esto debe aparecer al momento de presionar el botón?
¿Es a1, b2, c2, ..., etc? o ¿a1, b1, c1, ..., etc?
- ¡Creo entender el resto del problema, pero necesito que me aclares estos puntos!
¿Qué relación tiene dicha hoja con la hoja con la hoja fórmula?
<ok en la celda a1 debe aparecer nombre de la formula y en las demas celdas de adelante (b2, c2, ...,etc) debe aparecerme la porcion quimica que digito en (producto1, producto2 ,etc)>
¿Esto debe aparecer al momento de presionar el botón?
¿Es a1, b2, c2, ..., etc? o ¿a1, b1, c1, ..., etc?
- ¡Creo entender el resto del problema, pero necesito que me aclares estos puntos!
Saludos
Encontré una forma de como hacerlo pero aun me quedan detalles
Private Sub Guardar_Click()
Dim Col
Range("A2").Select
Application.ScreenUpdating = False
Sheets("FORMULAS").Select
'Bajamos hasta encontrar la fila vacía
Do While Not IsEmpty(ActiveCell)
'Bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
'grabamos los datos en la primera fila vacía
'primero el nombre de la formula
ActiveCell.Offset(1, 0) = CodFormula.Text
'---------------------------------------------------------------------------------------
If Quimico1.Visible = True And Quimico1.Value <> "" And Producto1.Text > 0 Then
For Col = 1 To 60
If Cells(1, Col) = Quimico1.Value Then
Cells(1, Col).Select
Do While ActiveCell <> ""
ActiveCell.Offset(1, 0).Select
Loop
ActiveCell = Producto1.Text
Exit For
End If
Next
Else
ActiveCell = 0
End If
'----------------------------------------------------------------------------------------
If Quimico2.Visible = True And Quimico2.Value <> "" And Producto2.Text > 0 Then
For Col = 1 To 60
If Cells(1, Col) = Quimico2.Value Then
Cells(1, Col).Select
Do While ActiveCell <> ""
ActiveCell.Offset(1, 0).Select
Loop
ActiveCell = Producto2.Text
Exit For
End If
Next
Else
ActiveCell = 0
End If
Pero no hay una forma de no tener que hacer una pregunta por cada combo sino que se pueda hacer un arreglo ademas puse esto para que no se vean los combos y vayan apareciendo según se vayan insertando los datos pero si por algún motivo escojo el combo siguiente pero no lo lleno cuando le doy a guardar me da un error por supuestamente al yo seleccionarlo es diferente de "" (comillas) ... y al igual que en lo anterior tengo que declararlo uno por uno observa
Private Sub Quimico1_Enter()
'En caso de error, que continúe
On Error Resume Next
'limpiamos los datos del Combobox y seleccionamos la hoja con los datos
Quimico1.Clear
Hoja41.Select
Range("B2").Select
'Vamos a llenar dinámicamente el combobox
Do While Not IsEmpty(ActiveCell)
Quimico1.AddItem ActiveCell.Value
'bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Private Sub Quimico1_Change()
'Miramos en qué fila está el producto
Cells(Quimico1.ListIndex + 2, 1).Select
'cargamos los datos correspondientes al producto elegido
Productos = ActiveCell.Offset(0, 2)
'activamos el textbox
If Quimico1.Value <> "" Then
Producto1.Visible = True
Else
Producto1.Visible = False
End If
End Sub
Private Sub Quimico2_Enter()
'En caso de error, que continúe
On Error Resume Next
'limpiamos los datos del Combobox
Quimico2.Clear
Hoja41.Select
Range("B2").Select
'Vamos a llenar dinámicamente el combobox
Do While Not IsEmpty(ActiveCell)
'ponemos el nombre del producto
Quimico2.AddItem ActiveCell.Value
'bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Private Sub Quimico2_Change()
'Miramos en qué fila está el producto
Cells(Quimico2.ListIndex + 2, 1).Select
'cargamos los datos correspondientes al producto elegido
Productos = ActiveCell.Offset(0, 2)
'activamos el textbox
If Quimico2.Value <> "" Then
Producto2.Visible = True
Else
Producto2.Visible = False
End If
If Producto2.Text > 0 Then
Quimico3.Visible = True
Else
Quimico3.Visible = False
End If
End Sub
Si tienes algún método más fácil o si hay una forma de crear los combos y texbox en tiempo de ejecución seria más fácil aun (o eso creo).
Contestando a tus preguntas la HOJA se llama (FÓRMULAS) ai es donde se van a almacenar los datos constestando a tu segunda pregunta, contestando a tu tercera pregunta con esto que te pongo aquí al presionar el botón guardar se coloca cada respuesta respectivamente en su sitio lo único que aun no hace es ponerme los demás valores que no se utilizan en 0. Con respecto a tu cuarta pregunta en la celda (A1) esta dice NO. FÓRMULA y las demás celdas desde (B1:BH1) ai van a ir apareciendo los nombres de los productos según se vayan agregando nuevos, cuando tu le das click a guardar en lo que puse más arriba, ella busca el nombre que sea igual al combo donde
If Cells(1, Col) = Quimico2.Value Then
Cells(1, Col).Select
Do While ActiveCell <> ""
ActiveCell.Offset(1, 0).Select
Loop
ActiveCell = Producto2.Text
Lo que no hace es poner un 0 (cero) a los demás productos que están pero que no se utilizaron. Espero que me puedas ayudar en lo que falta y te quería preguntar si tenias algún macro de consulta en UserForm que pueda utilizar.
Gracias por todo
Encontré una forma de como hacerlo pero aun me quedan detalles
Private Sub Guardar_Click()
Dim Col
Range("A2").Select
Application.ScreenUpdating = False
Sheets("FORMULAS").Select
'Bajamos hasta encontrar la fila vacía
Do While Not IsEmpty(ActiveCell)
'Bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
'grabamos los datos en la primera fila vacía
'primero el nombre de la formula
ActiveCell.Offset(1, 0) = CodFormula.Text
'---------------------------------------------------------------------------------------
If Quimico1.Visible = True And Quimico1.Value <> "" And Producto1.Text > 0 Then
For Col = 1 To 60
If Cells(1, Col) = Quimico1.Value Then
Cells(1, Col).Select
Do While ActiveCell <> ""
ActiveCell.Offset(1, 0).Select
Loop
ActiveCell = Producto1.Text
Exit For
End If
Next
Else
ActiveCell = 0
End If
'----------------------------------------------------------------------------------------
If Quimico2.Visible = True And Quimico2.Value <> "" And Producto2.Text > 0 Then
For Col = 1 To 60
If Cells(1, Col) = Quimico2.Value Then
Cells(1, Col).Select
Do While ActiveCell <> ""
ActiveCell.Offset(1, 0).Select
Loop
ActiveCell = Producto2.Text
Exit For
End If
Next
Else
ActiveCell = 0
End If
Pero no hay una forma de no tener que hacer una pregunta por cada combo sino que se pueda hacer un arreglo ademas puse esto para que no se vean los combos y vayan apareciendo según se vayan insertando los datos pero si por algún motivo escojo el combo siguiente pero no lo lleno cuando le doy a guardar me da un error por supuestamente al yo seleccionarlo es diferente de "" (comillas) ... y al igual que en lo anterior tengo que declararlo uno por uno observa
Private Sub Quimico1_Enter()
'En caso de error, que continúe
On Error Resume Next
'limpiamos los datos del Combobox y seleccionamos la hoja con los datos
Quimico1.Clear
Hoja41.Select
Range("B2").Select
'Vamos a llenar dinámicamente el combobox
Do While Not IsEmpty(ActiveCell)
Quimico1.AddItem ActiveCell.Value
'bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Private Sub Quimico1_Change()
'Miramos en qué fila está el producto
Cells(Quimico1.ListIndex + 2, 1).Select
'cargamos los datos correspondientes al producto elegido
Productos = ActiveCell.Offset(0, 2)
'activamos el textbox
If Quimico1.Value <> "" Then
Producto1.Visible = True
Else
Producto1.Visible = False
End If
End Sub
Private Sub Quimico2_Enter()
'En caso de error, que continúe
On Error Resume Next
'limpiamos los datos del Combobox
Quimico2.Clear
Hoja41.Select
Range("B2").Select
'Vamos a llenar dinámicamente el combobox
Do While Not IsEmpty(ActiveCell)
'ponemos el nombre del producto
Quimico2.AddItem ActiveCell.Value
'bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Private Sub Quimico2_Change()
'Miramos en qué fila está el producto
Cells(Quimico2.ListIndex + 2, 1).Select
'cargamos los datos correspondientes al producto elegido
Productos = ActiveCell.Offset(0, 2)
'activamos el textbox
If Quimico2.Value <> "" Then
Producto2.Visible = True
Else
Producto2.Visible = False
End If
If Producto2.Text > 0 Then
Quimico3.Visible = True
Else
Quimico3.Visible = False
End If
End Sub
Si tienes algún método más fácil o si hay una forma de crear los combos y texbox en tiempo de ejecución seria más fácil aun (o eso creo).
Contestando a tus preguntas la HOJA se llama (FÓRMULAS) ai es donde se van a almacenar los datos constestando a tu segunda pregunta, contestando a tu tercera pregunta con esto que te pongo aquí al presionar el botón guardar se coloca cada respuesta respectivamente en su sitio lo único que aun no hace es ponerme los demás valores que no se utilizan en 0. Con respecto a tu cuarta pregunta en la celda (A1) esta dice NO. FÓRMULA y las demás celdas desde (B1:BH1) ai van a ir apareciendo los nombres de los productos según se vayan agregando nuevos, cuando tu le das click a guardar en lo que puse más arriba, ella busca el nombre que sea igual al combo donde
If Cells(1, Col) = Quimico2.Value Then
Cells(1, Col).Select
Do While ActiveCell <> ""
ActiveCell.Offset(1, 0).Select
Loop
ActiveCell = Producto2.Text
Lo que no hace es poner un 0 (cero) a los demás productos que están pero que no se utilizaron. Espero que me puedas ayudar en lo que falta y te quería preguntar si tenias algún macro de consulta en UserForm que pueda utilizar.
Gracias por todo
El error tel puede venir por esta validación
If Quimico.Visible = True And Quimico#.Value <> "" And Producto.Text > 0 Then
Al momento de que no asignas un valor al combo Qímico# el cuadro Producto#.Text es igual a "" (vacío) y al intentar comparar vacío, que es una cadena, con 0 que es un número, te envía el error al no coincidir los tipos. Por tanto, podrías hacer la comparación
If Quimico.Visible = True And Quimico.Value <> "" then
primero , y si es a se cumple entonces haces
If Producto.Text > 0 Then
O bien, asegurarte de que Producto.Text tenga siempre un número
Solucinando detalles:
1. Entendiendo la distribución de los datos, creo que en la columna B de la Hoja41 (partioendo desde B2) tienes un listado de todos los elementos que van en los comboBox, si es así, en lugar de cargar los datos con un Do While, puedes utilizar la siguiente instrucción:
Quimico.RowSource="Hoja41!B2:B" & Hoja41.Range("B" & Hoja41.Rows.Count).End(xlUp).Row 'Utilizaremos sólo un combobox y un cuadreo de texto
Esto hace el combo se llene de forma automática con los datos existentes en la columna B desde B2 hasta la última fila ocupada.
No utilices estas líneas en el evento Enter del Combo, sino, en el evento Initialize del formulario, de tal forma que el combo se llene al cargar el formulario.
2. No sé a que te refieres con esta asignación Productos = ActiveCell. Offset(0, 2), pues no sé que hace o almacena la variable Productos así que las obvio.
3. Para utilizar sólo un comboBox y sólo un textBox, debes definir una variable global en el módulo (en la sección general) de la siguiente forma
Dim dblProducto() as Double 'Asumiendo que en producto hay un número y puede ser decimal.
En el evento Initialize del formulario, después del paso 1, debes redefinir esta variable de la siguiente forma:
ReDim dblProducto(Quimico. ListCount - 1)
Esto define los índices de la variable de 0 a ListCount-1, de tal forma que tiene la misma cantidad de espacios para almacenar datos como elementos tiene el combobox.
4. En el evento change, en lugar de utilizar esta validación
If Quimico1.Value <> "" Then
utiliza esta
If Quimico.ListIndex <> -1 Then
Además agrega lo siguiente para que sepas si ya pasaste por ese valor del combobox
If Quimico.ListIndex <> -1 Then
Producto.text = dblProducto(Quimico.ListIndex)
End If
5. Si no lo tienes, pon un botón que se llame agregar y en su evento Click agregas el siguiente código.
dblProducto(Quimico.ListIndex) = Producto.Text
De esta forma, en el indice correspondiente agregarás el valor referente al químico del indicado en el combobox.
6. Por lo que me dices, en la columna A de la hoja "FORMULAS" almacenas el nombre de la fórmula y en las columnas posteriores la proporción de químicos, por tanto la fila posterior a la última ocupada la encontramos así:
Sheets("FORMULAS").Select
dblFila = Range("A" & Rows.Count).End(xlUp).Row
Lo asignamos a la variable dblFila, ya que todos los datos que ingresemos los vamos a ingresar a dicha fila.
7. Finalmente, para guardar los datos, lo haremos de la siguiente forma:
'Una vez teniendo la fila en dblFila la formula la guardamos como sigue
Cells(dblFila, 1) = CodFormula.Text 'Ignoro de donde tomas CodFormula
'Los demas datos los almacenamos así, asumiendo que los índices del combobox tienen cierta relación con las columnas a las que van los datos.
For i=0 to (Quimico.ListCount-1)
Cells(dblFila, i+2) = dblProducto(i)
Next
-----------------------------------------------------
Intenté ser lo más detallado posible, ten presente que no tengo el panorama completo como tu lo tienes, así que si hay algún error, me lo comentas.
Recuerda, sólo un combobox y solo un textbox.
If Quimico.Visible = True And Quimico#.Value <> "" And Producto.Text > 0 Then
Al momento de que no asignas un valor al combo Qímico# el cuadro Producto#.Text es igual a "" (vacío) y al intentar comparar vacío, que es una cadena, con 0 que es un número, te envía el error al no coincidir los tipos. Por tanto, podrías hacer la comparación
If Quimico.Visible = True And Quimico.Value <> "" then
primero , y si es a se cumple entonces haces
If Producto.Text > 0 Then
O bien, asegurarte de que Producto.Text tenga siempre un número
Solucinando detalles:
1. Entendiendo la distribución de los datos, creo que en la columna B de la Hoja41 (partioendo desde B2) tienes un listado de todos los elementos que van en los comboBox, si es así, en lugar de cargar los datos con un Do While, puedes utilizar la siguiente instrucción:
Quimico.RowSource="Hoja41!B2:B" & Hoja41.Range("B" & Hoja41.Rows.Count).End(xlUp).Row 'Utilizaremos sólo un combobox y un cuadreo de texto
Esto hace el combo se llene de forma automática con los datos existentes en la columna B desde B2 hasta la última fila ocupada.
No utilices estas líneas en el evento Enter del Combo, sino, en el evento Initialize del formulario, de tal forma que el combo se llene al cargar el formulario.
2. No sé a que te refieres con esta asignación Productos = ActiveCell. Offset(0, 2), pues no sé que hace o almacena la variable Productos así que las obvio.
3. Para utilizar sólo un comboBox y sólo un textBox, debes definir una variable global en el módulo (en la sección general) de la siguiente forma
Dim dblProducto() as Double 'Asumiendo que en producto hay un número y puede ser decimal.
En el evento Initialize del formulario, después del paso 1, debes redefinir esta variable de la siguiente forma:
ReDim dblProducto(Quimico. ListCount - 1)
Esto define los índices de la variable de 0 a ListCount-1, de tal forma que tiene la misma cantidad de espacios para almacenar datos como elementos tiene el combobox.
4. En el evento change, en lugar de utilizar esta validación
If Quimico1.Value <> "" Then
utiliza esta
If Quimico.ListIndex <> -1 Then
Además agrega lo siguiente para que sepas si ya pasaste por ese valor del combobox
If Quimico.ListIndex <> -1 Then
Producto.text = dblProducto(Quimico.ListIndex)
End If
5. Si no lo tienes, pon un botón que se llame agregar y en su evento Click agregas el siguiente código.
dblProducto(Quimico.ListIndex) = Producto.Text
De esta forma, en el indice correspondiente agregarás el valor referente al químico del indicado en el combobox.
6. Por lo que me dices, en la columna A de la hoja "FORMULAS" almacenas el nombre de la fórmula y en las columnas posteriores la proporción de químicos, por tanto la fila posterior a la última ocupada la encontramos así:
Sheets("FORMULAS").Select
dblFila = Range("A" & Rows.Count).End(xlUp).Row
Lo asignamos a la variable dblFila, ya que todos los datos que ingresemos los vamos a ingresar a dicha fila.
7. Finalmente, para guardar los datos, lo haremos de la siguiente forma:
'Una vez teniendo la fila en dblFila la formula la guardamos como sigue
Cells(dblFila, 1) = CodFormula.Text 'Ignoro de donde tomas CodFormula
'Los demas datos los almacenamos así, asumiendo que los índices del combobox tienen cierta relación con las columnas a las que van los datos.
For i=0 to (Quimico.ListCount-1)
Cells(dblFila, i+2) = dblProducto(i)
Next
-----------------------------------------------------
Intenté ser lo más detallado posible, ten presente que no tengo el panorama completo como tu lo tienes, así que si hay algún error, me lo comentas.
Recuerda, sólo un combobox y solo un textbox.
Hola gracias por tu pronta respuesta.
Ok vamos por partes,
1.Aparentemente el RowSource tiene problemas no se específicamente los detalles, pero vamos a ver si nos entendemos con un combobox yo voy a llenar los diferentes Productos Químicos seleccionando el Químico y poniendo la proporción en el textbox(PRODUCTO) el valor para ese químico pero me imagino que tendré que darle entrada uno por uno (sino me equivoco).
Voy a subir el archivo en este dirección y verificas a ver que estoy haciendo mal.
http://www.megaupload.com/?d=G9ZQYCE4
Y Te agradezco tu ayuda incondicional pero sin haber terminado te punteare con la máxima puntuación.
Cualquier otro detalle mi correo es [email protected]
Ok vamos por partes,
1.Aparentemente el RowSource tiene problemas no se específicamente los detalles, pero vamos a ver si nos entendemos con un combobox yo voy a llenar los diferentes Productos Químicos seleccionando el Químico y poniendo la proporción en el textbox(PRODUCTO) el valor para ese químico pero me imagino que tendré que darle entrada uno por uno (sino me equivoco).
Voy a subir el archivo en este dirección y verificas a ver que estoy haciendo mal.
http://www.megaupload.com/?d=G9ZQYCE4
Y Te agradezco tu ayuda incondicional pero sin haber terminado te punteare con la máxima puntuación.
Cualquier otro detalle mi correo es [email protected]
¿Aplicaste algo de lo que te dije?
¿En qué parte del programa encuentro el tema que estamos solucionando?
¿En qué parte del programa encuentro el tema que estamos solucionando?
Hola. Disculpa que no te detalle todo lo relacionado con el programa es que ya eran las 5 y en mi trabajo cierran y solo me dio tiempo a mandarte esos detalles y omitir los otros.
OK. 1) En el archivo que te mande esta lo siguiente el Formulario llamado menu15 es donde estamos trabajando y allí están el CODFormula(textbox), varios combos pero solo el primer combo y el primer textobox que están a la izquierda son los que vamos a utilizar como me dijiste. (Si quieres puedes eliminar los demás combos y textbox que están allí)
2) De lo que me enviaste para aplicar lo aplique en ese mismo menu15 y lo que esta allí es lo siguiente:
En Generales:
Dim DblProducto() As Double 'Asumiendo que en producto hay un número y puede ser decimal.
De aquí en adelante en el textbox PRODUCTO puse que solo me acepte valores numéricos.
Private Sub Producto_Change()
If Not IsNumeric(Right(Producto, 1)) And Len(Producto) > 1 Then
Producto = Left(Producto, Len(Producto) - 1)
ElseIf Not IsNumeric(Right(Producto, 1)) And Len(Producto) = 1 Then
Producto = Clear
End If
End Sub
Aquí puse la otra parte que me diste y según estuve verificando en internet el error estaba en (Químico.ListCount - 1) decían que al poner el menos -1 y me daba también un Rowsource que entiendo yo que se define un nombre en las celdas donde va a estar la lista de lo que va a cargar el formulario
Private Sub UserForm_Initialize()
ReDim DblProducto(Quimico.ListCount - 1)
Quimico.RowSource = "Hoja42!B2:B" & Hoja42.Range("B" & Hoja42.Rows.Count).End(xlUp).Row
End Sub
Aquí puse lo que entendí que iba en el botón pero no se si estaba bien, estaba un poco presionado ayer y creo que no me pude concentrar mucho en lo que hacia, pero creo que debería ir así.
Private Sub Guardar_Click()
Dim DblFila
Dim i As Long
'modulo5
Sheets("FORMULAS").Select
DblFila = Range("A" & Rows.Count).End(xlUp).Row
DblProducto(Quimico.ListIndex) = Producto.Text
'Una vez teniendo la fila en dblFila la formula la guardamos como sigue
Cells(DblFila, 1) = CodFormula.Text 'Ignoro de donde tomas CodFormula
'Los demas datos los almacenamos así, asumiendo que los índices del combobox tienen cierta relación con las columnas a las que van los datos.
For i = 0 To (Quimico.ListCount - 1)
Cells(DblFila, i + 2) = DblProducto(i)
Next i
End Sub
Private Sub Quimico_Change()
If Quimico.ListIndex <> -1 Then
'Además agrega lo siguiente para que sepas si ya pasaste por ese valor del combobox
If Quimico.ListIndex <> -1 Then
Producto.Text = DblProducto(Quimico.ListIndex)
End If
End Sub
Private Sub Limpiar_Click()
Unload Menu15
Menu15.Show
Estas lineas las voy a cambiar por : Quimico = ""; Producto = "" y CodFormula = "" CodFormula.SetFocus
End Sub
Private Sub Regresar_Click()
Unload Menu15
End Sub
Aqui es para que todo lo que entre sea en mayuscula
Private Sub CodFormula_Change()
CodFormula.Text = UCase(CodFormula.Text)
If CodFormula <> "" Then
Quimico1.Visible = True
End If
End Sub
Bueno creo que hasta ahora aplique lo que me enviaste,(Con mis dudas claro :p), pero aun no comprendo como un solo combo y un solo textbox me va a ingresar todos los químicos que yo especifique a menos que grabe los campos de uno en uno. Por otro lado quería saber si tenias algún formulario de reporte y una consulta dinámica (como si fuera en datagrid o algo parecido) que si ves el formulario menu3 y menu4 te darás cuenta de más o menos que estoy buscando. Si me puedes ayudar en eso te lo voy agradecer.
Gracias de nuevo y disculpame por todos los incomvenientes que te causo, no soy muy experto haciendo macros pero creo que con la practica he mejorado un poquito pero aun me falta mucho.
:-P
OK. 1) En el archivo que te mande esta lo siguiente el Formulario llamado menu15 es donde estamos trabajando y allí están el CODFormula(textbox), varios combos pero solo el primer combo y el primer textobox que están a la izquierda son los que vamos a utilizar como me dijiste. (Si quieres puedes eliminar los demás combos y textbox que están allí)
2) De lo que me enviaste para aplicar lo aplique en ese mismo menu15 y lo que esta allí es lo siguiente:
En Generales:
Dim DblProducto() As Double 'Asumiendo que en producto hay un número y puede ser decimal.
De aquí en adelante en el textbox PRODUCTO puse que solo me acepte valores numéricos.
Private Sub Producto_Change()
If Not IsNumeric(Right(Producto, 1)) And Len(Producto) > 1 Then
Producto = Left(Producto, Len(Producto) - 1)
ElseIf Not IsNumeric(Right(Producto, 1)) And Len(Producto) = 1 Then
Producto = Clear
End If
End Sub
Aquí puse la otra parte que me diste y según estuve verificando en internet el error estaba en (Químico.ListCount - 1) decían que al poner el menos -1 y me daba también un Rowsource que entiendo yo que se define un nombre en las celdas donde va a estar la lista de lo que va a cargar el formulario
Private Sub UserForm_Initialize()
ReDim DblProducto(Quimico.ListCount - 1)
Quimico.RowSource = "Hoja42!B2:B" & Hoja42.Range("B" & Hoja42.Rows.Count).End(xlUp).Row
End Sub
Aquí puse lo que entendí que iba en el botón pero no se si estaba bien, estaba un poco presionado ayer y creo que no me pude concentrar mucho en lo que hacia, pero creo que debería ir así.
Private Sub Guardar_Click()
Dim DblFila
Dim i As Long
'modulo5
Sheets("FORMULAS").Select
DblFila = Range("A" & Rows.Count).End(xlUp).Row
DblProducto(Quimico.ListIndex) = Producto.Text
'Una vez teniendo la fila en dblFila la formula la guardamos como sigue
Cells(DblFila, 1) = CodFormula.Text 'Ignoro de donde tomas CodFormula
'Los demas datos los almacenamos así, asumiendo que los índices del combobox tienen cierta relación con las columnas a las que van los datos.
For i = 0 To (Quimico.ListCount - 1)
Cells(DblFila, i + 2) = DblProducto(i)
Next i
End Sub
Private Sub Quimico_Change()
If Quimico.ListIndex <> -1 Then
'Además agrega lo siguiente para que sepas si ya pasaste por ese valor del combobox
If Quimico.ListIndex <> -1 Then
Producto.Text = DblProducto(Quimico.ListIndex)
End If
End Sub
Private Sub Limpiar_Click()
Unload Menu15
Menu15.Show
Estas lineas las voy a cambiar por : Quimico = ""; Producto = "" y CodFormula = "" CodFormula.SetFocus
End Sub
Private Sub Regresar_Click()
Unload Menu15
End Sub
Aqui es para que todo lo que entre sea en mayuscula
Private Sub CodFormula_Change()
CodFormula.Text = UCase(CodFormula.Text)
If CodFormula <> "" Then
Quimico1.Visible = True
End If
End Sub
Bueno creo que hasta ahora aplique lo que me enviaste,(Con mis dudas claro :p), pero aun no comprendo como un solo combo y un solo textbox me va a ingresar todos los químicos que yo especifique a menos que grabe los campos de uno en uno. Por otro lado quería saber si tenias algún formulario de reporte y una consulta dinámica (como si fuera en datagrid o algo parecido) que si ves el formulario menu3 y menu4 te darás cuenta de más o menos que estoy buscando. Si me puedes ayudar en eso te lo voy agradecer.
Gracias de nuevo y disculpame por todos los incomvenientes que te causo, no soy muy experto haciendo macros pero creo que con la practica he mejorado un poquito pero aun me falta mucho.
:-P
OK.
Voy a hacer caso omiso a tus otras solicitudas ya que lo que me interesa, por el momento, es resolver el problema actual.
Hay cosas que las tomasta al pie de la letran, cuando lo que tenías que hacer era incorporarlo a tu código, así como hay cosas que no hiciste y otras, que debías hacer al pie de la letra, las alteraste. De todas formas es comprensible, faltaban antecedentes en el problema.
Te aconsejo que no copies y pegues solamente, sino que vayas comparando el código que te envío con el que tienes.
1. No es necesario tener ocultos el combo y el cuadro de texto, ya que, al guardar, podemos validar que el campo del nombre de la fórmula no sea vacío.
2. El evento Initialize de formulario debe quedar exactamente de esta forma
Private Sub UserForm_Initialize()
Quimico.RowSource = "PRODUCTOS!B2:B" & Hoja41.Range("B" & Hoja41.Rows.Count).End(xlUp).Row
ReDim DblProducto(Quimico.ListCount - 1)
End Sub
Al inicio pensé que la lista de productos estaba en Hoja42, pero ahora veo que está en Hoja41.
Si te das cuenta, Redim está después de la asignación a RowSource, cuestión muy importante, ya que si estuviese antes, no tomará la la cantidad de elementos del combo lleno, sino cuando esté vacío.
3. Si el combo Químico y el campo Producto no están visibles, el evento CodFormula_Change no es necesario.
4. Tu formulario no tiene el botón agregar que te indiqué. Bueno, ya no importa, pero suplindo ese botón, agrega este eveneto para el cuadro Producto
Private Sub Producto_AfterUpdate()
If Me.Quimico.ListIndex <> -1 And IsNumeric(Me.Producto.Text) Then
DblProducto(Me.Quimico.ListIndex) = Me.Producto.Text
End If
End Sub
Esto permitirá que el valor del campo de texto sea almacenado en nuestra variable global luego de que el textBox sea actualizado.
5. En el evento Change del combo Quimico agregas lo siguiente.
Private Sub Quimico_Change()
'Además agrega lo siguiente para que sepas si ya pasaste por ese valor del combobox
If Quimico.ListIndex <> -1 Then
Producto.Text = DblProducto(Quimico.ListIndex)
End If
End Sub
Esto carga a cada químico el valor asignado, si es que le ha sido asignado un valor con anticipación, de lo contrario carga un 0 en el textBox Producto.
6. Finalmente el evento click del botón guardar queda de la siguiente forma
Private Sub Guardar_Click()
Dim DblFila
Dim i As Long
'Validamos que la fórmula tenga un nombre
If (Trim(CodFormula.Text) <> "") Then
Sheets("FORMULAS").Select
DblFila = Range("A" & Rows.Count).End(xlUp).Row + 1
'Una vez teniendo la fila en dblFila la fórmula la guardamos como sigue
Cells(DblFila, 1) = CodFormula.Text 'Ignoro de donde tomas CodFormula
'Los demás datos los almacenamos así, asumiendo que los índices del combobox tienen cierta relación con las columnas a las que van los datos.
For i = 0 To (Quimico.ListCount - 1)
Cells(DblFila, i + 2) = DblProducto(i) 'Asignar el valor guardado
DblProducto(i) = 0 'Reiniciar la variable global
Next i
'Limpiar campos
CodFormula.Text = ""
Producto.Text = ""
Quimico.ListIndex = -1
Else
MsgBox "Debe ingresar un nombre a la fórmula"
End If
End Sub
-----------------------------
La respuesta a tu inquietud, de cómo es posible que con sólo un combobox y sólo un cuadro de texto se logre almacenar todos los datos, está en la variable DblProducto, esa es la variable que se encarga de almacenar cada calor relacionado a cada químico.
Para que lo compruebes, mientras ingresas los datos, observa que si seleccionas un químico al que ya le habías dado valor, te aparece el valor que le habías asignado, esto es porque el valor ha quedado almacenado en dblProducto.
Con las instrucciones
For i = 0 To (Quimico.ListCount - 1)
Cells(DblFila, i + 2) = DblProducto(i) 'Asignar el valor guardado
DblProducto(i) = 0 'Reiniciar la variable global
Next i
Vamos asignando a la hoja destino los valores almacenados en dicha variable y, por otra parte, vamos limpiando la variable.
------------------------------
Si sigues todas estas instrucciones al pie de la letra, te debería funcionar, pues a mí me corre bien.
Voy a hacer caso omiso a tus otras solicitudas ya que lo que me interesa, por el momento, es resolver el problema actual.
Hay cosas que las tomasta al pie de la letran, cuando lo que tenías que hacer era incorporarlo a tu código, así como hay cosas que no hiciste y otras, que debías hacer al pie de la letra, las alteraste. De todas formas es comprensible, faltaban antecedentes en el problema.
Te aconsejo que no copies y pegues solamente, sino que vayas comparando el código que te envío con el que tienes.
1. No es necesario tener ocultos el combo y el cuadro de texto, ya que, al guardar, podemos validar que el campo del nombre de la fórmula no sea vacío.
2. El evento Initialize de formulario debe quedar exactamente de esta forma
Private Sub UserForm_Initialize()
Quimico.RowSource = "PRODUCTOS!B2:B" & Hoja41.Range("B" & Hoja41.Rows.Count).End(xlUp).Row
ReDim DblProducto(Quimico.ListCount - 1)
End Sub
Al inicio pensé que la lista de productos estaba en Hoja42, pero ahora veo que está en Hoja41.
Si te das cuenta, Redim está después de la asignación a RowSource, cuestión muy importante, ya que si estuviese antes, no tomará la la cantidad de elementos del combo lleno, sino cuando esté vacío.
3. Si el combo Químico y el campo Producto no están visibles, el evento CodFormula_Change no es necesario.
4. Tu formulario no tiene el botón agregar que te indiqué. Bueno, ya no importa, pero suplindo ese botón, agrega este eveneto para el cuadro Producto
Private Sub Producto_AfterUpdate()
If Me.Quimico.ListIndex <> -1 And IsNumeric(Me.Producto.Text) Then
DblProducto(Me.Quimico.ListIndex) = Me.Producto.Text
End If
End Sub
Esto permitirá que el valor del campo de texto sea almacenado en nuestra variable global luego de que el textBox sea actualizado.
5. En el evento Change del combo Quimico agregas lo siguiente.
Private Sub Quimico_Change()
'Además agrega lo siguiente para que sepas si ya pasaste por ese valor del combobox
If Quimico.ListIndex <> -1 Then
Producto.Text = DblProducto(Quimico.ListIndex)
End If
End Sub
Esto carga a cada químico el valor asignado, si es que le ha sido asignado un valor con anticipación, de lo contrario carga un 0 en el textBox Producto.
6. Finalmente el evento click del botón guardar queda de la siguiente forma
Private Sub Guardar_Click()
Dim DblFila
Dim i As Long
'Validamos que la fórmula tenga un nombre
If (Trim(CodFormula.Text) <> "") Then
Sheets("FORMULAS").Select
DblFila = Range("A" & Rows.Count).End(xlUp).Row + 1
'Una vez teniendo la fila en dblFila la fórmula la guardamos como sigue
Cells(DblFila, 1) = CodFormula.Text 'Ignoro de donde tomas CodFormula
'Los demás datos los almacenamos así, asumiendo que los índices del combobox tienen cierta relación con las columnas a las que van los datos.
For i = 0 To (Quimico.ListCount - 1)
Cells(DblFila, i + 2) = DblProducto(i) 'Asignar el valor guardado
DblProducto(i) = 0 'Reiniciar la variable global
Next i
'Limpiar campos
CodFormula.Text = ""
Producto.Text = ""
Quimico.ListIndex = -1
Else
MsgBox "Debe ingresar un nombre a la fórmula"
End If
End Sub
-----------------------------
La respuesta a tu inquietud, de cómo es posible que con sólo un combobox y sólo un cuadro de texto se logre almacenar todos los datos, está en la variable DblProducto, esa es la variable que se encarga de almacenar cada calor relacionado a cada químico.
Para que lo compruebes, mientras ingresas los datos, observa que si seleccionas un químico al que ya le habías dado valor, te aparece el valor que le habías asignado, esto es porque el valor ha quedado almacenado en dblProducto.
Con las instrucciones
For i = 0 To (Quimico.ListCount - 1)
Cells(DblFila, i + 2) = DblProducto(i) 'Asignar el valor guardado
DblProducto(i) = 0 'Reiniciar la variable global
Next i
Vamos asignando a la hoja destino los valores almacenados en dicha variable y, por otra parte, vamos limpiando la variable.
------------------------------
Si sigues todas estas instrucciones al pie de la letra, te debería funcionar, pues a mí me corre bien.
Granpeke funciona perfecto EXCELENTE TRABAJO.
De verdad te agradezco la ayuda que me has brindado pero ahora a mi sale una inquietud si quisiera modificar una de las fórmulas, ya que, por error tome otra por equivocación o simplemente quiero esa misma y quiero cambiarle los valores para que me funcione mejor. ¿Como la modifico, asimismo si la quiero eliminar porque ya no la fuese a utilizar más, ya que, como sabes sigue existiendo un solo combo y un solo texbox, o sea, como hago para que me retome los datos que están almacenados en las celdas para atrás para modificarlos.
Por otro lado, me percate de algo que quizás solo sea cambiar un detalle pero mientras probé solo introduje valores enteros en el texbox(Producto) pero cuando escribo números decimales los ingresa en las celdas en Cero, cuando todos los productos llevan decimales hasta de tres dígitos Ej. 0.0235, 0.102. etc. y me imagino que el problema esta aquí: IsNumeric(Me. Producto.Text).
La función de esta fórmula es crear un formulario donde se haga lo que esta en la hoja(Consumo Diario M. P. (1)), allí veras que eso se manejaba celda por celda y con limitaciones de cierta cantidad de datos pero como ya ha crecido mucho manipular todo eso me limitaría mucho y por eso migre a macros, para hacerlo en el Formulario de Transacciones (Consumo Diario Materia Prima), esta hoja me daba un balance de cuanto había consumido ese día(SOLAMENTE) dependiendo la fórmula, o sea, que tenia treinta y una hojas de excel y así llevar cuanta materia prima gasto en el mes y lo veía en la hoja (Resumen Consumo M. P.) con los balances iniciales del mes que pertenecen a los balances finales del mes anterior. Para eso es que quiero el Modulo de Consulta para verificar que días produje POR mercancía, ya sea, Por medida, por referencia o por fórmula y ver cuanto me quedaba en existencia.
Bueno quizás esto es mucho pedir pero el archivo que tenia antes al tener que manipular todo celda por celda era de alrededor de casi 30 MB (sin la data) y este apenas tiene 3.4 MB (y tiene información) por eso lo estoy haciendo todo en macros. Para buscar la fórmula en las celdas no conocía el BUSCARV solo conocía el IF y tuve que tomar una hoja para validar las 31 hojas y compaginalas con una sola hoja donde estaban las formulaciones, que fue un trabajo repetitivo y arduo. Así que me puedes ayudar te lo agradecería mucho.
De nuevo gracias por tus atenciones y espero que sigas así ERES EL MEJOR.
De verdad te agradezco la ayuda que me has brindado pero ahora a mi sale una inquietud si quisiera modificar una de las fórmulas, ya que, por error tome otra por equivocación o simplemente quiero esa misma y quiero cambiarle los valores para que me funcione mejor. ¿Como la modifico, asimismo si la quiero eliminar porque ya no la fuese a utilizar más, ya que, como sabes sigue existiendo un solo combo y un solo texbox, o sea, como hago para que me retome los datos que están almacenados en las celdas para atrás para modificarlos.
Por otro lado, me percate de algo que quizás solo sea cambiar un detalle pero mientras probé solo introduje valores enteros en el texbox(Producto) pero cuando escribo números decimales los ingresa en las celdas en Cero, cuando todos los productos llevan decimales hasta de tres dígitos Ej. 0.0235, 0.102. etc. y me imagino que el problema esta aquí: IsNumeric(Me. Producto.Text).
La función de esta fórmula es crear un formulario donde se haga lo que esta en la hoja(Consumo Diario M. P. (1)), allí veras que eso se manejaba celda por celda y con limitaciones de cierta cantidad de datos pero como ya ha crecido mucho manipular todo eso me limitaría mucho y por eso migre a macros, para hacerlo en el Formulario de Transacciones (Consumo Diario Materia Prima), esta hoja me daba un balance de cuanto había consumido ese día(SOLAMENTE) dependiendo la fórmula, o sea, que tenia treinta y una hojas de excel y así llevar cuanta materia prima gasto en el mes y lo veía en la hoja (Resumen Consumo M. P.) con los balances iniciales del mes que pertenecen a los balances finales del mes anterior. Para eso es que quiero el Modulo de Consulta para verificar que días produje POR mercancía, ya sea, Por medida, por referencia o por fórmula y ver cuanto me quedaba en existencia.
Bueno quizás esto es mucho pedir pero el archivo que tenia antes al tener que manipular todo celda por celda era de alrededor de casi 30 MB (sin la data) y este apenas tiene 3.4 MB (y tiene información) por eso lo estoy haciendo todo en macros. Para buscar la fórmula en las celdas no conocía el BUSCARV solo conocía el IF y tuve que tomar una hoja para validar las 31 hojas y compaginalas con una sola hoja donde estaban las formulaciones, que fue un trabajo repetitivo y arduo. Así que me puedes ayudar te lo agradecería mucho.
De nuevo gracias por tus atenciones y espero que sigas así ERES EL MEJOR.
A medida que agregas contenido al post, que se aleja de lo que preguntaste inicialmente, se va perdiendo el objetivo de este sitio, ya que cada tema debería estar en un post distinto con un titulo que defina bien el problema, de tal forma que una persona que tenga un problema igual o similar al tuyo, lo pueda encontrar (pregunta pensando en los demás).
Sin otra razón en particular, me limitaré a responder sólo una de tus inquietudes a la vez.
------------------------------------------------------------------------------------
1.- Con respecto a los decimales:
- Le tienes una restricción al cuadro de texto que ni siquiera me permite ingresar el punto decimal.
- Le elmino la restricción, pero a diferencia de ti, si me marca los valores decimales. Debes tener presente, que dependiendo de la configuración de tu PC, los decimales pueden ser separados por coma (,) o por punto (.), si la coma es el separador de decimales, el punto es el separador de miles y viceversa. Es la única consideración con respecto a eso, lo demás me funciona bien (Verifica que el tipo de dato de dblProducto sea Double).
2.- Respecto a modificación o uso de parte de una ya existente, te doy sugerencias, pero lo puedes implementar de una forma distinta si quieres.
Haremos que al momento de escribir un nombre para la fórmula, evalúe si dicha fórmula existe, si existe, carga los datos de la fórmula, si no, todo normal.
Si pones guardar y la fórmula ya existe, reemplaza los datos, si no existe, la crea.
Si pones el nombre de una fórmula existente, y el campo CodFormula pierde el foco y los datos de dicha fórmula se cargarán, si cambias a un nombre nuevo (una nombre de fórmula que no existe) los datos de la fórmula anterior se mantienen y puedes ir modificando sólo los que quieras modificar.
Esto lo hago en el evento CodFormula_BeforeUpdate, sólo por comodidad, pero entendiendo la funcionalidad, lo puedes modificar a tu antojo.
Vamos a la solución.
En tu módulo, tendrás que agregar lo siguiente:
'BUSCAR UN ELEMENTO EN UNA COLUMNA DADA
Function buscaEnCol(hojaBusq As Worksheet, _
strCol As String, _
strValor As String) As Double
Dim resulta As Range
Set resulta = hojaBusq.Range(strCol & ":" & strCol).Find(strValor, _
hojaBusq.Range(strCol & hojaBusq.Rows.Count).End(xlUp), _
LookIn:=xlValues, LookAt:=xlWhole)
If (Not resulta Is Nothing) Then
buscaEnCol = resulta.Row
End If
End Function
'Permite recargar los datos de la fórmula en la variable global
Sub datosFormula(hFormulas As Worksheet, dblFila As Double)
Dim i As Integer
For i = 0 To Me.Quimico.ListCount - 1
DblProducto(i) = hFormulas.Cells(dblFila, i + 2)
Next
End Sub
---------------------
En el código de tu formulario debes agregar lo siguiente para el evento CodFormula_BeforeUpdate, para hacer la acción de carga de los datos en caso de que exista la fórmula
Private Sub CodFormula_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Dim dblFila As Double
'Busca la fórmula en la hoja de fórmulas
dblFila = buscaEnCol(Hoja42, "A", Me.CodFormula.Text)
'Si existe, carga los datos de la fórmula existente
If dblFila > 0 Then
datosFormula Hoja42, dblFila
End If
End Sub
----------------------------
Dentro del evento clic del boton guardar, reemplaza esto
dblFila = Range("A" & Rows.Count).End(xlUp).Row + 1
Por esto
'Verificar si la formula existe, si existe se modifica, si no
'existe, se agrega
dblFila = buscaEnCol(Hoja42, "A", Me.CodFormula.Text)
If dblFila <= 0 Then dblFila = Range("A" & Rows.Count).End(xlUp).Row + 1
Esto verifica si la fórmula existe y si existe, reemplaza los datos anteriores por los ingresados ahora, si no existe, la crea.
------------------------------------------
Intenta hacer tú lo necesario para eliminar. Como recomendación, utiliza buscarEnCol
Sin otra razón en particular, me limitaré a responder sólo una de tus inquietudes a la vez.
------------------------------------------------------------------------------------
1.- Con respecto a los decimales:
- Le tienes una restricción al cuadro de texto que ni siquiera me permite ingresar el punto decimal.
- Le elmino la restricción, pero a diferencia de ti, si me marca los valores decimales. Debes tener presente, que dependiendo de la configuración de tu PC, los decimales pueden ser separados por coma (,) o por punto (.), si la coma es el separador de decimales, el punto es el separador de miles y viceversa. Es la única consideración con respecto a eso, lo demás me funciona bien (Verifica que el tipo de dato de dblProducto sea Double).
2.- Respecto a modificación o uso de parte de una ya existente, te doy sugerencias, pero lo puedes implementar de una forma distinta si quieres.
Haremos que al momento de escribir un nombre para la fórmula, evalúe si dicha fórmula existe, si existe, carga los datos de la fórmula, si no, todo normal.
Si pones guardar y la fórmula ya existe, reemplaza los datos, si no existe, la crea.
Si pones el nombre de una fórmula existente, y el campo CodFormula pierde el foco y los datos de dicha fórmula se cargarán, si cambias a un nombre nuevo (una nombre de fórmula que no existe) los datos de la fórmula anterior se mantienen y puedes ir modificando sólo los que quieras modificar.
Esto lo hago en el evento CodFormula_BeforeUpdate, sólo por comodidad, pero entendiendo la funcionalidad, lo puedes modificar a tu antojo.
Vamos a la solución.
En tu módulo, tendrás que agregar lo siguiente:
'BUSCAR UN ELEMENTO EN UNA COLUMNA DADA
Function buscaEnCol(hojaBusq As Worksheet, _
strCol As String, _
strValor As String) As Double
Dim resulta As Range
Set resulta = hojaBusq.Range(strCol & ":" & strCol).Find(strValor, _
hojaBusq.Range(strCol & hojaBusq.Rows.Count).End(xlUp), _
LookIn:=xlValues, LookAt:=xlWhole)
If (Not resulta Is Nothing) Then
buscaEnCol = resulta.Row
End If
End Function
'Permite recargar los datos de la fórmula en la variable global
Sub datosFormula(hFormulas As Worksheet, dblFila As Double)
Dim i As Integer
For i = 0 To Me.Quimico.ListCount - 1
DblProducto(i) = hFormulas.Cells(dblFila, i + 2)
Next
End Sub
---------------------
En el código de tu formulario debes agregar lo siguiente para el evento CodFormula_BeforeUpdate, para hacer la acción de carga de los datos en caso de que exista la fórmula
Private Sub CodFormula_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Dim dblFila As Double
'Busca la fórmula en la hoja de fórmulas
dblFila = buscaEnCol(Hoja42, "A", Me.CodFormula.Text)
'Si existe, carga los datos de la fórmula existente
If dblFila > 0 Then
datosFormula Hoja42, dblFila
End If
End Sub
----------------------------
Dentro del evento clic del boton guardar, reemplaza esto
dblFila = Range("A" & Rows.Count).End(xlUp).Row + 1
Por esto
'Verificar si la formula existe, si existe se modifica, si no
'existe, se agrega
dblFila = buscaEnCol(Hoja42, "A", Me.CodFormula.Text)
If dblFila <= 0 Then dblFila = Range("A" & Rows.Count).End(xlUp).Row + 1
Esto verifica si la fórmula existe y si existe, reemplaza los datos anteriores por los ingresados ahora, si no existe, la crea.
------------------------------------------
Intenta hacer tú lo necesario para eliminar. Como recomendación, utiliza buscarEnCol
- Compartir respuesta
- Anónimo
ahora mismo