Private Sub Worksheet_Calculate()
If Not CommandButton1.Caption Like "Annuler*" Then Exit Sub
Dim sep$, c As Range, t, i%, flag As Boolean, x$, j%, xtemp$, k%
Dim cf$, nblig&, nbcol%, y As Variant, z$
sep = "=()+-*/^&!" & Application.International(xlListSeparator)
Application.ScreenUpdating = False
Cells.ClearComments 'RAZ
For Each c In Me.UsedRange
  If c.HasFormula Then
    t = c.FormulaLocal
    For i = Len(t) To 2 Step -1
      If Not flag Then If Mid(t, i, 1) = """" Then flag = True: i = i - 1
      If flag Then If Mid(t, i, 1) = """" Then flag = False
      If Not flag And InStr(sep, Mid(t, i + 1, 1)) Then
        x = ""
        For j = i To 1 Step -1
          If InStr(sep, Mid(t, j, 1)) Then
            xtemp = Mid(t, j + 1, i - j)
            If TypeName(Evaluate(xtemp)) = "Range" Then _
              If Evaluate(xtemp).Count = 1 Then x = xtemp
            If Mid(t, j, 1) = "!" Then
              If Mid(t, j - 4, 5) = "#REF!" Then i = j - 4: GoTo 1 'si feuille supprimée
              If Mid(t, j - 5, 6) = "#REF'!" Then i = j - 5: GoTo 1 'd° autre classeur
              x = "" 'efface le x précédent
              For k = j - 1 To 2 Step -1
                If Mid(t, k, 1) = "\" Then 'autre classeur fermé
                  While Mid(t, k, 1) <> "'": k = k - 1: Wend
                  x = Mid(t, k, i - k + 1): j = k - 1
                  cf = Application.ConvertFormula(x, xlA1, xlR1C1)
                  nblig = 1: nbcol = 1
                  On Error Resume Next 'si la référence est un nom qui a été supprimé
                  nblig = ExecuteExcel4Macro("ROWS(" & cf & ")")
                  nbcol = ExecuteExcel4Macro("COLUMNS(" & cf & ")")
                  On Error GoTo 0
                  If nblig * nbcol > 1 Then i = j: GoTo 1
                  y = ExecuteExcel4Macro(cf)
                  z = CStr(y)
                  If IsNumeric(y) Then z = UCase(z) 'pour les valeurs logiques
                  If IsError(y) Then z = "<" & z & ">"
                  GoTo 2
                Else
                  xtemp = Mid(t, k, i - k + 1)
                  If TypeName(Evaluate(xtemp)) = "Range" Then _
                    If Evaluate(xtemp).Count = 1 Then x = xtemp: j = k - 1
                End If
              Next k
            End If
            If x <> "" Then
              y = Evaluate(x): z = Evaluate(x).Text
2             z = IIf(IsNumeric(y) Or IsError(y), z, """" & z & """")
              t = Left(t, j) & z & Mid(t, i + 1)
            End If
            i = j
            Exit For
          End If
        Next j
      End If
1   Next i
    Me.Activate
    c.AddComment t: c.Comment.Shape.TextFrame.AutoSize = True: c.Comment.Visible = True
  End If
Next c
End Sub