Botón_Modificar_seleccionar_listBox

Resuelto

Hola,

Quisiera modificar un dato en una tabla de Excel a partir de un ListBox, me explico,

cuando selecciono un dato en el ListBox, los TextBox se llenan, modifico un TextBox y hago clic en el botón modificar (para modificar mi dato), pero no se modifica (se modifica el primer dato de la tabla). Quisiera modificar el dato seleccionado en el ListBox!

¿Podrían ayudarme a escribir el código?

Adjunto mi código actual

Muchas gracias

Private Sub b_modif_Click() Dim ligne As Integer If MsgBox("¿Confirma la modificación?", vbYesNo, "Confirmación de modificación") <> vbYes Then ligne = ListBox7.ListIndex + 2 MsgBox ligne Range("A" & ligne) = T_Id.Value Range("B" & ligne) = T_Designation.Value Range("C" & ligne) = T_Code.Value Range("D" & ligne) = T_Stock_Min.Value Range("E" & ligne) = T_Nvx_Emplt.Value Range("F" & ligne) = T_Fournisseur.Value Range("G" & ligne) = T_Stock_Reel.Value Range("H" & ligne) = T_Stock_Max.Value Range("I" & ligne) = T_Ancien_Emplt.Value Range("J" & ligne) = T_Machine.Value Range("K" & ligne) = ComboBox1.Value Range("L" & ligne) = ComboBox2.Value Range("M" & ligne) = ComboBox3.Value Range("N" & ligne) = ComboBox4.Value Range("O" & ligne) = ComboBox5.Value End If End Sub


