Copiare in maniera automatica dati Excel da foglio a foglio

Anonimo
2021-09-13T15:07:55+00:00

Buongiorno,

sto utilizzando un file Excel per fare la prima nota di cassa con la vista mensile dei fogli quindi 1 - 2- 3 - 4 ecc

vorrei riportare in maniera automatica il valore di "CHIUSURA CASSA" sul foglio successivo come valore iniziale, il mio problema è che la cella in cui si trova il valore di chiusura naturalmente è sempre diverse, mentre il valore iniziale è sempre sulla stessa cella del foglio successivo, spero di essere stato abbastanza chiaro.

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
2021-09-17T08:12:15+00:00

Ciao Marco,

purtroppo ancora nulla, nello screen sotto ho messo la prima parte del codice in "modulo1" li a sinistra, mentre la seconda parte in "questa_cartella" sempre li a sinistra, credo sia giusto, ma adesso ricevo un errore di sintassi.

Purtroppo posso scaricare il tuo file di prova, ma anche passando l'avviso di sicurezza non riesco comunque a vedere le macro, quindi neanche nessun codice. Immagine

Sfortunatamente, l'editore della Community gioca lo spiacevole trucco di inserire una riga vuota tra ogni riga di codice. Sebbene ciò sia normalmente solo fastidioso, se l'ultimo carattere in una riga di codice è un carattere di continuazione di riga (un carattere di sottolineatura), ciò causa un errore di compilazione.

Per risolvere questo problema, eliminare la riga vuota dopo ogni riga di codice evidenziata in rosso.

Meglio ancora, se copi il codice direttamente dalla mia cartella di lavoro di prova, i problemi delle righe vuote indesiderate scompariranno.

Puoi anche, ovviamente, usare il mio file di test per dimostrare che non ci sono problemi intrinseci con il codice e che funziona!

===

Regards,

Norman

Immagine

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

