Ya no me funciona guardar modificar y eliminar ya que cambie en el lisbox arrays por rowsource

Tengo un problema al momento de guardar, modificar y eliminar, primeramente si me funcionaban bien ya que antes lo estaba trabajando con arrays en lisbox, ahora lo cambie a rowsource por temas de memoria gracias a la explicación y orientación que me dio el experto JAMES BOND, la cual pienso trabajar todos mis formularios desde el excel con tablas para poder sacar unos estadísticos y así disminuir código, el detalle que tengo ahorita es que cuando cambie el modo de lisbox ya no me guardar, modifica y elimina en tiempo real desde el lisbox y cuando guardo el primer registro me salta a la segunda posición no se a que se debe no se si sera por que inserte una tabla o es por otra cosa del código.

Adjunto imagen del problema

2 respuestas

Respuesta
2

Estoy dejando Todoexpertos poco a poco, esta es una de mis ultimas respuestas (ni siquiera tiene que valorarla), viendo que esta plagado de personas que mal informan a los que menos saben y se hacen pasar por "expertos". Permítame aclarar algunas cosas sobre lo que dijo de los arrays y la memoria.

1- A menos que tengas una computadora de hace 2 décadas y una versión de Excel arcaica, el tema de la memoria es solo un tabú irrelevante. Pero claro si eres una persona que se quedó atascada en el tiempo y aun programa con técnicas obsoletas, siempre verás esos fantasmas. Claro que si no sabes trabajar con Arrays, dirás que no sirven. No siempre lo más simple es lo más adecuado (especialmente en programación). Como por ejemplo en PHP quien no sabe hacer consultas preparadas se conforma con usar mysqli_real_escape_string() solo porque es más fácil y lleva "menos" código ignorando que es una pésima decisión en cuanto a seguridad.

2- La propiedad RowSource es más hambrienta en memoria y procesamiento que los Arrasy (Por mucho) especialmente si creas una hoja solamente para cargar un RowSource, además de sus tantas limitaciones y errores que lanza y afectan a otras partes de la aplicación (casualmente aquí en Todoexpertos asistí a una persona que en su libro tenia errores de Limite de Memoria por haber usado el RowSource): Macro Listbox multiselect con filtro

3- Un item en un Array solo ocupa 1 byte en la memoria por el hecho de ser solo un Item. Luego cada carácter ocupa 1 byte también. Un Array 2D es una tabla abstracta en la memoria, RowSource transfiere una tabla física al objeto destino. Todo en Excel tiene que ver con la memoria. Es irresponsable, ingenuo e ignorante decir "los arrays ocupan memoria", bueno TODO ocupa memoria, solo que unas cosas más que otras y para saber cuales deben leer un poco más.

4- No solo en VBA, en cualquier lenguaje de programación una tabla abstracta siempre tendrá más prioridad y mejor rendimiento que transferir una tabla física.

Excelente aclaración experto ANDY MACHIN, lo que pasa en aveces en internet uno se encuentra de todo en conclusión usted como experto y esto lo busque en internet y no lo encontré quien busca más rápido los registros en un lisbox los ARRAYS o utilizando ROWSOURCE, en un video de hace tiempo logre ver que decía que un ARRAYS es más completo y rápido que al utilizar ADDITEM Y ROWSOURCE, no se si estaré en lo correcto.

Depende de lo que quieras hacer. Si mal no recuerdo usted quiere filtrar registros, en ese caso es mejor usar un Array, con Rowsource es un desperdicio de recursos porque tienes que aplicar el filtro a la hoja, pasar los datos filtrados a otra hoja, cargar el rowsource con esa hoja, borrar esa hoja. Ademas no te permite hacer un "Filter As You Type" que es filtrar en tiempo real. Cierro la pregunta.

Respuesta
1

Ya que no puede hacer funcionar tu macro te paso esta macro solo pégala en el formulario

Private Sub CommandButton1_Click()
filas = Label4
curso = TextBox1.Text
numero = Range("cursos").Cells(filas, 1)
valida = WorksheetFunction.CountA(Range("cursos").Rows(1))
If valida > 0 Then filas = filas + 1
    If TextBox1.Text <> Empty And TextBox2.Text <> Empty Then
        cuenta = WorksheetFunction.CountIf(Range("cursos").Columns(2), curso)
        If cuenta = 0 Then
            With Range("cursos")
                .Cells(filas, 1) = filas
                .Cells(filas, 2) = TextBox1.Text
                .Cells(filas, 3) = TextBox2.Text
                cargar_listbox1
            End With
        Else
            MsgBox ("este curso ya existe"), vbCritical, "AVISO"
        End If
