macro per calcolo



  • macro per calcolo
    di stefanmi (utente non iscritto) data: 26/08/2013 23:33:40

    avrei bisogno una macro che mi divida per cento il valore della cella di fianco, però ogni foglio ha righe diverse, ho registrato questa ma mi calcola solo fino alla riga del foglio 1, grazie
     
    Sub Macro1()
    '
    ' Macro1 Macro
    '
    
    '
        ActiveCell.FormulaR1C1 = "=SUM(RC[-1]/100)"
        ActiveCell.Select
        Selection.AutoFill Destination:=ActiveCell.Range("A1:A20")
        ActiveCell.Range("A1:A20").Select
        ActiveCell.Offset(20, 0).Range("A1").Select
    End Sub
    



  • di stefanmi (utente non iscritto) data: 27/08/2013 00:54:46

    questa funziona, si puo' semplificare o va bene?
     
    Sub somma()
    '
    ' somma Macro
    '
    
    '
        ActiveCell.Select
        ActiveCell.FormulaR1C1 = "=RC[-1]/100"
        ActiveCell.Select
        Selection.Copy
        ActiveCell.Offset(0, -1).Range("A1").Select
        Selection.End(xlDown).Select
        ActiveCell.Offset(0, 1).Range("A1").Select
        Range(Selection, Selection.End(xlUp)).Select
        ActiveSheet.Paste
    End Sub
    



  • di Grograman data: 27/08/2013 09:09:43

    Prova questa versione se ti piace, funziona sul solo foglio attivo:
     
    Option Explicit
    Sub somma()
    Dim ws As Worksheet
    Dim x As Long
    Set ws = ThisWorkbook.ActiveSheet
      With ws
        x = .Range("A" & .Rows.Count).End(xlUp).Row
        .Range(.Cells(1, 2), .Cells(x, 2)).FormulaR1C1 = "=RC[-1]/100"
      End With
    Set ws = Nothing
    End Sub



  • di HarryBosch data: 27/08/2013 10:09:09

    Volendo evitare il riferimento R1C1, sempre sul foglio attivo:
     
    Sub copia_formula()
        Range("B1:B" & [counta(A:A)]).FormulaLocal = "=A1/100"
    End Sub



  • di Grograman data: 27/08/2013 10:12:31

    Wow anche più bella e stringata quella di Harry

    Approved



  • di stefanmi (utente non iscritto) data: 27/08/2013 13:43:50

    siete proprio bravi, grazie



  • di stefanmi (utente non iscritto) data: 27/08/2013 14:16:59

    scusate un 'altra cosa, dopo aver calcolato quella formula però devo copiare tutta la colonna e incollare i valori al posto della formula per poi cancellare la colonna A



  • di HarryBosch data: 27/08/2013 14:33:36

    L'idea di contare le celle direttamente con
    [counta(A:A)]
    è di VecchioFrac ^_^
    Da considerare eventuali righe di intestazione (o righe vuote), in quanto la funzione conta le celle piene della colonna.

    @Stefanmi
    copiata la formula, si può velocemente convertire il formato in valore, e successivamente eliminare la colonna A
     
    Sub copia_formula()
        With Range("B1:B" & [counta(A:A)])
            .FormulaLocal = "=A1/100"
            .Value = .Value
        End With
        Columns(1).Delete
    End Sub



  • di Grograman data: 27/08/2013 14:56:07

    A questo punto evitiamo la colonna di appoggio
     
    Sub copia_formula()
    Dim cella As Range
        For Each cella In Range("A1:A" & [counta(A:A)])
          With cella
            .Value = .Value / 100
          End With
        Next cella
    End Sub



  • di isy data: 27/08/2013 15:23:16

    Ciao

    Cit: A questo punto evitiamo la colonna di appoggio
    Si ma in questo modo utilizzi un ciclo :):)

    Nota: Effettuo un test sul contenuto numerico della cella e modifico solo i valori presenti
     
    Sub TestForum()
        Dim x   As String
        With Range("A1:A" & [counta(A:A)])
            x = .Address
            .Offset(, 0) = Evaluate("if(isnumber(" & x & ")," & x & " /100," & x & ")")
        End With
    End Sub



  • di Grograman data: 27/08/2013 15:32:15

    Chapeau Isy!

    E anche oggi ho imparato una cosa nuova :):)



  • di stefanmi (utente non iscritto) data: 27/08/2013 20:50:58

    a questo punto quindi se avessi piu' colonne da dover fare calcoli come si potrebbe risolverla, avevo fatto una macro con 3 calcoli


    volendo utilizzare quella di Isy?
     
    Sub modifica_tabella()
    Range("M1:M" & [counta(A:A)]).FormulaLocal = "=CONCATENA(STRINGA.ESTRAI(E1;1;6);20;STRINGA.ESTRAI(E1;7;2))"
    Range("N1:N" & [counta(A:A)]).FormulaLocal = "=C1/100"
    Range("O1:O" & [counta(A:A)]).FormulaLocal = "=L1/100"
    End Sub



  • di stefanmi (utente non iscritto) data: 27/08/2013 21:26:05

    ho provato con questa funziona ma è giusto?
    per poter modificare anche la terza operazione direttamente nella colonna E come si potrebbe fare altrimenti devo copiare i valori e cancellare la colonna E, grazie
     
    Sub ermetica()
    Dim x   As String
    Dim p   As String
       
        With Range("C1:C" & [counta(A:A)])
            x = .Address
            .Offset(, 0) = Evaluate("if(isnumber(" & x & ")," & x & " /100," & x & ")")
        End With
        With Range("L1:L" & [counta(A:A)])
            p = .Address
            .Offset(, 0) = Evaluate("if(isnumber(" & p & ")," & p & " /100," & p & ")")
        End With
       Range("M1:M" & [counta(A:A)]).FormulaLocal = "=CONCATENA(STRINGA.ESTRAI(E1;1;6);20;STRINGA.ESTRAI(E1;7;2))"
    
    End Sub
    



  • di stefanmi (utente non iscritto) data: 27/08/2013 21:35:31

    ho messo un nuovo file per provarla



  • di isy data: 27/08/2013 22:55:53

    Ciao

    Se non servisse il controllo numerico nelle formule si può semplificare ulteriormente con ...
    Ho modificato la terza formula inserendola direttamente nella colonna E
     
    Sub ermetica()
        Dim x   As String
        Dim p   As String
        Dim q   As String
        Dim LastRow As Long
        
        LastRow = [counta(A:A)]
        
        With Range("C1:C" & LastRow)
            x = .Address
            .Offset(, 0) = Evaluate("(" & x & ")/100")
        End With
        
        With Range("L1:L" & LastRow)
            p = .Address
            .Offset(, 0) = Evaluate("(" & p & ")/100")
        End With
        
        With Range("E1:E" & LastRow)
            q = .Address
            .Offset(, 0) = Evaluate("CONCATENATE(MID( " & q & " ,1,6),20,MID( " & q & " ,7,2))")
        End With
        
    End Sub



  • di stefanmi (utente non iscritto) data: 27/08/2013 23:24:31

    ciao Isy, il problema è che nella colonna delle date mi modifica tutto alla stessa data credo che sia quella della prima cella, invece le date sono differenti



  • di stefanmi (utente non iscritto) data: 27/08/2013 23:45:41

    confermo, mi copia tutte le date come quella della cella E1



  • di isy data: 28/08/2013 15:23:26

    Ciao stefanmi

    In alternativa ai codici Vba propongo di utilizzare il metodo TextToColumns disponibile in: Menu Dati

    Ho modificato il codice per la conversione in data
     
    Sub ermetica()
        Dim x   As String
        Dim p   As String
        Dim LastRow As Long
        
        LastRow = [counta(A:A)]
        
        With Range("C1:C" & LastRow)
            x = .Address
            .Offset(, 0) = Evaluate("(" & x & ")/100")
        End With
        
        With Range("L1:L" & LastRow)
            p = .Address
            .Offset(, 0) = Evaluate("(" & p & ")/100")
        End With
        
    'Utilizza il metodo TextToColumns disponibile in: Menu Dati
    
        With Range("E1:E" & LastRow)
            .TextToColumns Destination:=.Offset(, 0), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
            Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
            :=Array(1, 4), TrailingMinusNumbers:=True
        End With
        
    End Sub



  • di stefanmi (utente non iscritto) data: 28/08/2013 23:42:34

    ok funziona benissimo grazie quindi la formula concatena è sparita?