Condividi tramite

Dividere le cifre di una colonna per 100

Anonimo
2016-02-04T09:35:46+00:00

Buongiorno a tutti, sono riuscito a creare la sottoelencata routine che mi divide le cifre di una colona per 100.

Attualmente ho il problema che il codice mi  divide sempre le cifre per 100della colonna ogniqualvolta premo sul pulsante di comando dal quale lancio la routine.

Ora ho inserito un Msgbox ma non è l'obiettivo voluto, cioè mi capita di dover inserire le cifre nel foglio di lavoro in giornate diverse e quando eseguo il codice  mi divide tutte le cifre (ma così non dovrebbe essere).

Mi spiego meglio: desidero poter fare in modo che il codice, se lanciato più volte, mi divida solo le cifre che fino ad allora non sono state divise per 100.

Spero di essere stato chiaro e comprensibile.


Public Sub Trasforma_cifre()

Dim i As Range

Application.Calculation = xlCalculationManual

Application.ScreenUpdating = False

If MsgBox("Vuoi effettuare la trasformazione delle Cifre con decimali?", vbInformation + vbYesNo + vbDefaultButton2) = vbNo Then

   Exit Sub

Else

    For Each i In Range("c2", Range("c2").End(xlDown))

        i = i / 100

    Next

Application.Calculation = xlCalculationAutomatic

Application.ScreenUpdating = True

End If

End Sub

Ciao Nicola.

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2016-02-04T20:10:57+00:00

Ciao Nicola,

Ciao Norman, grazie, benissimo il tuo codice, un'ultima considerazione, ho notato che nella divisione di un numero

intero tipo 784500 il tuo codice mi da 7845,00.

E' possibile visualizzarlo cosi: 7.845,00?

Credo di si! Prova:

'=========>>

Option Explicit

'--------->>

Public Sub Trasforma_cifre()

    Dim WB As Workbook

    Dim SH As Worksheet

    Dim Rng As Range, rCell As Range

    Dim LRow As Long, i As Long

    Dim CalcMode As Long

    If MsgBox("Vuoi effettuare la trasformazione delle " _

            & "Cifre con decimali?", _

              vbInformation + vbYesNo + vbDefaultButton2) = vbNo Then

        Exit Sub

    End If

    Set WB = ThisWorkbook

    Set SH = WB.Sheets("Foglio1")                 '<<===== Modifica

    On Error GoTo XIT

    With Application

        CalcMode = .Calculation

        .Calculation = xlCalculationManual

        .ScreenUpdating = False

    End With

    With SH

        LRow = LastRow(SH, .Columns("C:C"))

        Set Rng = .Range("C2:C" & LRow)

    End With

   For Each rCell In Rng.Cells

        With rCell

            If IsNumeric(.Value) Then

                If Not CBool(InStr(.Text, ",")) Then

                    .Value = .Value / 100

                    .NumberFormat = "#,##0.00"

                End If

            End If

        End With

    Next rCell

XIT:

    With Application

        .Calculation = CalcMode

        .ScreenUpdating = True

    End With

End Sub

'--------->>

Public Function LastRow(SH As Worksheet, _

                        Optional Rng As Range, _

                        Optional minRow As Long = 1)

    If Rng Is Nothing Then

        Set Rng = SH.Cells

    End If

    On Error Resume Next

    LastRow = Rng.Find(What:="*", _

                       after:=Rng.Cells(1), _

                       Lookat:=xlPart, _

                       LookIn:=xlFormulas, _

                       SearchOrder:=xlByRows, _

                       SearchDirection:=xlPrevious, _

                       MatchCase:=False).Row

    On Error GoTo 0

    If LastRow < minRow Then

        LastRow = minRow

    End If

End Function

'<<=========

===

Regards,

Norman

La risposta è stata utile?

0 commenti Nessun commento

