In questo listato Sub OrdinaVAR()
Dim ws As Worksheet
Dim lookupRange As Range
Dim foundCell As Range
Dim rowIndex As Long
Dim i As Long
Dim azione As String
Dim sourceValues As Variant
Dim sourceFormats As Variant
Dim destRange As Range
Dim j As Integer
Dim cell As Range


Set ws = ThisWorkbook.Sheets("VAR")
Set lookupRange = ws.Range("G3:G52")

rowIndex = 3

With ws
    ' Ciclo principale attraverso le righe 3 a 52
    For i = 3 To 52
        ' Ottiene il valore di lookup dalla colonna H (8)
        Dim lookupValue As Variant
        lookupValue = .Cells(i, "H").Value ' H3:H52

        ' Definisce l'intervallo di destinazione nella riga corrente
        Set destRange = .Range("J" & rowIndex & ":O" & rowIndex)

        ' Verifica se ci sono celle unite e le scompatta
        If destRange.MergeCells Then
            destRange.UnMerge
        End If

        If Not IsEmpty(lookupValue) Then
            ' Cerca il valore di lookup nell'intervallo di ricerca
            Set foundCell = lookupRange.Find(What:=lookupValue, LookIn:=xlValues, LookAt:=xlWhole)

            If Not foundCell Is Nothing Then
                sourceValues = .Range("A" & foundCell.Row & ":F" & foundCell.Row).Value

                ' Verifica le dimensioni
                If UBound(sourceValues, 1) = destRange.Rows.Count And _
                   UBound(sourceValues, 2) = destRange.Columns.Count Then
                    destRange.Value = sourceValues
                Else
                    ' Gestisci la discrepanza
                    Debug.Print "Mismatch nelle dimensioni per rowIndex " & rowIndex
                    destRange.ClearContents
                End If

                ' Copia i formati
                sourceFormats = .Range("A" & foundCell.Row & ":F" & foundCell.Row).NumberFormat
                If IsArray(sourceFormats) Then
                    For j = 1 To UBound(sourceFormats, 2)
                        On Error Resume Next
                        destRange.Cells(1, j).NumberFormat = sourceFormats(1, j)
                        If err.Number <> 0 Then
                            destRange.Cells(1, j).NumberFormat = "General"
                            err.Clear
                        End If
                        On Error GoTo 0
                    Next j
                Else
                    ' Se sourceFormats è una stringa, applica lo stesso formato a tutte le celle
                    On Error Resume Next
                    destRange.NumberFormat = sourceFormats
                    If err.Number <> 0 Then
                        destRange.NumberFormat = "General"
                        err.Clear
                    End If
                    On Error GoTo 0
                End If
            Else
                ' Se non trovato, svuota l'intervallo di destinazione
                destRange.ClearContents
            End If
        Else
            ' Se il valore di lookup è vuoto, svuota l'intervallo di destinazione
            destRange.ClearContents
        End If

        ' Determina l'azione da eseguire basata sulla colonna I
        Select Case UCase(Trim(.Cells(i, "I").Value))
            Case "B"
                azione = "ARROTONDA_1000"
            Case "C"
                azione = "ARROTONDA_4"
            Case "D"
                azione = "ARROTONDA_100"
            Case Else
                azione = "NESSUNA"
        End Select

        ' Esegue l'azione appropriata
        Select Case azione
            Case "ARROTONDA_1000", "ARROTONDA_100", "ARROTONDA_4"
                Dim roundFactor As Variant
                Dim minValue As Variant
                Select Case azione
                    Case "ARROTONDA_1000"
                        roundFactor = 1000
                        minValue = 1000
                    Case "ARROTONDA_100"
                        roundFactor = 100
                        minValue = 100
                    Case "ARROTONDA_4"
                        roundFactor = 4
                        minValue = 0 ' Nessun minimo
                End Select

                For Each cell In destRange
                    If IsNumeric(cell.Value) Then
                        If azione <> "ARROTONDA_4" Then
                            If cell.Value > minValue Then
                                cell.Value = Application.WorksheetFunction.MRound(cell.Value, roundFactor)
                            End If
                        Else
                            cell.Value = Application.WorksheetFunction.Round(cell.Value, roundFactor)
                        End If
                    End If
                Next cell
            Case "NESSUNA"
                ' Non eseguire alcuna operazione
        End Select

        ' Incrementa l'indice di riga di destinazione per la prossima iterazione
        rowIndex = rowIndex + 1

        ' Verifica che rowIndex non superi il numero di righe del foglio
        If rowIndex > ws.Rows.Count Then
            MsgBox "Riga di destinazione supera il limite del foglio.", vbCritical
            Exit Sub
        End If
    Next i

    ' Copia i valori e i formati da F53:F60 a O53:O60
    .Range("O53:O60").Value = .Range("F53:F60").Value
    For j = 1 To .Range("F53:F60").Rows.Count
        On Error Resume Next
        .Range("O53:O60").Cells(j, 1).NumberFormat = .Range("F53:F60").Cells(j, 1).NumberFormat
        If err.Number <> 0 Then
            .Range("O53:O60").Cells(j, 1).NumberFormat = "General"
            err.Clear
        End If
        On Error GoTo 0
    Next j

    ' Aggiorna i dati di sicurezza (backup)
    .Range("R22:V24").Value = .Range("B22:F24").Value
    .Range("B61:F68").Value = .Range("B53:F60").Value
End With

Application.CutCopyMode = False
End Sub mi compare l'errore 1004 impossibile trovare l aproprieta' round per la classe workshhetfunction alla riga cell.Value = Application.WorksheetFunction.Round(cell.Value, roundFactor). Come correggere ?