9 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2021-09-14T13:00:11+00:00

    Ciao Marco,

    Sto cercando di utilizzare questo codice ma ricevo sempre un errore, ti allego anche il contesto della tabella con righe e colonne se hai bisogno di sistemare la formula, grazie mille comunque Immagine

    Credo che il tuo errore sia dovuto al fatto che tu hai introdotto la variabile sRiga_Chiasura_del_Giorno che non faceva parte del codice che ho pubblicato; in ogni caso a questa variabile non è stato assegnato alcun valore.

    ti allego anche il contesto della tabella con righe e colonne se hai bisogno di sistemare la formula, grazie mille comunque

    Immagine

    Data la disposizione dei tuoii dati, che differisce sensibilmente da quello riportato nel mio file di prova, e vista la necessità di mantenere l'integrità dei dati tra tutti questi fogli di interesse, nel modulo codice della Questa_Cartella_di_lavoro, sostituisci il codice precedente con la versione successiva :

    '========>>

    Option Explicit

    Const sBilancio_di_Apertura As String = "C3:D3"

    Const sColonna_Entrata As String = "C:C"

    Const sStr As String = "CHIASURA DEL GIORNO"

    '-------->>

    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

    Dim rBilancio\_di\_Apertura As Range 
    
    Dim rCaption As Range, rChiasura\_del\_Giorno As Range 
    
    Dim dBilancio As Double 
    
    With ThisWorkbook 
    
        If Sh.Name = .Sheets(.Sheets.Count).Name Then Exit Sub 
    
    End With 
    
    With Sh 
    
        Set rBilancio\_di\_Apertura = .Next.Range(sBilancio\_di\_Apertura) 
    
        With .Columns(sColonna\_Entrata) 
    
            Set rCaption = .Offset(0, -1).Find(What:=sStr, After:=.Offset(0, -1).Cells(1), LookIn:= \_ 
    
                xlFormulas2, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:= \_ 
    
                xlNext, MatchCase:=False, SearchFormat:=False) 
    
        End With 
    
        Set rChiasura\_del\_Giorno = rCaption.Offset(0, 1).Resize(1, 2) 
    
        dBilancio = Application.Sum(rChiasura\_del\_Giorno.Value) 
    
        Application.EnableEvents = False 
    
        With rBilancio\_di\_Apertura 
    
            .ClearContents 
    
            If dBilancio >= 0 Then 
    
                .Cells(1).Value = dBilancio 
    
            Else 
    
                .Cells(2).Value = dBilancio 
    
            End If 
    
        End With 
    
        Application.EnableEvents = True 
    
    End With 
    

    End Sub

    '-------->>

    Private Sub Workbook_SheetActivate(ByVal Sh As Object)

    Dim rBilancio\_di\_Apertura As Range 
    
    Dim rCaption As Range, rChiasura\_del\_Giorno As Range 
    
    Dim dBilancio As Double 
    
    If Sh.Name = ThisWorkbook.Sheets(1).Name Then Exit Sub 
    
        With Sh 
    
        Set rBilancio\_di\_Apertura = .Next.Range(sBilancio\_di\_Apertura) 
    
        With .Columns(sColonna\_Entrata) 
    
            Set rCaption = .Offset(0, -1).Find(What:=sStr, After:=.Offset(0, -1).Cells(1), LookIn:= \_ 
    
                xlFormulas2, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:= \_ 
    
                xlNext, MatchCase:=False, SearchFormat:=False) 
    
        End With 
    
        Set rChiasura\_del\_Giorno = rCaption.Offset(0, 1).Resize(1, 2) 
    
        dBilancio = Application.Sum(rChiasura\_del\_Giorno.Value) 
    
        With rBilancio\_di\_Apertura 
    
            .ClearContents 
    
            If dBilancio >= 0 Then 
    
                .Cells(1).Value = dBilancio 
    
            Else 
    
                .Cells(2).Value = dBilancio 
    
            End If 
    
        End With 
    

    End With

    End Sub

    '<<========

    • Ctrl+R per accedere alla finestra Project Explorer ('Gestione progetti')
    • Fai doppio clic sul modulo ThisWorkbook (Questa_cartella_di_Lavoro) del file e sostituisci il codice precedente con il seguente codice:

    '========>>

    Option Explicit

    '-------->>

    Private Sub Workbook_SheetChange(ByVal SH As Object, ByVal Target As Range)

    Dim rBilancio\_di\_Apertura As Range 
    
    Dim rCaption As Range, rChiasura\_del\_Giorno As Range 
    
    Dim dBilancio As Double 
    
    With ThisWorkbook 
    
        If SH.Name = .Sheets(.Sheets.Count).Name Then Exit Sub 
    
        If Not IsNumeric(SH.Name) And SH.Name &lt;&gt; sNome\_Primo\_Foglio Then Exit Sub 
    
    End With 
    
    With SH 
    
        Set rBilancio\_di\_Apertura = .Next.Range(sBilancio\_di\_Apertura) 
    
        With .Columns(sColonna\_Entrata) 
    
            Set rCaption = .Offset(0, -1).Find(What:=sStr, After:=.Offset(0, -1).Cells(1), LookIn:= \_ 
    
                xlFormulas2, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:= \_ 
    
                xlNext, MatchCase:=False, SearchFormat:=False) 
    
        End With 
    
        Set rChiasura\_del\_Giorno = rCaption.Offset(0, 1).Resize(1, 2) 
    
        dBilancio = Application.Sum(rChiasura\_del\_Giorno.Value) 
    
        On Error GoTo XIT 
    
        With Application 
    
            .EnableEvents = False 
    
            .ScreenUpdating = False 
    
        End With 
    
        With rBilancio\_di\_Apertura 
    
            .ClearContents 
    
            If rChiasura\_del\_Giorno.Cells(1) = "" Then 
    
                .Cells(2).Value = dBilancio 
    
            Else 
    
                .Cells(1).Value = dBilancio 
    
            End If 
    
        End With 
    
    End With 
    
    Call Update\_Subsequent\_Sheets(SH) 
    

    XIT:

    With Application 
    
        .EnableEvents = True 
    
        .ScreenUpdating = True 
    
    End With 
    

    End Sub

    '<<========

    Potresti scaricare il mio file di prova Marco2_20210914.xlsm

    ===

    Regards,

    Norman

    Immagine

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2021-09-14T07:59:33+00:00

    Ciao Marco,

    sto utilizzando un file Excel per fare la prima nota di cassa con la vista mensile dei fogli quindi 1 - 2- 3 - 4 ecc

    vorrei riportare in maniera automatica il valore di "CHIUSURA CASSA" sul foglio successivo come valore iniziale, il mio problema è che la cella in cui si trova il valore di chiusura naturalmente è sempre diverse, mentre il valore iniziale è sempre sulla stessa cella del foglio successivo, spero di essere stato abbastanza chiaro. Immagine

    Oltre all'ottimo suggerimemento di Franco, per ottenere una soluzione automatica che funzionerà per tutti i fogli della cartella di lavoro di interesse,, prova qualcosa del genere:

    • Alt+F11 per aprire l'editor di VBA
    • Alt+IM per inserire un nuovo modulo di codice
    • Nel nuovo modulo vuoto, incolla il seguente codice:

    '========>>

    Option Explicit

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

    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

    '<<========

    • Ctrl+R per accedere alla finestra Project Explorer ('Gestione progetti')
    • Fai doppio clic sul modulo ThisWorkbook (Questa_cartella_di_Lavoro) del file e incolla il seguente codice:

    '========>>

    Option Explicit

    Const sCella_Bilancio_di_Apertura As String = "B1" '<<=== Modifica

    Const sColonna_Chiasura_del_Giorno As String = "F:F" '<<=== Modifica

    '-------->>

    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

    Dim rBilancio_di_Apertura As Range

    Dim rChiasura_del_Giorno As Range

    Dim iCol As Long

    Dim LRow As Long

    With ThisWorkbook

    If Sh.Name = .Sheets(.Sheets.Count).Name Then Exit Sub

    End With

    With Sh

    Set rBilancio_di_Apertura = .Next.Range(sCella_Bilancio_di_Apertura)

    iCol = .Range(sColonna_Chiasura_del_Giorno).Column

    LRow = LastRow(Sh, .Columns(iCol))

    Set rChiasura_del_Giorno = Sh.Cells(LRow, iCol)

    Application.EnableEvents = False

    rBilancio_di_Apertura.Value = rChiasura_del_Giorno.Value

    Application.EnableEvents = True

    End With

    End Sub

    '-------->>

    Private Sub Workbook_SheetActivate(ByVal Sh As Object)

    Dim rBilancio_di_Apertura As Range

    Dim rChiasura_del_Giorno As Range

    Dim iCol As Long

    Dim LRow As Long

    If Sh.Name = ThisWorkbook.Sheets(1).Name Then Exit Sub

    With Sh

    LRow = LastRow(.Previous, .Previous.Range(sColonna_Chiasura_del_Giorno))

    Set rChiasura_del_Giorno = .Previous.Cells(LRow, sColonna_Chiasura_del_Giorno)

    .Range(sCella_Bilancio_di_Apertura).Value = rChiasura_del_Giorno.Value

    End With

    End Sub

    '<<========

    • Alt+Q per chiudere l'editor di VBA e tornare a Excel.

    Potresti scaricare il mio file di prova Marco20210914.xlsm

    ===

    Regards,

    Norman

    Immagine

    Sto cercando di utilizzare questo codice ma ricevo sempre un errore, ti allego anche il contesto della tabella con righe e colonne se hai bisogno di sistemare la formula, grazie mille comunque

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2021-09-13T23:24:49+00:00

    Ciao Marco,

    sto utilizzando un file Excel per fare la prima nota di cassa con la vista mensile dei fogli quindi 1 - 2- 3 - 4 ecc

    vorrei riportare in maniera automatica il valore di "CHIUSURA CASSA" sul foglio successivo come valore iniziale, il mio problema è che la cella in cui si trova il valore di chiusura naturalmente è sempre diverse, mentre il valore iniziale è sempre sulla stessa cella del foglio successivo, spero di essere stato abbastanza chiaro. Immagine

    Oltre all'ottimo suggerimemento di Franco, per ottenere una soluzione automatica che funzionerà per tutti i fogli della cartella di lavoro di interesse,, prova qualcosa del genere:

    • Alt+F11 per aprire l'editor di VBA
    • Alt+IM per inserire un nuovo modulo di codice
    • Nel nuovo modulo vuoto, incolla il seguente codice:

    '========>>

    Option Explicit

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

    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 &lt; minRow Then 
    
        LastRow = minRow 
    
    End If 
    

    End Function

    '<<========

    • Ctrl+R per accedere alla finestra Project Explorer ('Gestione progetti')
    • Fai doppio clic sul modulo ThisWorkbook (Questa_cartella_di_Lavoro) del file e incolla il seguente codice:

    '========>>

    Option Explicit

    Const sCella_Bilancio_di_Apertura As String = "B1" '<<=== Modifica

    Const sColonna_Chiasura_del_Giorno As String = "F:F" '<<=== Modifica

    '-------->>

    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

    Dim rBilancio\_di\_Apertura As Range 
    
    Dim rChiasura\_del\_Giorno As Range 
    
    Dim iCol As Long 
    
    Dim LRow As Long 
    
    With ThisWorkbook 
    
        If Sh.Name = .Sheets(.Sheets.Count).Name Then Exit Sub 
    
    End With 
    
    With Sh 
    
        Set rBilancio\_di\_Apertura = .Next.Range(sCella\_Bilancio\_di\_Apertura) 
    
        iCol = .Range(sColonna\_Chiasura\_del\_Giorno).Column 
    
        LRow = LastRow(Sh, .Columns(iCol)) 
    
        Set rChiasura\_del\_Giorno = Sh.Cells(LRow, iCol) 
    
        Application.EnableEvents = False 
    
        rBilancio\_di\_Apertura.Value = rChiasura\_del\_Giorno.Value 
    
        Application.EnableEvents = True 
    
    End With 
    

    End Sub

    '-------->>

    Private Sub Workbook_SheetActivate(ByVal Sh As Object)

    Dim rBilancio\_di\_Apertura As Range 
    
    Dim rChiasura\_del\_Giorno As Range 
    
    Dim iCol As Long 
    
    Dim LRow As Long 
    
    If Sh.Name = ThisWorkbook.Sheets(1).Name Then Exit Sub 
    
    With Sh 
    
        LRow = LastRow(.Previous, .Previous.Range(sColonna\_Chiasura\_del\_Giorno)) 
    
        Set rChiasura\_del\_Giorno = .Previous.Cells(LRow, sColonna\_Chiasura\_del\_Giorno) 
    
        .Range(sCella\_Bilancio\_di\_Apertura).Value = rChiasura\_del\_Giorno.Value 
    
    End With 
    

    End Sub

    '<<========

    • Alt+Q per chiudere l'editor di VBA e tornare a Excel.

    Potresti scaricare il mio file di prova Marco20210914.xlsm

    ===

    Regards,

    Norman

    Immagine

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Gianfranco55 25,190 Punti di reputazione Moderatore volontario
    2021-09-13T15:25:12+00:00

    ciao

    con formule

    o

    =INDICE(Foglio1!$B$1:$B$20;CONFRONTA("chiusura del giorno";Foglio1!$A$1:$A$20;0))
    

    oppure

    =INDICE(Foglio1!$B$1:$B$20;CONFRONTA(111111111;Foglio1!$B$1:$B$20;1))
    

    oppure

    =FILTRO(Foglio1!$B$1:$B$20;Foglio1!$A$1:$A$20="chiusura del giorno";"")
    

    La risposta è stata utile?

    0 commenti Nessun commento