VBA
ResueltoJenni -
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
-
Hola,
Para empezar
Set onglet = Worksheets("CANDIDATS - RH")
.
Atentamente,
Jordane -
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
-
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 -
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.
-
Efectivamente, faltaba una s, pero ahora la aplicación se cierra automáticamente después de mostrar el mensaje de error.
-
Finalmente, después de varios intentos, parece funcionar; otras veces no, todo se cierra y no entiendo por qué.
-
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/
-
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!
-
-
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
-
¿Y es realmente complejo si quiero mostrar la información de un candidato seleccionado en mi formulario para poder modificarlas posteriormente?
-
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
-
-
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 SubMerci encore.
-
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 -
-
-