Salvare i risultati

  • Risultati da salvare di Marco18
    Ciao a tutti!
    in c2 del foglio2 ho il risultato finale di una elaborazione che, per semplicità, suppongo sia la somma di di a2 e b2.
    il codice che ho scritto nell’apposito spazio (macro “elaboraesalva”), fa in modo che i risultati di ogni elaborazione, vengano messi in colonna , precisamente nella colonna h a partire da h2 in giù.
    fin qui tutto bene.
    a questo punto mi sono chiesto se non fosse possibile automatizzare l’operazione di prelevamento del risultato esposto in c2 e la sua trasposizione in colonna h senza il bisogno di attivare manualmente la macro.
    la prima cosa che mi è venuta in mente è stata di scrivere una procedura worksheet_change.
    ho ritenuto, tuttavia di non scriverla sul modulo associato al foglio2 , perchè in esso avviene l’elaborazione dei dati con continui cambi di valore delle celle in esso contenute.
    ho pensato allora di utilizzare il foglio3 (vuoto) e di inserire in a1 di tale foglio la formula
    =foglio2!c2. a questo punto mi ritrovo in a1 del foglio3 un’unica cella che cambia valore
    solamente quando cambia il risultato dell’elaborazione che sta avvenendo nel foglio2.
    apparentemente, dunque, le condizioni ideali per inserire nel modulo associato al foglio3
    la procedura:

    private sub worksheet_change(byval target as range)
    call elaboraesalva
    end sub

    la quale ha il compito di far partire la macro ogni volta che cambia il valore di a1 del foglio3.

    purtroppo ciò non accade, o meglio, la macro parte solo se sono io, manualmente, a cambiare il valore di una qualsiasi cella del foglio3, mentre se il valore cambia grazie alla formula in a1 non succede nulla. cosa sto sbagliando?

     
    Sub elaboraesalva()
    Sheets("Foglio2").Select
    ActiveSheet.Range("C2").Select
    Selection.Copy
    Range("H1").Select
    Do
    ActiveCell.Offset(1).Select
    Loop Until ActiveCell.Value = ""
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    End Sub

    Ciao di Apoben64
    A me sembra che la macro del foglio3 incompleta , nel senso che per far partire la tua macro, questa necessiti di una istruzione del tipo:
    if range("a1").value <>"" then
    call elaborasalva
    end if
    quindi devi creare un evento per l'attivazione .
    peraltro personalmente , se vuoi mantenere il valore nel foglio 3 , dovresti copiarlo esempio in b1 e in questo modo al cambiamento del valore in a1 attivare la tua macro .
    prova il mio è solo un suggerimento a prima vista . sono in partenza, ma spero che altri ti possono aiutare, se nò ci risentiamo lunedì. un saluto e buon weekend !

    Risultati da salvare di marco18 di Patrik
    Ciao marco18.
    copia tutto e incolla nel modulo di foglio2.
    foglio3 non dovrebbe più servirti.
    by, patrik.
     
    'Sostituisci la stringa di AreaUtente con il massimo intervallo
    'di Foglio2 che può essere interessato da input-utente.
    Const AreaUtente As String = "$A$1:$K$10"
    '
    'Sostituisci la stringa di AreaRisultati con il massimo
    'intervallo che vuoi vedere e valorizzare a discesa.
    Const AreaRisultati As String = "H1:H20"
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Temp As Range
    '
    Set Temp = Application.Intersect(Range(AreaUtente), Target)
        'esce se la modifica non rientra nel campo previsto
        If Temp Is Nothing Then Exit Sub
    '________________________________________________
    'Questa sezione  impedisce un Change ricorsivo se :
    '1)     Ti ritrovi con AreaInput che INCLUDE AreaRisultati, cioè
    'se tu avessi predisposto dei campi Input anche a destra o in
    'basso rispetto a colonna H....
    '2)     Avessi necessità di agire MANUALMENTE sui
    'valori-Risultato ottenuti.
    '
    'Se non è così puoi cancellarla.
    '
    Set Temp = Application.Intersect(Range(AreaRisultati), Target)
        If Not Temp Is Nothing Then Exit Sub
    '________________________________________________
    '
        elaboraesalva
    End Sub
    Sub elaboraesalva()
    'Scrive a scendere fintantochè c'è spazio nel range AreaRisultati che hai impostato, dopodichè sovrascrive l'ultimo valore.
        With WorksheetFunction
            Range(AreaRisultati).Cells(1, 1).Offset(.Min(.CountA(Range(AreaRisultati)), 65535), 0).Value = Range("C2").Value
        End With
    End Sub
    

    Ciao marco di Fabio22
    Condivido il parere di luca.
    ritengo che il tuo problema sia dovuto al fatto che l'evento change non si verifica quando le celle cambiano durante il ricalcolo di un foglio.
    e' sufficiente cambiare il nome della procedura associata al foglio3 lasciando tutto il resto così com'è. mi spiego: nel modulo associato al foglio3 anzichè scrivere private sub worksheet_change(byval target as range) scrivi:
    private sub worksheet_calculate lasciando tutto il resto così com'è. ciao. --fabio