VBA

Resuelto

Con copia de una macro que funciona bien, mi formulario se completa correctamente, pero completa la pestaña 1 de mi libro. Sin embargo, tengo varias hojas en mi libro Excel y intento completar una tabla llamada Liste_candidat en la hoja que se llama Sheet1 (CANDIDATS). He hecho varios intentos cambiando las variables en mi código, pero siempre hay algo que no funciona. ¿Alguien podría ayudarme?

¡Gracias de antemano!

Private Sub BtAjouter_Click() Dim onglet As Worksheet Dim derniere_ligne As Long Dim No As Long Set onglet = Worksheets(CANDIDATS - RH) derniere_ligne = onglet.Cells(Rows.Count, 1).End(xlUp).Row If dernere_ligne = 1 Then No = 1 Else No = onglet.Cells(derniere_ligne, 1) + 1 End If With onglet .Cells(derniere_ligne + 1, 1) = No .Cells(derniere_ligne + 1, 2) = tbxNom .Cells(derniere_ligne + 1, 3) = tbxCourriel .Cells(derniere_ligne + 1, 4) = TbxTel .Cells(derniere_ligne + 1, 5) = TbxVille .Cells(derniere_ligne + 1, 6) = TbxSecteur .Cells(derniere_ligne + 1, 7) = BoxChoix1 .Cells(derniere_ligne + 1, 8) = BoxChoix2 .Cells(derniere_ligne + 1, 9) = BoxChoix3 .Cells(derniere_ligne + 1, 10) = BoxEntretien .Cells(derniere_ligne + 1, 11) = TbxDate .Cells(derniere_ligne + 1, 12) = TbxDoc .Cells(derniere_ligne + 1, 13) = BoxStatut .Cells(derniere_ligne + 1, 14) = TbxQualification .Cells(derniere_ligne + 1, 15) = TbxQuestionnaire .Cells(derniere_ligne + 1, 16) = TbxRemarque .Cells(derniere_ligne + 1, 17) = BoxDispo End With End Sub

