Atascado con un proyecto Excel vba

Llevo algunos días con un proyecto en el que me he atascado y no logro que funcione.

Se trata de un archivo de excel con varias hojas que cada una debe actuar como una base de datos independiente, accediendo al mismo a través de un formulario para identificar al usuario y cargándose según el usuario la hoja correspondiente a su base de datos en un listbox.

Hasta ahí bien, aunque seguro que el código será muy mejorable.

El problema viene cuando trato de grabar en los campos que permito que se escriba a través del botón modificar.

No consigo que guarde los cambios y ese es el problema que trato de resolver.

Por mucho que he buscado en internet no he logrado dar con el error, ya que de hecho no salta ningún error de código.

Y ya para que tuviese la funcionalidad que realmente deseo, hay una hoja llamada "GENERAL" que contiene todos los registros que luego están asignados a cada una de las otras hojas.

Lo que desearía es que una vez se consiguiese que se grabaran los datos, se hiciese tanto en la hoja del usuario que se logueó como en la hoja "GENERAL" que contiene todos los registros.

Esta duda sé que es imposible de resolver sin ver el código como lo he hecho.

Si alguien es tan amable de responderme y se presta a revisarlo con gusto le envío el archivo.

Respuesta

Si puedo ver tu archivo intentaré averiguar dónde se produce el error.

Archivo Excel

El formulario que se inicia al abrir el excel sirve para loguearse, ya que se trata de una base de datos dividida en varias hojas donde cada usuario tiene acceso a "su hoja".

En el código de dicho form podrás ver cada usuario y su password para poderlo ejecutar completamente operativo.

Muchas gracias

2 respuestas más de otros expertos

Respuesta
1

No necesito ver los códigos, pero me serviría alguna captura de pantalla, donde mostrás los datos y el problema que tengas. Creo tener la solución, pero todo depende del problema, si no podes ser más claro con tu problema, mi solución no va a ser directa, sino que voy a tener que darte la solución a todos los problemas que pudieras estar refiriéndote.

Por otro lado, no te desanimes, yo no estoy en casa, pero dentro de unas horas voy a poder contestarte con más tranquilidad.

Muy buenas César y gracias por tu respuesta.

Te adjunto una captura de pantalla donde verás el formulario con el listbox que carga los registros de las hojas de excel y que a través del mismo se editan pero no consigo guardarlos.

Previamente a ese form hay otro que sirve para que los distintos usuarios se logueen, y en función del usuario logueado el listbox carga la hoja correspondiente a dicho usuario con "SUS CLIENTES".

Al posicionarse en un registro en el listbox los textbox se llenan con el campo correspondiente, y al pulsar el botón "modificar" se puede escribir en ellos.

Hasta ahí todo bien, pero "guardar" no me funciona y además no me arroja ningún error de código.

Te voy a adjuntar el código del formulario donde verás el que corresponde a cuando se inicializa el formulario cargando en el listbox los registros en función del usuario logueado, el código de los botones modificar, cancelar y guardar y por último los códigos de los botones que ordenan por columnas las tablas que llaman a unas macros:

Private Sub Cancelar_Click()
TextBox2.Enabled = False
TextBox5.Enabled = False
TextBox6.Enabled = False
TextBox19.Enabled = False
TextBox20.Enabled = False
Guardar.Enabled = False
Cancelar.Enabled = False
Modificar.Enabled = True
Salir.Enabled = True
CommandButton1.Enabled = True
CommandButton3.Enabled = True
CommandButton4.Enabled = True
CommandButton5.Enabled = True
CommandButton6.Enabled = True
CommandButton7.Enabled = True
End Sub

Private Sub CommandButton1_Click()
Call Ordenemp
End Sub

Private Sub CommandButton3_Click()
Call Ordendir
End Sub

Private Sub CommandButton4_Click()
Call Ordencom
End Sub

Private Sub CommandButton5_Click()
Call Ordencom1
End Sub

Private Sub CommandButton6_Click()
Call Ordahorro
End Sub

Private Sub CommandButton7_Click()
Call Ordconsumo
End Sub