18 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2016-02-04T11:12:05+00:00

    Alla fine, la divisione di valori da 100 non è un evento poco importante e penso che si debba prendere in considerazione una strategia difensiva esauriente, al fine di evitare risultati inaspettati. Un suggerimento potrebbe essere l'uso di una Userform per l'inserimento dei dati.

    ===

    Regards,

    Norman

    In effetti il mio era solo un accrocco dal quale l'OP può partire e ragionare. Certo è che se non si segna da qualche parte cosa si è già diviso per 100.....

    Un altro modo potrebbe essere quello di *bloccare* le celle dove hai già fatto la divisione...

    Bah.... ma si dovrebbe proteggere il foglio con annessi e connessi...

    Ciao Fratello.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-02-04T10:58:48+00:00

    Ciao Nicola,

    Avendo ora letto la risposta di Fratello Mauro, mi sembra molto probabile che la sua interpretazione dello scenario sia quella giusta, piuttosto che la mia che era un po' diversa. Tuttavia, anche così, non credo che il tuo requisito sia facilmente soddisfatto perché, per esempio, se si memorizza l'indirizzo di un intervallo, problemi possono essere causati dal successivo inserimento o delezione di celle/righe.

    Alla fine, la divisione di valori da 100 non è un evento poco importante e penso che si debba prendere in considerazione una strategia difensiva esauriente, al fine di evitare risultati inaspettati. Un suggerimento potrebbe essere l'uso di una Userform per l'inserimento dei dati.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-02-04T10:34:20+00:00

    Ciao Nicola,

    Sull'ipotesi che i numeri originali siano interi, e mai multipli esatti di 100, perché, se non fosse così, ci sarebbe grande difficoltà a stabilire che un numero fosse precedentemente stato diviso, prova qualcosa del genere:

    '=========>>

    Option Explicit

    '--------->>

    Public Sub Trasforma_cifre()

        Dim WB As Workbook

        Dim SH As Worksheet

        Dim Rng As Range, rCell As Range

        Dim arrIn As Variant

        Dim vVal As Variant

        Dim LRow As Long, i As Long

        Dim CalcMode As Long

        If MsgBox("Vuoi effettuare la trasformazione delle " _

                & "Cifre con decimali?", _

                  vbInformation + vbYesNo + vbDefaultButton2) = vbNo Then

            Exit Sub

        End If

        Set WB = ThisWorkbook

        Set SH = WB.Sheets("Foglio1")                   '<<===== Modifica

        On Error GoTo XIT

        With Application

            CalcMode = .Calculation

            .Calculation = xlCalculationManual

            .ScreenUpdating = False

        End With

        With SH

            LRow = LastRow(SH, .Columns("C:C"))

            Set Rng = .Range("C2:C" & LRow)

        End With

        arrIn = Rng.Value

        For i = 1 To UBound(arrIn, 1)

            vVal = arrIn(i, 1)

            If IsNumeric(vVal) Then

                If Int(vVal) = vVal Then

                    arrIn(i, 1) = vVal / 100

                End If

            End If

        Next i

        Rng.Value = arrIn

    XIT:

        With Application

            .Calculation = CalcMode

            .ScreenUpdating = True

        End With

    End Sub

    '--------->>

    Public Function LastRow(SH As Worksheet, _

                            Optional Rng As Range, _

                            Optional minRow As Long = 1)

        If Rng Is Nothing Then

            Set Rng = SH.Cells

        End If

        On Error Resume Next

        LastRow = Rng.Find(What:="*", _

                           after:=Rng.Cells(1), _

                           Lookat:=xlPart, _

                           LookIn:=xlFormulas, _

                           SearchOrder:=xlByRows, _

                           SearchDirection:=xlPrevious, _

                           MatchCase:=False).Row

        On Error GoTo 0

        If LastRow < minRow Then

            LastRow = minRow

        End If

    End Function

    '<<=========

    Se, tuttavia, la mia ipotesi non fosse valida, le cose diventerebbero molto più complesse e credo che sarebbe necessario memorizzare i numeri originali in qualche modo. A questo proposito, attendo le tue notizie ...

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2016-02-04T10:29:34+00:00

    Salva in una variabile il numero dell'ultima riga sulla quale esegui l'operazione e la volta successiva riparti dalla successiva.

    Un esempio dal quale partire:

    Public Sub m()

        Dim sh As Worksheet

        Dim rng As Range

        Dim c As Range

        Set sh = ThisWorkbook.Worksheets("Foglio1")

        With sh

            Set rng = .Range("A" & [UltimaCella] + 1 & ":A" & .Range("A" & .Rows.Count).End(xlUp).Row)

            If .Range("A" & [UltimaCella] + 1).Value <> "" Then

                For Each c In rng

                    c = c / 100

                Next

            End If

            .Names.Add Name:="UltimaCella", _

    RefersTo:=.Range("A" & .Rows.Count).End(xlUp).Row

        End With

        Set sh = Nothing

        Set rng = Nothing

        Set c = Nothing

    End Sub

    Modifica i riferimenti con i tuoi.

    La risposta è stata utile?

    0 commenti Nessun commento