10 respuestas

  1. Por terminar, por si acaso, código para la eliminación

     Private Sub BtSupprimer_Click() Dim i As Long 'búsqueda del índice de fila en la tabla a partir del valor de la Listbox (nº) With [Liste_candidats].ListObject i = 0 On Error Resume Next i = Application.Match(ListBox1.Value, .ListColumns(1).DataBodyRange, 0) On Error GoTo 0 If i = 0 Then MsgBox "aucuna fila para eliminar": Exit Sub 'eliminación .ListRows(i).Delete 'cargado de Listbox ListBox1.Clear If .ListRows.Count > 0 Then ListBox1.List = .DataBodyRange.Value End With End Sub 
    1. Non. a continuación un ejemplo de código:

      Option Explicit Private Sub UserForm_Initialize() ListBox1.ColumnCount = 2 With [Liste_candidats].ListObject If .ListRows.Count > 0 Then ListBox1.List = .DataBodyRange.Value End With End Sub Private Sub ListBox1_Click() Dim i As Long With [Liste_candidats].ListObject 'búsqueda del índice de fila en la tabla a partir del valor de la Listbox (no) i = Application.Match(ListBox1.Value, .ListColumns(1).DataBodyRange, 0) 'mostrar fila seleccionada tbxNom = .ListColumns(2).DataBodyRange(i) tbxCourriel = .ListColumns(3).DataBodyRange(i) TbxTel = .ListColumns(4).DataBodyRange(i) TbxVille = .ListColumns(5).DataBodyRange(i) TbxSecteur = .ListColumns(6).DataBodyRange(i) BoxChoix1 = .ListColumns(7).DataBodyRange(i) BoxChoix2 = .ListColumns(8).DataBodyRange(i) BoxChoix3 = .ListColumns(9).DataBodyRange(i) BoxEntretien = .ListColumns(10).DataBodyRange(i) TbxDate = .ListColumns(11).DataBodyRange(i) TbxDoc = .ListColumns(12).DataBodyRange(i) BoxStatut = .ListColumns(13).DataBodyRange(i) TbxQualification = .ListColumns(14).DataBodyRange(i) TbxQuestionnaire = .ListColumns(15).DataBodyRange(i) TbxRemarque = .ListColumns(16).DataBodyRange(i) BoxDispo = .ListColumns(17).DataBodyRange(i) End With End Sub Private Sub BtAjouter_Click() Dim ligne As ListRow Dim i As Long, no As Long 'inserción de fila With [Liste_candidats].ListObject Set ligne = .ListRows.Add: i = ligne.Index 'añadir fila al final de la tabla no = Application.Max(.ListColumns(1).DataBodyRange.Value) + 1 'calcular número .ListColumns(1).DataBodyRange(i) = no End With 'actualizar la tabla maj_tableau i End Sub Private Sub BtModifier_Click() Dim i As Long 'búsqueda del índice de fila en la tabla a partir del valor de la Listbox (no) With [Liste_candidats].ListObject i = 0 On Error Resume Next i = Application.Match(ListBox1.Value, .ListColumns(1).DataBodyRange, 0) On Error GoTo 0 If i = 0 Then MsgBox "aucune ligne à modifier": Exit Sub End With 'actualizar la tabla maj_tableau i End Sub Private Sub maj_tableau(i As Long) Dim ctrl As Control With [Liste_candidats].ListObject 'relleno de la tabla .ListColumns(2).DataBodyRange(i) = tbxNom .ListColumns(3).DataBodyRange(i) = tbxCourriel .ListColumns(4).DataBodyRange(i) = TbxTel .ListColumns(5).DataBodyRange(i) = TbxVille .ListColumns(6).DataBodyRange(i) = TbxSecteur .ListColumns(7).DataBodyRange(i) = BoxChoix1 .ListColumns(8).DataBodyRange(i) = BoxChoix2 .ListColumns(9).DataBodyRange(i) = BoxChoix3 .ListColumns(10).DataBodyRange(i) = BoxEntretien .ListColumns(11).DataBodyRange(i) = TbxDate .ListColumns(12).DataBodyRange(i) = TbxDoc .ListColumns(13).DataBodyRange(i) = BoxStatut .ListColumns(14).DataBodyRange(i) = TbxQualification .ListColumns(15).DataBodyRange(i) = TbxQuestionnaire .ListColumns(16).DataBodyRange(i) = TbxRemarque .ListColumns(17).DataBodyRange(i) = BoxDispo 'carga Listbox ListBox1.List = .DataBodyRange.Value End With '// reinicio de los textboxes Para Each ctrl In Me.Controls If TypeOf ctrl Is MSForms.TextBox Then ctrl = Empty Next ctrl End Sub 

      1. Wow, les agradezco muchísimo, ¡funciona de nuevo maravillosamente! He estado en este proyecto durante varias semanas intentando solo encontrar una solución, pero su ayuda me ha permitido finalmente iniciar este proyecto. ¡Gracias de nuevo y buena noche!

      2. Tengo una última pregunta, intento obtener el dato ingresado en el cuadro de texto tbxNom para pegarlo en mi código que envía un correo, pero me falta algo.

        Sub EnvoyerCourrielNouveauCandidat() Dim LeMail As Variant Set LeMail = CreateObject("Outlook.Application") With LeMail.CreateItem(olMailItem) .Subject = "Séquence de recrutement - Nouveau candidat ajouté" .To = .htmlbody = "Bonjour" & ",<br><br>" & _ "Un candidat a été ajouté :" & "<br><br>" & _ ".FrmCandidats.tbxNom.Value" & "<br><br>" & _ "Belle journée!" .send End With Range("E6").Select End Sub

        Merci encore.

      3. @Jenni

        Probar este código

         Sub EnvoyerCourrielNouveauCandidat() Dim OlkApp As Object Set OlkApp = CreateObject("Outlook.Application") With OlkApp.CreateItem(0) .Subject = "Séquence d'embauche - Nouveau candidat ajouté" .To = .HTMLBody = "Bonjour" & ",<br><br>" & _ "Un candidat a été ajouté :" & "<br><br>" & _ Me.FrmCandidats.tbxNom.Value & "<br><br>" & _ "Belle journée!" .Send End With Range("E6").Select End Sub 
      4. @thev

        He tenido que poner Me.FrmCandidats.tbxNom.Value entre comillas, de lo contrario indicaba Uso incorrecto de la palabra clave Me y aquí está el resultado:

        Hola,

        Se ha añadido un candidato :

        Me.FrmCandidats.tbxNom.Value

        ¡Que tengas un buen día!

      5. @Jenni

        Ponga su procedimiento EnviarCorreo en el código de su UserForm o reemplace Me por el nombre de su UserForm.

    2. ¿Y es realmente complejo si quiero mostrar la información de un candidato seleccionado en mi formulario para poder modificarlas posteriormente?

      1. Si quieres insertar, por ejemplo, un ListBox para visualizar los candidatos, debes usar entonces la propiedad List en tiempo de ejecución.

        A continuación, código que muestra en un ListBox los números y nombres de los candidatos

        Option Explicit Private Sub UserForm_Initialize() ListBox1.ColumnCount = 2 With [Liste_candidats].ListObject If .ListRows.Count > 0 Then ListBox1.List = .DataBodyRange.Value End With End Sub Private Sub BtAjouter_Click() Dim ligne As ListRow Dim i As Long, no As Long Dim ctrl As Control With [Liste_candidats].ListObject Set ligne = .ListRows.Add: i = ligne.Index 'agregar fila al final de la tabla no = Application.Max(.ListColumns(1).DataBodyRange.Value) + 1 'calcular número .ListColumns(1).DataBodyRange(i) = no .ListColumns(2).DataBodyRange(i) = tbxNom .ListColumns(3).DataBodyRange(i) = tbxCourriel .ListColumns(4).DataBodyRange(i) = TbxTel .ListColumns(5).DataBodyRange(i) = TbxVille .ListColumns(6).DataBodyRange(i) = TbxSecteur .ListColumns(7).DataBodyRange(i) = BoxChoix1 .ListColumns(8).DataBodyRange(i) = BoxChoix2 .ListColumns(9).DataBodyRange(i) = BoxChoix3 .ListColumns(10).DataBodyRange(i) = BoxEntretien .ListColumns(11).DataBodyRange(i) = TbxDate .ListColumns(12).DataBodyRange(i) = TbxDoc .ListColumns(13).DataBodyRange(i) = BoxStatut .ListColumns(14).DataBodyRange(i) = TbxQualification .ListColumns(15).DataBodyRange(i) = TbxQuestionnaire .ListColumns(16).DataBodyRange(i) = TbxRemarque .ListColumns(17).DataBodyRange(i) = BoxDispo ListBox1.List = .DataBodyRange.Value End With '// reinicialización de los textbox For Each ctrl In Me.Controls If TypeOf ctrl Is MSForms.TextBox Then ctrl = Empty Next ctrl End Sub 

        1. ¡Maravilloso! ¡Funciona perfectamente! Muchas gracias a ustedes. :)

      2. Verifique que su tabla "Liste_candidats" no se esté usando en la propiedad RowSource de un Combobox o ListBox (esta propiedad solo puede usarse para una tabla no modificada en tiempo de ejecución)

        Si no, adjunte un archivo anonimizado a través de https://www.cjoint.com/


        1. Sí, eso es correcto. He insertado una lista para poder visualizar los candidatos ya añadidos y poder modificarlos más tarde, así que entiendo que no puedo hacer eso de esa manera.

          Continuaré viendo cómo hacer para los siguientes pasos. Al menos, la función de añadir candidatos ya funciona ahora, ¡le agradezco mucho su valioso tiempo!

      3. Finalmente, después de varios intentos, parece funcionar; otras veces no, todo se cierra y no entiendo por qué.

        1. Efectivamente, faltaba una s, pero ahora la aplicación se cierra automáticamente después de mostrar el mensaje de error.

          1. Por otro lado, aparece un mensaje: "El método 'Add' del objeto 'ListRows' ha fallado.

            Si recibe este mensaje, es porque su tabla estructurada no se llama exactamente Lista_candidato. ¿Quizá tiene un espacio en blanco después de la t?

            Verifique el nombre de su tabla seleccionándolo por completo.


            1. Buenas noches,

              a continuación, código para su tabla estructurada Lista_candidat:

              Private Sub BtAjouter_Click()
              Dim ligne As ListRow
              Dim i As Long, no As Long
              With [Liste_candidat].ListObject
              Set ligne = .ListRows.Add: i = ligne.Index 'agregar fila al final de la tabla
              no = Application.Max(.ListColumns(1).DataBodyRange.Value) + 1 'calcular número
              .ListColumns(1).DataBodyRange(i) = no
              .ListColumns(2).DataBodyRange(i) = tbxNom
              .ListColumns(3).DataBodyRange(i) = tbxCourriel
              .ListColumns(4).DataBodyRange(i) = TbxTel
              .ListColumns(5).DataBodyRange(i) = TbxVille
              .ListColumns(6).DataBodyRange(i) = TbxSecteur
              .ListColumns(7).DataBodyRange(i) = BoxChoix1
              .ListColumns(8).DataBodyRange(i) = BoxChoix2
              .ListColumns(9).DataBodyRange(i) = BoxChoix3
              .ListColumns(10).DataBodyRange(i) = BoxEntretien
              .ListColumns(11).DataBodyRange(i) = TbxDate
              .ListColumns(12).DataBodyRange(i) = TbxDoc
              .ListColumns(13).DataBodyRange(i) = BoxStatut
              .ListColumns(14).DataBodyRange(i) = TbxQualification
              .ListColumns(15).DataBodyRange(i) = TbxQuestionnaire
              .ListColumns(16).DataBodyRange(i) = TbxRemarque
              .ListColumns(17).DataBodyRange(i) = BoxDispo
              End With
              End Sub
              1. ¡Oh wow, muchas gracias!

                Pero aparece un mensaje: "El método 'Add' del objeto 'ListRows' ha fallado.

                He investigado para tratar de entenderlo, pero no logro hacerlo.

            2. Moderador

              Hola,

              Para empezar

              Set onglet = Worksheets("CANDIDATS - RH")

              .
              Atentamente,
              Jordane

              1. ¡Claro! Ya no veía claro, parece que sí. ¡Muchas gracias!

                Y si quiero que la información se registre en mi tabla estructurada llamada Lista_candidato, ¿también sabes cómo hacerlo? ;)