VBA

Resuelto
Jenni -  
 Jenni -

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. jordane45 Mensajes publicados 30427 Fecha de registro   Estado Moderador Última intervención   4 832
     

    Hola,

    Para empezar

    Set onglet = Worksheets("CANDIDATS - RH")

    .
    Atentamente,
    Jordane

    1
    1. Jenni
       

      ¡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? ;)

      0
  2. thev Mensajes publicados 2011 Fecha de registro   Estado Miembro Última intervención   724
     

    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
  3. thev Mensajes publicados 2011 Fecha de registro   Estado Miembro Última intervención   724
     
    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
    0
    1. Jenni
       

      ¡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.

      0
  4. thev Mensajes publicados 2011 Fecha de registro   Estado Miembro Última intervención   724
     

    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.


    0
  5. Jenni
     

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

    0
  6. Jenni
     

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

    0
  7. thev Mensajes publicados 2011 Fecha de registro   Estado Miembro Última intervención   724
     

    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/


    0
    1. Jenni
       

      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!

      0
  8. thev Mensajes publicados 2011 Fecha de registro   Estado Miembro Última intervención   724
     

    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 

    0
    1. Jenni
       

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

      0
  9. Jenni
     

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

    0
  10. thev Mensajes publicados 2011 Fecha de registro   Estado Miembro Última intervención   724
     

    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 

    0
    1. Jenni
       

      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!

      0
    2. Jenni
       

      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.

      0
    3. thev Mensajes publicados 2011 Fecha de registro   Estado Miembro Última intervención   724 > 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 
      0
    4. Jenni > thev Mensajes publicados 2011 Fecha de registro   Estado Miembro Última intervención  
       

      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!

      0
    5. thev Mensajes publicados 2011 Fecha de registro   Estado Miembro Última intervención   724 > Jenni
       

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

      0