11 respuestas

  1. Colaborador

    hola,

    ¿puedes también mostrar el código que reacciona cuando seleccionas un dato en el listBox?

    1. Hola yg_be

      Aquí está el código cuando hago clic en la listbox

      muchas gracias por tu ayuda

      Private Sub ListBox7_Click() Me.T_Id = Me.ListBox7.List(Me.ListBox7.ListIndex) Me.T_Designation.Value = Me.ListBox7.Column(1, Me.ListBox7.ListIndex) Me.T_Code.Value = Me.ListBox7.Column(2, Me.ListBox7.ListIndex) Me.T_Stock_Min.Value = Me.ListBox7.Column(3, Me.ListBox7.ListIndex) Me.T_Nvx_Emplt.Value = Me.ListBox7.Column(4, Me.ListBox7.ListIndex) Me.T_Fournisseur.Value = Me.ListBox7.Column(5, Me.ListBox7.ListIndex) Me.T_Stock_Reel.Value = Me.ListBox7.Column(6, Me.ListBox7.ListIndex) Me.T_Stock_Max.Value = Me.ListBox7.Column(7, Me.ListBox7.ListIndex) Me.T_Ancien_Emplt.Value = Me.ListBox7.Column(8, Me.ListBox7.ListIndex) Me.T_Machine.Value = Me.ListBox7.Column(9, Me.ListBox7.ListIndex) Me.ComboBox1.Value = Me.ListBox7.Column(10, Me.ListBox7.ListIndex) Me.ComboBox2.Value = Me.ListBox7.Column(11, Me.ListBox7.ListIndex) Me.ComboBox3.Value = Me.ListBox7.Column(12, Me.ListBox7.ListIndex) Me.ComboBox4.Value = Me.ListBox7.Column(13, Me.ListBox7.ListIndex) Me.ComboBox5.Value = Me.ListBox7.Column(14, Me.ListBox7.ListIndex) End Sub
      1. Colaborador

        hola,

        No entiendo por qué "ListBox7.ListIndex" ya no contiene el valor correcto en "b_modif_Click()".
        Yo añadiría un control para memorizar su valor. Supongamos que este control añadido se llama ListX.

        Entonces, en "ListBox7_Click()", añadiría:

        Me.ListX = Me.ListBox7.ListIndex

        Y en "b_modif_Click", añadiría:

        linea=ListX
    2. Hola yg_be,

      he puesto línea = ListBox7.ListIndex + 2, porque mis datos comienzan a partir de la segunda línea de la tabla.

      Me gustaría saber, por favor, ¿de qué tipo es el ListX que has agregado? (no entendí muy bien por qué pusiste "Me.")

      Cuando añado en ListBox7_Click(),

       Me.ListX = Me.ListBox7.ListIndex

      Y en "b_modif_Click", añadiría:

       línea=ListX

      me muestra el error anterior

      Muchas gracias de antemano

      1. Colaborador

        ¿Has añadido un control llamado ListX?

      • Private Sub b_modif_Click() Dim ligne As Integer If MsgBox("¿Confirma la modificación?", vbYesNo, "Confirmación de modificación") <> vbYes Then ligne = ListX.Value 'ligne = ListBox7.ListIndex + 2 MsgBox ligne Range("A" & ligne) = Me.T_Id.Value Range("B" & ligne) = Me.T_Designation.Value Range("C" & ligne) = Me.T_Code.Value Range("D" & ligne) = Me.T_Stock_Min.Value Range("E" & ligne) = Me.T_Nvx_Emplt.Value Range("F" & ligne) = Me.T_Fournisseur.Value Range("G" & ligne) = Me.T_Stock_Reel.Value Range("H" & ligne) = Me.T_Stock_Max.Value Range("I" & ligne) = Me.T_Ancien_Emplt.Value Range("J" & ligne) = Me.T_Machine.Value Range("K" & ligne) = Me.ComboBox1.Value Range("L" & ligne) = Me.ComboBox2.Value Range("M" & ligne) = Me.ComboBox3.Value Range("N" & ligne) = Me.ComboBox4.Value Range("O" & ligne) = Me.ComboBox5.Value End If End Sub
      Private Sub ListBox7_DblClick(ByVal Cancel As MSForms.ReturnBoolean) If T_Fournisseur.Value = "" And T_Designation.Value = "" Then MsgBox "¡Introduzca un nombre, por favor!" Exit Sub End If If T_Designation.Value <> "" Then Set cel = Feuil2.Columns(1).Find(what:=ListBox7.Value, LookIn:=xlValues, lookat:=xlWhole) If Not cel Is Nothing Then Me.SpinButton2 = cel.Row End If End If btncreer.Enabled = False End Sub Private Sub ListBox7_Click() Me.ListX = Me.ListBox7.ListIndex Me.T_Id = Me.ListBox7.List(Me.ListBox7.ListIndex) Me.T_Designation.Value = Me.ListBox7.Column(1, Me.ListBox7.ListIndex) Me.T_Code.Value = Me.ListBox7.Column(2, Me.ListBox7.ListIndex) Me.T_Stock_Min.Value = Me.ListBox7.Column(3, Me.ListBox7.ListIndex) Me.T_Nvx_Emplt.Value = Me.ListBox7.Column(4, Me.ListBox7.ListIndex) Me.T_Fournisseur.Value = Me.ListBox7.Column(5, Me.ListBox7.ListIndex) Me.T_Stock_Reel.Value = Me.ListBox7.Column(6, Me.ListBox7.ListIndex) Me.T_Stock_Max.Value = Me.ListBox7.Column(7, Me.ListBox7.ListIndex) Me.T_Ancien_Emplt.Value = Me.ListBox7.Column(8, Me.ListBox7.ListIndex) Me.T_Machine.Value = Me.ListBox7.Column(9, Me.ListBox7.ListIndex) Me.ComboBox1.Value = Me.ListBox7.Column(10, Me.ListBox7.ListIndex) Me.ComboBox2.Value = Me.ListBox7.Column(11, Me.ListBox7.ListIndex) Me.ComboBox3.Value = Me.ListBox7.Column(12, Me.ListBox7.ListIndex) Me.ComboBox4.Value = Me.ListBox7.Column(13, Me.ListBox7.ListIndex) Me.ComboBox5.Value = Me.ListBox7.Column(14, Me.ListBox7.ListIndex) End Sub

      Hola,

      He añadido un textbox al userform, lo he nombrado ListX, adjunto mis dos códigos del botón modificar y del listbox, así como la simulación.

      El ListX que está rodeado en azul, muestra el número de la línea en el listbox (¡la línea en el listbox no es la línea en la tabla de Excel!) y por lo tanto no puedo asignar el valor de ListX a la variable línea del código de mi botón modificar.

      Muchas gracias de antemano.

      1. Creo que voy a usar el mismo truco que me mostraste sobre (el botón eliminado) para comprobar si los IDs son iguales y luego modificar en lugar de eliminar, me parece un buen truco.

        1. Private Sub b_modif_Click() Dim ligne As Integer Dim i As Long, suppression As String, present As String If MsgBox("¿Confirma la modificación?", vbYesNo, "Confirmación de modificación") <> vbYes Then With ThisWorkbook.Sheets("Electrique") For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1 present = .Range("A" & i).Value If present = Me.T_Id.Value Then ligne = i Range("A" & ligne) = Me.T_Id.Value Range("B" & ligne) = Me.T_Designation.Value Range("C" & ligne) = Me.T_Code.Value Range("D" & ligne) = Me.T_Stock_Min.Value Range("E" & ligne) = Me.T_Nvx_Emplt.Value Range("F" & ligne) = Me.T_Fournisseur.Value Range("G" & ligne) = Me.T_Stock_Reel.Value Range("H" & ligne) = Me.T_Stock_Max.Value Range("I" & ligne) = Me.T_Ancien_Emplt.Value Range("J" & ligne) = Me.T_Machine.Value Range("K" & ligne) = Me.ComboBox1.Value Range("L" & ligne) = Me.ComboBox2.Value Range("M" & ligne) = Me.ComboBox3.Value Range("N" & ligne) = Me.ComboBox4.Value Range("O" & ligne) = Me.ComboBox5.Value End If Next i End With End If End Sub
        2. Colaborador
          @zouzou

          Primero hay que cerrar el último elemento abierto.
          Dado que el código comienza por

          • If ,
          • With,
          • For,
          • If,

          debe terminar por

          • end if
          • next
          • end with
          • end if

          Además, utilizas dos variables, i y ligne, cuando una sola es suficiente.

      2. Muchas gracias yg_be,

        comparto contigo mi código que debería funcionar normalmente, es el mismo truco que hice en el botón de eliminar. ¿Cuál crees que es la razón por la que no modifica la selección y no muestra ningún error? El código es correcto.

        Te agradezco mucho de antemano

        Private Sub b_modif_Click() Dim i As Long, modification As String, present As String If MsgBox("¿Confirma la modificación?", vbYesNo, "Confirmación de modificación") <> vbYes Then With ThisWorkbook.Sheets("Electrique") For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1 present = .Range("A" & i).Value modification = Me.T_Id.Value If present = modification Then modification = modification + 1 Range("A" & modification) = Me.T_Id.Value Range("B" & modification) = Me.T_Designation.Value Range("C" & modification) = Me.T_Code.Value Range("D" & modification) = Me.T_Stock_Min.Value Range("E" & modification) = Me.T_Nvx_Emplt.Value Range("F" & modification) = Me.T_Fournisseur.Value Range("G" & modification) = Me.T_Stock_Reel.Value Range("H" & modification) = Me.T_Stock_Max.Value Range("I" & modification) = Me.T_Ancien_Emplt.Value Range("J" & modification) = Me.T_Machine.Value Range("K" & modification) = Me.ComboBox1.Value Range("L" & modification) = Me.ComboBox2.Value Range("M" & modification) = Me.ComboBox3.Value Range("N" & modification) = Me.ComboBox4.Value Range("O" & modification) = Me.ComboBox5.Value End If Next i End With End If End Sub

        :

        1. Colaborador

          quizás:

           For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1 If .Range("A" & i).Value = Me.T_Id.Value Then .Range("B" & i) = Me.T_Designation.Value ' ...
      3. Te agradezco por la propuesta, la he probado, es correcta pero no da ningún resultado!

        Private Sub b_modif_Click() Dim i As Long, modification As String, present As String If MsgBox("¿Confirma la modificación?", vbYesNo, "Confirmación de modificación") <> vbYes Then With ThisWorkbook.Sheets("Electrique") For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1 If .Range("A" & i).Value = Me.T_Id.Value Then .Range("B" & i) = Me.T_Designation.Value .Range("C" & i) = Me.T_Code.Value .Range("D" & i) = Me.T_Stock_Min.Value .Range("E" & i) = Me.T_Nvx_Emplt.Value .Range("F" & i) = Me.T_Fournisseur.Value .Range("G" & i) = Me.T_Stock_Reel.Value .Range("H" & i) = Me.T_Stock_Max.Value .Range("I" & i) = Me.T_Ancien_Emplt.Value .Range("J" & i) = Me.T_Machine.Value .Range("K" & i) = Me.ComboBox1.Value .Range("L" & i) = Me.ComboBox2.Value .Range("M" & i) = Me.ComboBox3.Value .Range("N" & i) = Me.ComboBox4.Value .Range("O" & i) = Me.ComboBox5.Value ' present = .Range("A" & i).Value ' modification = Me.T_Id.Value ' If present = modification Then ' modification = modification + 1 'Range("A" & modification) = Me.T_Id.Value 'Range("B" & modification) = Me.T_Designation.Value End If Next i End With End If End Sub
        1. @yg_be

          Hola yg_be,

          el msgBox después del if no funciona y antes del if sí funciona

          Private Sub b_modif_Click() Dim i As Long, modif As String, present As String If MsgBox("¿Confirma la modificación?", vbYesNo, "Confirmación de modificación") = vbYes Then With ThisWorkbook.Sheets("Electrique") For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1 If .Range("A" & i).Value = Me.T_Id.Value Then MsgBox ("modificación confirmada")
        2. Colaborador
          @mzouali

          quizás agregar antes del primer "end if"

          else msgbox .Range("A" & i).Value & "|" & Me.T_Id.Value

          Esto debería mostrar los valores comparados y confirmar que son diferentes.

        3. @yg_be

          sí, efectivamente, son diferentes

          aquí está el resultado en bucle 9|1 luego 8|1 7|1 6|1 5|1 4|1 3|1 2|1 1|1 :

      4. Hola,

        vuelvo a ponerme en contacto para resolver el mismo problema del botón modificar, tuve un desplazamiento que me impidió avanzar.

        resultado: cuando los dos valores Range("A" & i).Value y Me.T_Id.Value son iguales, ¡continúa comparando sin modificar el valor de la celda!

        Private Sub b_modif_Click() Dim i As Long, modification As String, present As String With ThisWorkbook.Sheets("Electrique") For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1 If Range("A" & i).Value = Me.T_Id.Value Then MsgBox .Range("A" & i).Value & "|" & Me.T_Id.Value Range("B" & i) = Me.T_Designation.Value Else MsgBox .Range("A" & i).Value & "|" & Me.T_Id.Value End If Next i End With 'End If End Sub

        pasa por la igualdad y sigue comparando

        hasta llegar arriba

        ¿tienes alguna idea sobre cómo modificar el contenido de una celda?

        te agradezco de antemano

        1. Colaborador

          lo más interesante es que lograste hacer dos msgbox que no te permiten diferenciar las dos condiciones.

      5. te agradezco por tus comentarios, he mantenido solo el primer msgBox y no se muestra nada

         With ThisWorkbook.Sheets("Electrique") For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1 If Range("A" & i).Value = Me.T_Id.Value Then MsgBox .Range("A" & i).Value & "|" & Me.T_Id.Value Range("B" & i) = Me.T_Designation.Value Else 'MsgBox .Range("A" & i).Value & "|" & Me.T_Id.Value
        1. Colaborador

          intenta en su lugar:

          If Range("A" & i).Value = Me.T_Id.Value Then MsgBox .Range("A" & i).Value & " = " & Me.T_Id.Value Range("B" & i) = Me.T_Designation.Value Else MsgBox .Range("A" & i).Value & " <> " & Me.T_Id.Value
      6. Hola yg_be

        ¿qué quieres decir con #21?

        Por fin logré modificar la tabla a través de un botón de modificar:

        aquí está el código:

         With ThisWorkbook.Sheets("Electrique") ' defino la hoja en la que trabajo For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1 'un bucle que trata todas las filas de mi tabla. If Cells(i, 1) = Me.T_Id.Text Then 'comparación de todas las filas de mi primera columna con el valor del textbox llamado " T_Id", si son iguales, entonces selecciona la celda que está a su derecha y modifica el valor de esta celda por el valor del T_Designation " textbox del userform". Cells(i, 1).Select Exit For End If Next i ActiveCell.Offset(0, 1) = Me.T_Designation.Value ' modificación 

        Te agradezco infinitamente yr_be

        1. Colaborador

          #21, es la respuesta hecha el 27 de julio de 2022 a las 21:18.