Bonjour!
j’ai trouvé un code VBA qui permet de rechercher les erreurs dans un classeur et d’afficher ensuite une fenêtre qui liste les cellules en erreurs. Voici le lien très bien expliqué avec deux vidéos (je suis mauvais en VBA ^^):http://www.xlerateur.com/divers/2016/11/24/vba-ajouter-un-outil-de-recherche-derreur-5426/
Le souci est que cela ne fonctionne pas si on à des codes d’erreurs Excel classiques (#NUL!
#DIV/0!
#VALEUR!
#REF!
#NOM?
#NOMBRE!
#N/A
L’utilisateur ne scanne que le MOT “erreur” c’est bête car je trouve ça super ! SI on à un gros fichier pour s’assurer qu’il n’y à pas d’erreurs de formules liens ou autre.
Qui serai le regarder pour qu’en fait il scanne tous les classeurs et identifie les erreurs ( en indiquant la feuille , la ou les cellules ) ce que fait cet outil mais pas correctement …
Option Explicit
Sub AfficherUF_Erreur()
Dim Wsh As Worksheet
Dim RngErr As Range, Cel As Range
For Each Wsh In ActiveWorkbook.Worksheets
On Error Resume Next
Set RngErr = Wsh.Cells.SpecialCells(xlCellTypeFormulas, xlErrors)
If Err = 0 Then
For Each Cel In RngErr
UF_Erreurs.ListBoxErreurs.AddItem Choose((CLng(Cel.Value) - 1993) \ 7, _
"#NUL!", "#DIV/0!", "#VALEUR!", "#REF!", "#NOM?", "#NOMBRE!", "#N/A")
UF_Erreurs.ListBoxErreurs.List(UF_Erreurs.ListBoxErreurs.ListCount - 1, 1) = Wsh.Name
UF_Erreurs.ListBoxErreurs.List(UF_Erreurs.ListBoxErreurs.ListCount - 1, 2) = Cel.Address(False, False)
Next Cel: End If: Next Wsh
If UF_Erreurs.ListBoxErreurs.ListCount = 0 Then
MsgBox "Aucune cellule en erreur trouvée dans ce classeur", vbInformation, "Voir les erreurs"
Else: UF_Erreurs.Show 0: End If
End Sub
Option Explicit
Private Sub ListBoxErreurs_Click()
Dim L As Long
L = ListBoxErreurs.ListIndex
Application.Goto ActiveWorkbook.Worksheets(ListBoxErreurs.List(L, 1)).Range(ListBoxErreurs.List(L, 2))
End Sub
Bonjour.
Dans module1 :
Dans UF_Erreurs :VB:Option Explicit Sub AfficherUF_Erreur() Dim Wsh As Worksheet Dim RngErr As Range, Cel As Range For Each Wsh In ActiveWorkbook.Worksheets On Error Resume Next Set RngErr = Wsh.Cells.SpecialCells(xlCellTypeFormulas, xlErrors) If Err = 0 Then For Each Cel In RngErr UF_Erreurs.ListBoxErreurs.AddItem Choose((CLng(Cel.Value) - 1993) \ 7, _ "#NUL!", "#DIV/0!", "#VALEUR!", "#REF!", "#NOM?", "#NOMBRE!", "#N/A") UF_Erreurs.ListBoxErreurs.List(UF_Erreurs.ListBoxErreurs.ListCount - 1, 1) = Wsh.Name UF_Erreurs.ListBoxErreurs.List(UF_Erreurs.ListBoxErreurs.ListCount - 1, 2) = Cel.Address(False, False) Next Cel: End If: Next Wsh If UF_Erreurs.ListBoxErreurs.ListCount = 0 Then MsgBox "Aucune cellule en erreur trouvée dans ce classeur", vbInformation, "Voir les erreurs" Else: UF_Erreurs.Show 0: End If End Sub
VB:Option Explicit Private Sub ListBoxErreurs_Click() Dim L As Long L = ListBoxErreurs.ListIndex Application.Goto ActiveWorkbook.Worksheets(ListBoxErreurs.List(L, 1)).Range(ListBoxErreurs.List(L, 2)) End Sub
Ben si, je scanne les valeurs de cellules contenant des formules ! En général une formule dont une expression s'est tranformée en #REF! par exemple est elle même en erreur. Mais pour les constantes, il est possible d'ajouter une séquence supplémentaire très semblable à celle qui existe mais avec cette fois Set RngErr = Wsh.Cells.SpecialCells(xlCellTypeConstants, xlErrors)
Sub AfficherUF_Erreur()
Dim Wsh As Worksheet
Dim RngErr As Range, Cel As Range
For Each Wsh In ActiveWorkbook.Worksheets
On Error Resume Next
Set RngErr = Wsh.Cells.SpecialCells(xlCellTypeFormulas, xlErrors)
If Err = 0 Then
For Each Cel In RngErr
UF_Erreurs.ListBoxErreurs.AddItem Choose((CLng(Cel.Value) - 1993) \ 7, _
"#NUL!", "#DIV/0!", "#VALEUR!", "#REF!", "#NOM?", "#NOMBRE!", "#N/A")
UF_Erreurs.ListBoxErreurs.List(UF_Erreurs.ListBoxErreurs.ListCount - 1, 1) = Wsh.Name
UF_Erreurs.ListBoxErreurs.List(UF_Erreurs.ListBoxErreurs.ListCount - 1, 2) = Cel.Address(False, False)
Next Cel: End If
Err.Clear
Set RngErr = Wsh.Cells.SpecialCells(xlCellTypeConstants, xlErrors)
If Err = 0 Then
For Each Cel In RngErr
UF_Erreurs.ListBoxErreurs.AddItem Choose((CLng(Cel.Value) - 1993) \ 7, _
"#NUL!", "#DIV/0!", "#VALEUR!", "#REF!", "#NOM?", "#NOMBRE!", "#N/A")
UF_Erreurs.ListBoxErreurs.List(UF_Erreurs.ListBoxErreurs.ListCount - 1, 1) = Wsh.Name
UF_Erreurs.ListBoxErreurs.List(UF_Erreurs.ListBoxErreurs.ListCount - 1, 2) = Cel.Address(False, False)
Next Cel: End If
On Error GoTo 0: Next Wsh
If UF_Erreurs.ListBoxErreurs.ListCount = 0 Then
MsgBox "Aucune cellule en erreur trouvée dans ce classeur", vbInformation, "Voir les erreurs"
Else: UF_Erreurs.Show 0: End If
End Sub
Concrètement je voulais dire ça, même si je l'écrirais sûrement différemment tellement j'ai horreur des répétitions :
VB:Sub AfficherUF_Erreur() Dim Wsh As Worksheet Dim RngErr As Range, Cel As Range For Each Wsh In ActiveWorkbook.Worksheets On Error Resume Next Set RngErr = Wsh.Cells.SpecialCells(xlCellTypeFormulas, xlErrors) If Err = 0 Then For Each Cel In RngErr UF_Erreurs.ListBoxErreurs.AddItem Choose((CLng(Cel.Value) - 1993) \ 7, _ "#NUL!", "#DIV/0!", "#VALEUR!", "#REF!", "#NOM?", "#NOMBRE!", "#N/A") UF_Erreurs.ListBoxErreurs.List(UF_Erreurs.ListBoxErreurs.ListCount - 1, 1) = Wsh.Name UF_Erreurs.ListBoxErreurs.List(UF_Erreurs.ListBoxErreurs.ListCount - 1, 2) = Cel.Address(False, False) Next Cel: End If Err.Clear Set RngErr = Wsh.Cells.SpecialCells(xlCellTypeConstants, xlErrors) If Err = 0 Then For Each Cel In RngErr UF_Erreurs.ListBoxErreurs.AddItem Choose((CLng(Cel.Value) - 1993) \ 7, _ "#NUL!", "#DIV/0!", "#VALEUR!", "#REF!", "#NOM?", "#NOMBRE!", "#N/A") UF_Erreurs.ListBoxErreurs.List(UF_Erreurs.ListBoxErreurs.ListCount - 1, 1) = Wsh.Name UF_Erreurs.ListBoxErreurs.List(UF_Erreurs.ListBoxErreurs.ListCount - 1, 2) = Cel.Address(False, False) Next Cel: End If On Error GoTo 0: Next Wsh If UF_Erreurs.ListBoxErreurs.ListCount = 0 Then MsgBox "Aucune cellule en erreur trouvée dans ce classeur", vbInformation, "Voir les erreurs" Else: UF_Erreurs.Show 0: End If End Sub
Sub AfficherUF_Erreur()
Dim Wsh As Worksheet
For Each Wsh In ActiveWorkbook.Worksheets
On Error Resume Next
AjoutLbxErr Wsh.Cells.SpecialCells(xlCellTypeConstants, xlErrors), Wsh.Name
AjoutLbxErr Wsh.Cells.SpecialCells(xlCellTypeFormulas, xlErrors), Wsh.Name
On Error GoTo 0
Next Wsh
If UF_Erreurs.ListBoxErreurs.ListCount = 0 Then
MsgBox "Aucune cellule en erreur trouvée dans ce classeur", vbInformation, "Voir les erreurs"
Else: UF_Erreurs.Show 0: End If
End Sub
Private Sub AjoutLbxErr(ByVal RngErr As Range, ByVal NomFeuil As String)
Dim Cel As Range
For Each Cel In RngErr
UF_Erreurs.ListBoxErreurs.AddItem Choose((CLng(Cel.Value) - 1993) \ 7, _
"#NUL!", "#DIV/0!", "#VALEUR!", "#REF!", "#NOM?", "#NOMBRE!", "#N/A")
UF_Erreurs.ListBoxErreurs.List(UF_Erreurs.ListBoxErreurs.ListCount - 1, 1) = NomFeuil
UF_Erreurs.ListBoxErreurs.List(UF_Erreurs.ListBoxErreurs.ListCount - 1, 2) = Cel.Address(False, False)
Next Cel
End Sub
En fait dans certaines formules si le lien n'est plus bon par exemple (vers un fichier externe par exemple) il vient se mettre #REF exemple :Quelle formule avec #REF! pourrait bien ne pas valoir #REF! ???
oui c'est ça ^^ le si erreur évite d'avoir un fichier tout moche si on doit le donner. Je sais c'est con ce que je cherche !Oui mais que vaut la cellule avec cette formule alors ?
Ah oui, vu. SIERREUR devant évidemment.