Please try the following modified code. The range that needs to be processed is put into an array, and everything is done in memory. Only at the end of the code does it immediately drop the processed result:
Sub Decr()
Dim sh As Worksheet, i As Long, j As Long, rng As Range, arr As Variant, counter As Integer
Dim stringaCriptata As String, stringaDecriptata As String, carattere_da_decriptare As String
Dim carattere_da_sostituire As String, lunghezza As Long
Set sh = ActiveSheet
Set rng = sh.Range("A1:BK460")
arr = rng.Value2 'place the range in an array for faster processing
For i = 1 To UBound(arr) 'iterate between the array rows
For j = 1 To UBound(arr, 2) 'iterate between the array columns
stringaDecriptata = ""
lunghezza = Len(arr(i, j))
For counter = 1 To lunghezza
stringaCriptata = arr(i, j)
carattere_da_decriptare = Mid(arr(i, j), counter, 1)
carattere_da_sostituire = Chr(Asc(carattere_da_decriptare) - 10)
stringaDecriptata = stringaDecriptata & carattere_da_sostituire
Next counter
arr(i, j) = stringaDecriptata 'place the decrypted string back in the array element
Next j
Next i
'drop the processed array result, at once:
rng.Value2 = arr
End Sub
It takes time to iterate through each range cell, and it takes considerably longer to put back each processed value individually.
Then, it is wise to develop the practice of declaring all relevant variables. Option Explicit should be placed on top of the module in order to allow VBA to assist you if you forget it.