Else
        MsgBox ("FALTA DE CAPTURAR EL CURSO O LA CANTIDAD"), vbCritical, "AVISO"
End If
End Sub
Private Sub CommandButton2_Click()
INDICE = ListBox1.ListIndex + 1
If INDICE > 0 Then
    With Range("cursos")
        TextBox1.Text = .Cells(INDICE, 2)
        TextBox2.Text = .Cells(INDICE, 3)
    End With
Else
MsgBox ("eliga primero un curso del cuadro de cursos"), vbCritical, "aviso"
End If
End Sub
Private Sub CommandButton3_Click()
INDICE = ListBox1.ListIndex + 1
If INDICE > 0 Then
    With Range("cursos")
        .Cells(INDICE, 2) = TextBox1.Text
        .Cells(INDICE, 3) = TextBox2.Text
    End With
    MsgBox ("cambios realizados"), vbExclamation, "AVISO"
    cargar_listbox1
Else
MsgBox ("eliga primero un curso del cuadro de cursos"), vbCritical, "aviso"
End If
End Sub
Private Sub CommandButton4_Click()
INDICE = ListBox1.ListIndex + 1
If INDICE > 0 Then
    PREGUNTA = MsgBox("QUIERE BORRAR ESTE CURSO?", vbYesNo, "AVISO")
    If PREGUNTA = 6 Then
        Range("CURSOS").Rows(INDICE).EntireRow.Delete
        Range("CURSOS").Cells(1, 1) = 1
        Range("CURSOS").Cells(1, 1).AutoFill Destination:=Range(Range("CURSOS").Columns(1).Address), Type:=xlFillSeries
        cargar_listbox1
    End If
Else
    MsgBox ("eliga primero un curso del cuadro de cursos"), vbCritical, "aviso"
End If
End Sub
Private Sub UserForm_Initialize()
FRMCARRERA.Caption = "MODULO DE ALTAS DE CURSOS"
cargar_listbox1
End Sub
Sub cargar_listbox1()
    With ListBox1
        .RowSource = "ESPECIALIDAD!" & Range("CURSOS").Address
        .ColumnCount = Range("CURSOS").Columns.Count
        .ColumnHeads = True
        filas = .ListCount
        If filas > 1 Then Label4 = filas Else Label4 = 1
    End With
End Sub

Experto James Bond una pregunta el button2 es para seleccionar el en lisbox y el botton3 es para modificar el registro estoy en lo correcto 

Button 1 es altas, button2 es modificaciones, button3 es guardar modificaciones, button4 es borrar registros, para que los tres últimos botones funcionen es necesario seleccionar un registro del listbox, una vez que guardes o borres el listbox se actualizara en automático

Gracias experto James Bond por su aclaración y ayuda la cual cada día se aprende mucho.

Saludos 

Experto JAMES BOND, disculpe una pregunta por que cuando busco un curso no encuentra el dato correspondiente si no el primer registro, por ejemplo en este caso busque MATEMÁTICA, que tiene 3 cantidades pero cuando elijo me arroja 1 la cual le corresponde a BIOLOGÍA, osea no lo esta haciendo como la función buscarV. Ese es el unico inconveniente que tengo nomas experto JAMES BOND.

Adjunto el archivo que me ayudo

https://drive.google.com/file/d/1gk5W2lTeynYU3uZv05GjPKtmOILxwezG/view?usp=sharing 

No entiendo en la tabla cursos la columna cantidad representa los lugares que tienes disponibles y esa se pone en txtdisponibles, ¿merito de donde sale?, porque esa parte no recuerdo haberla programado y según recuerdo en otra consulta que hiciste el merito consistía en posicionar de mayor a menor las puntuaciones obtenidas partiendo del 1 y como máximo la cantidad disponible.

No mérito no tiene nada que ver allí experto James Bond solo es el tema de disponibles nomás osea si busco en el filtro matemáticas me tiene que traer de la hoja profesión 1 ya que dicha hoja matemáticas tiene una cantidad disponible. Es algo así como buscarv con fórmula en excel comparando la hoja E_Personal y Profesion no sé si me dejó entender experto James bond

En el sub estadísticas esta línea es la que llena el textbox disponible

TxtDisponibles.Text = Range("cursos").Cells(ComboBox2.ListIndex + 1, 3)

el numero 3 indica que llenara el txt con la informacion de la columna cantidad si quieres que muestre la informacion de cualquier otra columna solo cambia este valor asi, ahora el dato que mostrara sera el de la columna No

TxtDisponibles.Text = Range("cursos").Cells(ComboBox2.ListIndex + 1, 1)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas