La méthode 'Value' de l'objet 'Range' a échoué
Bonjour à tous,
Dans un fichier de suivi, j'ai besoin d'un tableau avec des données sur les salariés.
Comme ce fichier sera utilisé par des personnes ne connaissant pas excel il est important qu'il soit le plus simple d'utilisation possible.
Les utilisateurs devront donc utiliser des userforms pour ajouter des données afin de ne pas mettre de donnée au mauvais endroit.
J'ai ce code suivant qui ajoute un salarié à la feuille "Agents" :
Private Sub CommandButton1_Click()
Dim ws As Worksheet
Dim i As Integer
Dim nomprenom As String
Dim answer As String
Dim txt As String
Dim Job As String
Dim Agence As String
Dim Nom As String
Dim Prenom As String
Dim D As Double
Set ws = Sheets("Agents")
Nom = TextNom.Value
Prenom = TextPrenom.Value
Agence = ComboBoxAgence.Value
Job = ComboBoxFonction.Value
'MsgBox (Agence)
nomprenom = TextNom.Value & " " & TextPrenom.Value
nomprenom = UCase(nomprenom)
'MsgBox ("Contrôle 1")
'On contrôle les données insérées
If nomprenom = " " Then
MsgBox ("Veuillez rentrer un nom/prénom")
Exit Sub
End If
If Job = "" Then
MsgBox ("Veuillez rentrer une fonction")
Exit Sub
End If
If Agence = "" Then
MsgBox ("Veuillez rentrer un employeur")
Exit Sub
End If
If Not IsNumeric(TextBoxD.Value) Then
MsgBox ("La valeur D n'est pas correcte")
Exit Sub
End If
D = CDbl(TextBoxD.Value)
'MsgBox ("Contrôle 2")
'Checker si l'agent est déja là
i = 1
Do While ws.Cells(i, 3).Value <> nomprenom And ws.Cells(i, 3).Value <> ""
i = i + 1
Loop
If ws.Cells(i, 3).Value = nomprenom Then
'MsgBox ("L'agent est déjà suivi")
Exit Sub
End If
'MsgBox ("Contrôle 3")
'Tout est OK donc i contient la première ligne vide
'On demande une confirmation
txt = "Ajouter le suivi du collaborateur ?"
txt = txt & Chr(13) & Chr(10) & Chr(13) & Chr(10)
txt = txt & "Agent : " & nomprenom
txt = txt & Chr(13) & Chr(10)
txt = txt & "Fonction : " & Job
txt = txt & Chr(13) & Chr(10)
txt = txt & "Agence : " & Agence
txt = txt & Chr(13) & Chr(10)
txt = txt & "D: " & D
answer = MsgBox(txt, vbQuestion + vbYesNo + vbDefaultButton2, "Alerte")
If answer = vbYes Then
'Si l'utilisateur accepte
ActiveWorkbook.Sheets("Agents").Unprotect
'Après déverouillage on rajoute une à une les informations
'Repère du bug ___________
ActiveWorkbook.Sheets("Agents").Range("A" & i).Value = Nom
ActiveWorkbook.Sheets("Agents").Range("B" & i).Value = Prenom
ActiveWorkbook.Sheets("Agents").Range("E" & i).Value = Agence
ActiveWorkbook.Sheets("Agents").Range("F" & i).Value = Job
ActiveWorkbook.Sheets("Agents").Range("G" & i).Value = D
'Par défaut autres cases sont numériques et sont vides (0)
ActiveWorkbook.Sheets("Agents").Range("H" & i & ":L" & i).Value = 0
'On tri les données ensuite
On Error Resume Next
ActiveWorkbook.Worksheets("Agents").ListObjects("TblAgents").Sort.SortFields. _
Clear
ActiveWorkbook.Worksheets("Agents").ListObjects("TblAgents").Sort.SortFields. _
Add2 Key:=Range("TblAgents[[#All],[Nom Prénom]]"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Agents").ListObjects("TblAgents").Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
On Error GoTo 0
'Fin du tri
ActiveWorkbook.Sheets("Agents").Protect
MenuWorker.Show
'On reviens au menu précédent
End If
End SubLe problème c'est que parfois tout se passe bien et puis une fois sur deux, j'ai une erreur :
Le fichier se ferme quasiment instantanément après.
Les fois où j'ai pu cliquer sur débogage, la ligne concernée était une des lignes en dessous du repère ajouté en commentaire.
Ce n'est pas toujours la même.
Ce que je ne comprend pas c'est pourquoi ce code fonctionne parfois et parfois non.
J'ai remplacé ws par ActiveWorkbook.Sheets... pour voir si explicité changerai le problème mais non.
Lorsque j'ai cette erreur et que j'arrive à entrer dans le Débogage avant que cela ne crash, je vois bien que mes variables String sont correctement remplies.
Cela fait quelques heures hier et ce matin que je planche dessus sans comprendre pourquoi cela plante.
Si quelqu'un à déjà vu ce problème cela me sauverai.
Merci d'avance pour toute aide que vous pouvez m'offrir.
Bonjour,
- Est-ce le code se trouve dans le fichier où vous avez le feuille Agents ?
- Est-ce dans le tableau "TblAgents" que vous complétez les données ?
- est-ce que votre bouton command1 est placé sur la feuille ou dans une userform ?
- J'éviterais d'utiliser txt comme variable sachant que txt est aussi une extension de fichier (et ne prenez pas "Texte" non plus)
Pour le reste je regarde mais sans le fichier c'est moins facile
Merci de ce retour,
Le code est dans le même excel dans un userform nommé addWorker.
Je rajoute des données à la ligne juste après TblAgents de sorte que les formules de certaines cases se complètent seules.
Le CommandButton est dans le userform addWorker.
Dans mon fichier pour l'instant j'ai ici 57 Agents.
J'ai du modifier quelques nom de variables dans l'exemple.
Je vais remplacer txt par myText.
Je peux essayer d'extraire uniquement cette feuille et de supprimer les données personnelles pour joindre un fichier.
re
Ok pour "mytxt"
Je peux essayer d'extraire uniquement cette feuille et de supprimer les données personnelles pour joindre un fichier.
Sachez que vous pouvez anonymiser avec cet utilitaire -> https://www.excel-pratique.com/fr/utilitaires/anonymisation-donnees
Edit : essayez votre code comme ceci
Private Sub CommandButton1_Click()
Dim ws As Worksheet
Dim i As Integer, lig as integer
Dim nomprenom As String
Dim mytxt As String
Dim Job As String
Dim Agence As String
Dim Nom As String
Dim Prenom As String
Dim D As Double
Nom = TextNom.Value
Prenom = TextPrenom.Value
Agence = ComboBoxAgence.Value
Job = ComboBoxFonction.Value
'MsgBox (Agence)
nomprenom = TextNom.Value & " " & TextPrenom.Value
nomprenom = UCase(nomprenom)
'MsgBox ("Contrôle 1")
'On contrôle les données insérées
If nomprenom = vbNullString Then
MsgBox ("Veuillez rentrer un nom/prénom")
Exit Sub
End If
If Job = vbNullString Then
MsgBox ("Veuillez rentrer une fonction")
Exit Sub
End If
If Agence = vbNullString Then
MsgBox ("Veuillez rentrer un employeur")
Exit Sub
End If
If Not IsNumeric(TextBoxD.Value) Then
MsgBox ("La valeur D n'est pas correcte")
Exit Sub
End If
D = CDbl(TextBoxD.Value)
Set ws = ThisWorkbook.Sheets("Agents")
'Checker si l'agent est déja là
On Error Resume Next
i = WorksheetFunction.Match(nomprenon, ws.ListObjects("TblAgents").ListColumns(3),0)
If i > 0 Then MsgBox "L'agent est déjà suivi !": Exit Sub
On Error GoTo 0
mytxt = "Ajouter le suivi du collaborateur ?"
mytxt = mytxt & Chr(13) & Chr(10) & Chr(13) & Chr(10)
mytxt = mytxt & "Agent : " & nomprenom
mytxt = mytxt & Chr(13) & Chr(10)
mytxt = mytxt & "Fonction : " & Job
mytxt = mytxt & Chr(13) & Chr(10)
mytxt = mytxt & "Agence : " & Agence
mytxt = mytxt & Chr(13) & Chr(10)
mytxt = mytxt & "D: " & D
If MsgBox(mytxt, vbQuestion + vbYesNo + vbDefaultButton2, "Alerte") = vbYes Then
'Si l'utilisateur accepte
With ws
.Unprotect
With .ListObjects("TblAgents")
If .ListRows.Count = 0 Then
.ListRows.Add: i = 1
Else: .ListRows.Add: i = .ListRows.Count 'insérer à la dernière ligne
End If
.DataBodyRange(i, 1) = Nom
.DataBodyRange(i, 2) = Prenom
.DataBodyRange(i, 5).Value = Agence
.DataBodyRange(i, 6).Value = Job
.DataBodyRange(i, 7).Value = D
Union(.DataBodyRange(i, 8), .DataBodyRange(i, 13)) = 0 'Par défaut autres cases sont numériques et sont vides (0)
End With
End With
'On tri les données ensuite
On Error Resume Next
With ws.ListObjects("TblAgents")
.Sort.SortFields.Clear
.Sort.SortFields.Add2 Key:=Range("TblAgents[[#All],[Nom Prénom]]"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
With .Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
On Error GoTo 0
'Fin du tri
ws.Protect
MenuWorker.Show'On revient au menu précédent
End If
End SubNB : vous auriez pu mettre votre code de tri dans une macro séparée.
Si ok pensez à
Encore merci,
Dans ce code j'ai une erreur de compilation :
Apparemment, lorsque je place mon curseur dans la formule, l'argument 2 n'est pas en gras, signe qu'il ne serait pas "bien formalisé" ?
Contrairement au premier avant la virgule,
J'ai corrigé comme suit après avoir regardé la documentation
i = WorksheetFunction.Match(nomprenom, ws.ListObjects("TblAgents").ListColumns(3))Mais le problème persiste.
En mode pas à pas, c'est cet endroit qui fait fermer le fichier :
Else: .ListRows.Add: i = .ListRows.Count 'insérer à la dernière ligneD'ailleurs le problème n'est pas toujours là et j'ai remarqué que même ajouter des données à la main à la dernière ligne faisait planter le fichier parfois.
J'ai l'impression que le tableau ne peut pas s'agrandir mais sans savoir pourquoi/dans quels cas.
EDIT : Je n'ai pourtant aucune macro qui tourne sur les évènement de la feuille ni du classeur.
J'ai corrigé comme suit après avoir regardé la documentation
i = WorksheetFunction.Match(nomprenom, ws.ListObjects("TblAgents").ListColumns(3))
Hum... oui désolé. j'ai fait cela sans vérifier et j'étais parti avec la fonction FIND puis je n'ai pas corrigé.
J'ai amendé le code dans mon post précédent
Mais le problème persiste.
En mode pas à pas, c'est cet endroit qui fait fermer le fichier :
Il faudrait que je vois votre fichier pour analyser.
Soit vous l'anonymisez ou alors vous pouvez me le joindre en MP
Vous avez probablement un souci dans votre tableau structuré
Edit : dans votre code faites un peu le test en ajoutant ceci juste en dessous du IF MSGBOX..... then
Msgbox ws.ListObjects("TblAgents").listrows.count