Macro vba



  • Macro vba
    di Mauro (utente non iscritto) data: 14/02/2010

    Ciao a tutti,
    non so perchè ma il più che ho messo nelle celle qui non si vede ma penso che capirete lo stesso.
    il mio problema è che la formula "lunga" che mette in questo caso nella cells(45+i,25) mantiene gli stessi riferimenti ma io voglio che cambino col ciclo. ho scritto anche cosa ho provato a mettere ma non funziona.
    e' da un po' che ci sbatto la testa ma non ne vengo a capo, potreste aiutarmi?
     
    Sub formula()
    '
    ' formula Macro
    '
    
    For i = 0 To 30
        Cells(16, 30).Value = Cells(24 + i, 25) 
        Cells(24 + i, 26).Value = Cells(16, 36) 
        
        Cells(20, 15).Value = Cells(24 + i, 29) 
        Cells(24 + i, 28).Value = Cells(20, 21) 
        
        Cells(45 + i, 25).Select
        ActiveCell.FormulaR1C1 = _
    "=R[-1]C+(R[-1]C[3]*(((R17C15*R12C15)/(R13C3*R6C3))+1)*R21C25)"
        
        If Cells(24 + i, 24).Value = Cells(21, 28) Then 
        Exit For
        End If
        
    Next
    
    End Sub
    
    
    IO HO PROVATO A SOSTITUIRE LA FORMULA CON:
        Cells(45 + i, 25).Select
        ActiveCell.FormulaR1C1 = _
    "= Cells(45 + i-1, 25)+(Cells(45 + i-1, 28)*(((Cells(17, 15)*Cells(12, 15))/(Cells(13, 3)*Cells(6, 3))+1)*Cells(21, 25))"
    
    MA NON VA



  • di Enzo (utente non iscritto) data: 15/02/2010

    Ho capito quello che intendi ma non ho capito la tua formula
    per farla breve ti riassumo una cosa
    qui sotto hai due funzioni che fanno la stessa cosa ossia in cella a8 somma dalla a1 alla a7
    la prima e' quella che ottieni registrando la macro ossia nella cella hai = somma.....
    mentre nella formula hai =sum

    nella seconda invece hai sia nella funzione che nella cella la parola = somma
    ...tutto questo per farti capire che nella funzione che non riesci a far funzionare per utilizzare i clicli dovresti modificare la tua funzione

    se posti un file di esempio si puo vedere


     
    ActiveCell.FormulaR1C1 = "=SUM(R[-7]C:R[-1]C)"
    
    ActiveCell.FormulaLocal = "=SOMMA(A1:A7)"
    
    



  • di Enzo (utente non iscritto) data: 15/02/2010

    Ho notato un altra cosa
    ma il ciclo come fai a farlo partire da zero?

     
    For i = 0 To 30
    



  • di Mauro (utente non iscritto) data: 15/02/2010

    Il ciclo parte da zero perchè all'inizio voglio che mi scriva dalla cella che ho selezionato.
    se mi mandi la tua e-mail ti invio il file perchè qui non vedo dove posso allegarlo!



  • di Enzo (utente non iscritto) data: 15/02/2010

    In alto a destra c'e' allega files alla discussione



  • di Mauro (utente non iscritto) data: 15/02/2010

    Ho allegato il file excel alla discussione



  • di Enzo (utente non iscritto) data: 15/02/2010

    Scusa ma il file xls dov'e'?



  • di Mauro (utente non iscritto) data: 15/02/2010

    Quello .rar



  • di Enzo (utente non iscritto) data: 15/02/2010

    Ho un problema in quanto utilizzi office 2007 al lavoro ho office 2003
    provero' adargli un occhiata a casa



  • di Mauro (utente non iscritto) data: 15/02/2010

    Hai ragione, non ci ho pensato.
    ora ho condiviso il file formato 2003. non vorrei mai che ti annoiassi! :-d



  • di Enzo (utente non iscritto) data: 15/02/2010

    Scusa saro' duro di comprendonio
    riepilogando partendo dalla formula qui sotto posta in y42 , nella tua formula hai dei parametri fissi (o17,o12,c13,c6,y21) mentre variano y41 e ab41 che fanno riferimento alla cella precedente
    ho visto che la tua macro ripete la formula nella maniera esatta
    non capisco cosa tu voglia dalla formula o cosa c'e' che non funziona

     
    =Y41+(AB41*((($O$17*$O$12)/($C$13*$C$6))+1)*$Y$21)



  • di Mauro (utente non iscritto) data: 15/02/2010

    Hai capito perfettamente solo che forse non mi sono spiegato bene.
    io voglio nella macro mettere una cosa tipo y41+i e ab41+i in modo che non mi copi lo formula esattamente ma per ogni cella della colonna y la formula prenda il valore dell'y nella cella precedente e di ab, in modo da poter fare quello che ho fatto "manualmente" da y25 e y43.
    infatti la formula sotto riportata è nella cella y42 ma prende i valori di y41 e ab41.
    magari e semplice ma non riesco ad inizializzarlo nella macro.
     
    =Y41+(AB41*((($O$17*$O$12)/($C$13*$C$6))+1)*$Y$21)
    
    



  • di Enzo (utente non iscritto) data: 15/02/2010

    Prova, non ne sono sicuro
    sempre se ho capito bene
     
    Application.ScreenUpdating = False
        Range("X27:AC27").Copy
        Range("X27").Select
        Do
        ActiveCell.Offset(1).Select
        Loop Until ActiveCell.Value = ""
        ActiveSheet.Paste
        ActiveCell.Offset(0, -1).Select
        x = ActiveCell(-1).Value
        ActiveCell.Value = x + 1
        Application.CutCopyMode = False
        Application.ScreenUpdating = True



  • di Mauro (utente non iscritto) data: 15/02/2010

    Da quello che mi hai inviato hai capito bene. i valori delle colonne y e ac si aggiornano correttamente mentre gli altri no. mi ci vorrà un po' per risolverlo, comunque ti ringrazio.
    non sono riuscito a capire in che modo sei riuscito a fare variare il valore delle celle in y e ab e non nelle altre. so che c'entra il comando che ho riportato.
     
        ActiveCell.Offset(0, -1).Select
        x = ActiveCell(-1).Value
        ActiveCell.Value = x + 1



  • di Mauro (utente non iscritto) data: 15/02/2010

    Un altro problema che mi da è che la numerazione delle colonne non è consequenziale (1-2-3-4-5-6-7-8...) ma inserendo nel ciclo viene (1-1-2-2-3-3-4-4-5-5-6-6-7-7...)



  • di Enzo (utente non iscritto) data: 16/02/2010

    Le righe che hai estrapolato sono relative all'incrmento del numero progressivo nella colonna w
    qui sotto ti ho spiegato quello che fa l'istruzione
    un consiglio
    in qualsiasi tua macro se vuoi capire quello che fa prova cosi:
    all'inizio della tua macro quando parte scrivi stop
    la macro si blocca e ti si apre l'istruzione evidenziando in giallo la riga dove si e' fermata
    successivamente prova a rimpicciolire il riquadro in modo da avere da una parte la tua istruzione e sotto il foglio excel
    senza uscire premi f8 e sequenzialmente vedrai che la tua istruzione andra' avanti e vedrai l'istruzione come agisce sul tuo foglio
    prova e' piu facile da fare che da spiegare
     
    Application.ScreenUpdating = False
    'copia questa riga 
        Range("X27:AC27").Copy
    vai in x27
        Range("X27").Select
    scendi di una riga fino a quando cella e' vuota
        Do
        ActiveCell.Offset(1).Select
        Loop Until ActiveCell.Value = ""
    incolla
        ActiveSheet.Paste
    stessa riga ma spostati indietro di una cella
    quindi cella w
        ActiveCell.Offset(0, -1).Select
    la variabile x assume come valore il valore della cella w precedente (il numero progressivo per capirci)
        x = ActiveCell(-1).Value
    lo incrementa di uno e lo copia nella cella vuota
        ActiveCell.Value = x + 1
        Application.CutCopyMode = False
        Application.ScreenUpdating = True
    



  • di Mauro (utente non iscritto) data: 16/02/2010

    Ottimo consiglio quello dell'f8! grazie, una ultima cosa poi non ti rompo più.
    con il comando sotto riportato copi l'intera riga da x27 a ac27, se io invece volessi solo la cella x27 e ac27?
    grazie mille!
     
    Range("X27:AC27").Copy
    
    Ho provato
    Range("X27;AC27").Copy
    
    ma non va e nella guida non riesco a trovarlo.



  • di Enzo (utente non iscritto) data: 16/02/2010

    Prova ora
    dovresti vederlo nella guida

    p.s. esempio banale

    range ("a1").select
    selection.copy
    e
    range ("a1").copy

    fanno la stessa cosa
    solo che nella guida vedresti solo il primo in quanto viene selezionata la cella


     
    Range("X27").SELECT
    SELECTION.COPY
    Do
    ActiveCell.Offset(1).Select
    Loop Until ActiveCell.Value = ""
    ActiveSheet.Paste
    Range("AC27").SELECT
    SELECTION.COPY
    Do
    ActiveCell.Offset(1).Select
    Loop Until ActiveCell.Value = ""
    ActiveSheet.Paste
    
    
    
    



  • di Mauro (utente non iscritto) data: 16/02/2010

    Il programma cosi è praticamente a posto, l'unica cosa che volevo chiederti è come faccio a farmi dire quale cella dell' if che ho inserito soddisfa la condizione?
    poi per cancellarla pensavo di usare il comando riportato sotto la macro.

    ps: non credo che funzioni perfettamente nel file che avevo allegato in quanto ho cambiato alcune cose
     
    Sub ciclo()
    '
    ' ciclo Macro
    '
    
    For i = 0 To 15
    
    Application.ScreenUpdating = False
        Range("X26:Y26").Select  'fatto partire dal 26 per non copiare anche i colori
        Selection.Copy
        Do
        ActiveCell.Offset(1).Select
        Loop Until ActiveCell.Value = ""
        ActiveSheet.Paste
        ActiveCell.Offset(0, -1).Select
        x = ActiveCell(-1).Value
        ActiveCell.Value = x + 2
        Application.CutCopyMode = False
        Application.ScreenUpdating = True
        Cells(16, 30).Value = Cells(27 + i, 25) 'pongo la nuova s per trovare tau
        Cells(27 + i, 26).Value = Cells(16, 36) 'cosi ho la tau del nuovo passo
        
        Range("AC26").Select
        Selection.Copy
        Do
        ActiveCell.Offset(1).Select
        Loop Until ActiveCell.Value = ""
        ActiveSheet.Paste
        
        Cells(20, 15).Value = Cells(27 + i, 29) 'pongo la nuova sigma
        Cells(27 + i, 28).Value = Cells(20, 21) 'cosi ho la epsilon del nuovo passo
        
        Range("AA26").Select
        Selection.Copy
        Do
        ActiveCell.Offset(1).Select
        Loop Until ActiveCell.Value = ""
        ActiveSheet.Paste
    
        If Cells(27 + i, 24).Value >= Cells(21, 28) Then 'quando arrivo a L=10cm=100mm ferma il calcolo
        Exit For
        End If
    Next
    
    End Sub
    
    PER CANCELLARE RIGA IF (partendo dalla cella che verifica la condizione)
    
    Set mySheet = myChart.Application.DataSheet
    mySheet.Range("W1:AC10").Delete 
    
    Dove W è la cella che verifica la condizione
    
    
    



  • di Enzo (utente non iscritto) data: 16/02/2010

    ......parli di:
    se il riferimento e' quello potresti prima di uscira dal ciclo far si che il valore della cella sia in grassetto (una delle ipotesi)

    ossia


     
    If Cells(27 + i, 24).Value >= Cells(21, 28) Then 'quando arrivo a L=10cm=100mm ferma il calcolo
    Exit For
    End If
    
    IPOTESI................................
    If Cells(27 + i, 24).Value >= Cells(21, 28) Then 'quando arrivo a L=10cm=100mm ferma il calcolo
    Cells(27 + i, 24).FONT.BOLD = TRUE
    Exit For
        End If
    



  • di Enzo (utente non iscritto) data: 16/02/2010

    Oppure colori la cella di rosso

     
    If Cells(27 + i, 24).Value >= Cells(21, 28) Then 'quando arrivo a L=10cm=100mm ferma il calcolo
    Cells(27 + i, 24).Interior.ColorIndex = 3
    EXIT FOR



  • di Mauro (utente non iscritto) data: 16/02/2010

    Nella tua ipotesi mi viene evidenziata la cella che verifica l'if, bene. ma io voglio che identificata la cella (quindi la riga) mi cancelli quello che ha scritto a causa dei precedenti comandi.
    ho provato a mettere l'if ad inizio del ciclo ma non va.
    io il comando l'ho scritto cosi ma non funziona, come devo scriverlo per farlo funzionare?
     
    If Cells(27 + i, 24).Value >= Cells(21, 28) Then 
        
    Range("Cells(27 + i, 24):Cells(27 + i, 29)").Delete
    
    Il desiderio sarebbe cancellare il contenuto delle celle della riga 27+i da colonna 24 a 29



  • di Enzo (utente non iscritto) data: 17/02/2010

    Prova cosi'

     
    Range("Cells(27 + i, 24):Cells(27 + i, 29)").Delete Shift:=xlUp
    



  • di Mauro (utente non iscritto) data: 18/02/2010

    Enzo grazie dell'aiuto, il programma non è ancora finito e probabilmente ti romperò le scatole ancora in futuro.
    nel frattempo desideravo ringraziarti.
    ciao e a presto.
    mauro