Private Sub Guardar_Click()
For i = 1 To 20
ActiveCell.Offset(0, i - 1).Value = Me.Controls("TextBox" & i).Value
Next i
TextBox2.Enabled = False
TextBox5.Enabled = False
TextBox6.Enabled = False
TextBox19.Enabled = False
TextBox20.Enabled = False
Guardar.Enabled = False
Cancelar.Enabled = False
Modificar.Enabled = True
Salir.Enabled = True
CommandButton1.Enabled = True
CommandButton3.Enabled = True
CommandButton4.Enabled = True
CommandButton5.Enabled = True
CommandButton6.Enabled = True
CommandButton7.Enabled = True
End Sub

Private Sub Listado_Click()
Fila = Me.Listado.ListIndex + 2
For i = 1 To 20
Cells(Fila, 1).Activate
Next i
For i = 1 To 20
Me.Controls("TextBox" & i).Value = ActiveCell.Offset(0, i - 1).Value
Next i
End Sub

Private Sub Modificar_Click()
If Me.Listado.ListIndex < 0 Then
MsgBox "No se ha elegido ningún registro", vbExclamation, "¡ATENCIÓN!"
Else
TextBox2.Enabled = True
TextBox5.Enabled = True
TextBox6.Enabled = True
TextBox19.Enabled = True
TextBox20.Enabled = True
TextBox2.SetFocus
Modificar.Enabled = False
Cancelar.Enabled = True
Guardar.Enabled = True
Salir.Enabled = False
CommandButton1.Enabled = False
CommandButton3.Enabled = False
CommandButton4.Enabled = False
CommandButton5.Enabled = False
CommandButton6.Enabled = False
CommandButton7.Enabled = False
End If
End Sub

Private Sub Salir_Click()
Unload Me
End Sub

Private Sub UserForm_Initialize()
If UserForm1.txtUsuario.Text = "admin" Then
With Listado
.ColumnCount = 20
.ColumnHeads = True
End With
Listado.RowSource = "Tadmin"
ElseIf UserForm1.txtUsuario.Text = "asanchez" Then
With Listado
.ColumnCount = 20
.ColumnHeads = True
End With
Listado.RowSource = "Tasanchez"
Sheets("AntonioSanchez").Select
ElseIf UserForm1.txtUsuario.Text = "agarcia" Then
With Listado
.ColumnCount = 20
.ColumnHeads = True
End With
Listado.RowSource = "Tagarcia"
ElseIf UserForm1.txtUsuario.Text = "amarin" Then
With Listado
.ColumnCount = 20
.ColumnHeads = True
End With
Listado.RowSource = "Tamarin"
ElseIf UserForm1.txtUsuario.Text = "fgrande" Then
With Listado
.ColumnCount = 20
.ColumnHeads = True
End With
Listado.RowSource = "Tfgrande"
ElseIf UserForm1.txtUsuario.Text = "rcabello" Then
With Listado
.ColumnCount = 20
.ColumnHeads = True
End With
Listado.RowSource = "Trcabello"
ElseIf UserForm1.txtUsuario.Text = "rcobos" Then
With Listado
.ColumnCount = 20
.ColumnHeads = True
End With
Listado.RowSource = "Trcobos"
ElseIf UserForm1.txtUsuario.Text = "pjimenez" Then
With Listado
.ColumnCount = 20
.ColumnHeads = True
End With
Listado.RowSource = "Tpjimenez"
ElseIf UserForm1.txtUsuario.Text = "eizquierdo" Then
With Listado
.ColumnCount = 20
.ColumnHeads = True
End With
Listado.RowSource = "Teizquierdo"
ElseIf UserForm1.txtUsuario.Text = "dsanchez" Then
With Listado
.ColumnCount = 20
.ColumnHeads = True
End With
Listado.RowSource = "Tdsanchez"
ElseIf UserForm1.txtUsuario.Text = "fcamacho" Then
With Listado
.ColumnCount = 20
.ColumnHeads = True
End With
Listado.RowSource = "Tfcamacho"
End If
End Sub

Espero sinceramente que puedas ayudarme, y desde ya infinitas gracias por las molestias.

Un saludo

De primero, te comento como trabajo yo lo que vos estas haciendo, porque lo hago de manera distinta, tal vez te guste o no, te resulte útil o no, pero quizás no deberías realizar muchos cambios en tu trabajo. También te aclaro por las dudas, que cuando hable de "fila" me voy a referir a las filas de las hojas de cálculo, y cuando hable de "renglón", serán las filas o renglones de los listbox que colocas en los formularios.

Primero dejo por defecto la propiedad BoundColumn en 1, cuando creo un listbox. Esta propiedad establece que el valor de la lista (ListBox1. Value), va a estar representado por lo que haya en la columna 1. Es decir, si haces clic en algún renglón de la lista, la lista va a pasar a tener un valor, y este valor va a estar determinado por la fila seleccionada, y por la columna que se haya establecido en la propiedad BoundColumn. En cambio, si no hay nada seleccionado, el valor de la lista es: NULO

Segundo, en cada lista que muestro, siempre en la primer columna tengo todo enumerado de manera ascendente. Entonces, al hacer clic en algún renglón de la lista, ésta pasa automáticamente a valer lo que esté en la columna 1, o sea, un número que hace referencia también, a su ubicación. Por ej:
Fila = ListBox1.Value

En ese caso, si hubiese hecho clic en el renglón 3 de la lista por ejemplo, y si en la primer columna hay un número 3 (como debería ser), entonces ya tengo en una variable la ubicación del renglón que deseo modificar.

Luego mediante macros, modifico la celda que corresponde, por ejemplo:

Private Sub Guardar_Click()

Dim Fila As Integer                              //Declaramos la variable Fila

Fila = ListBox1.Value                          //Cargo en Fila, el valor del ListBox

Cells(Fila,"A").Value = TextBox1       //Cambio el valor de la celda A3 por lo que hay en el TextBox

End Sub

Ojo, tal vez esta no sea la mejor manera, así lo hago yo. Pero tenés que tener en cuenta ciertos detalles que terminarían en error si no prestas atención, ya que ahí te mostré algo super simple, pero te pueden salir ciertos errores, como ser:
* Sabemos que Fila es del tipo Integer, entonces, sí o sí, al momento de darle el valor del ListBox1, éste tiene que valer algo, un entero, ya que por defecto no hay ningún renglón seleccionado, y con este código y sin seleccionar nada presionamos en el botón GUARDAR, tendrás un error ya que se ejecutaría algo similar a esto: Fila = NULO. Imposible.

* Por otro lado, si la lista comienza en la tercer fila de la hoja, pero su primer renglón en el listbox vale 1, entonces, tenes que ajustar su ubicación al momento de darle su valor, sino queda defasado, por ejemplo: Cells( Fila + 2, "A").Value = TextBox1. Entonces, al presionar en el primer renglón del listbox que vale 1, pero es la tercer fila de la hoja de excel, tenemos que modificar entonces la tercer fila de "A", por eso, la instrucción quedaría:

Cells(1 + 2, "A").Value = TextBox1

Cells(3,"A").Value = TextBox1

**************************
Unos detalles para agregar:

Si vos tenes la lista de la manera en que te expliqué, uno puede seleccionar el renglón que desea mediante macros, cambiándo el valor de la lista. EJ:

ListBox1.Value = 5

Esa instrucción selecciona directamente la fila 5 del listbox. Tener en cuenta que ese valor (5) debe existir, sino también terminaría en un error.

Y por último, si consideras innecesario que se vean los números o que la lista se mantenga como está en tu trabajo, si agregas la columna como te expliqué, podes ponerle ancho cero (0pt;) y no se va a ver, pero va a funcionar igual.
Espero haber sido claro, aunque no haya buscado el error en tu trabajo, por cuestiones de tiempo, preferí directamente explicarte como lo haría yo.

Respuesta
1

Si te sirve de ayuda echa un vistazo en www.programarexcel.com

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas