› Sviluppare funzionalita su Microsoft Office con VBA › trasferimento record da un foglio al successivo
-
AutoreArticoli
-
Ciao a tutti,
avrei la necessità di apportare una piccola modifica ad una macro che uso nel mio foglio.
Spiego: al momento, questa macro associata ad un pulsante, esegue l'istruzione di trasferire dei record da un foglio ad un altro, più precisamente, parlando di mesi e facendo un esempio, trasferisce record del foglio "Gennaio" posizionandosi però in quello di Febbraio. A me farebbe invece più comodo il contrario, ovvero trasferire i dati stando nel foglio del mese "X" e trasferirli in quello immediatamente successivo.
Nella speranza di essermi spiegato, qui di seguito incollo il contenuto attuale della macro.
Grazie mille in anticipo a chi vorrà aiutarmi.
Ciao
Sub Transfert() Dim MIoMese Dim MesePrecedente Dim DataMia Dim Codice Dim CellaW MIoMese = ActiveSheet.Name DataMia = CDate("01 " & MIoMese & " 2000") DataMia = Format(DataMia - 2, "Mmmm") Dim m_stAddress Dim MioRangeFiltro MesePrecedente = UCase(Left(DataMia, 1)) & Right(DataMia, Len(DataMia) - 1) On Error GoTo GestErr Do With Sheets(MesePrecedente).Range("A:A") On Error GoTo 0 Codice = InputBox("Inserire codice Contatore", "InserireCodice") If Codice = "" Then Exit Sub Set CellaW = .Find(What:=Codice) If Not CellaW Is Nothing Then m_stAddress = CellaW.Address Do 'Sheets(MesePrecedente).Activate 'CellaW.Select 'CellaW.Resize(1, 17).Select 'Sheets(MIoMese).Activate 'Sheets(MIoMese).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Resize(1, 17).Select Application.EnableEvents = False '<-aggiunta CellaW.Resize(1, 17).Copy Destination:=Sheets(MIoMese).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) If Application.Evaluate(Sheets(MIoMese).Cells(Cells(Rows.Count, 1).End(xlUp).Row, "K").Address) > 1 Then 'test se il valore in K è maggiore di 1 '<-aggiunta Sheets(MIoMese).Cells(Cells(Rows.Count, 1).End(xlUp).Row, "F") = DateAdd("m", 1, Sheets(MIoMese).Cells(Cells(Rows.Count, 1).End(xlUp).Row, "F")) '<-aggiunta Sheets(MIoMese).Cells(Cells(Rows.Count, 1).End(xlUp).Row, "M") = "NO" Sheets(MIoMese).Cells(Cells(Rows.Count, 1).End(xlUp).Row, "O") = "NO" End If '<-aggiunta Application.EnableEvents = True '<-aggiunta Set CellaW = .FindNext(CellaW) Loop While Not CellaW Is Nothing And CellaW.Address <> m_stAddress Else MsgBox ("Codice Non Trovato") End If End With With Sheets(MIoMese) .Sort.SortFields.Clear Set MioRangeFiltro = .Range(Sheets(MIoMese).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0), "Q1") .Sort.SortFields.Add2 Key:=Range("B:B") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With .Sort .SetRange MioRangeFiltro .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End With Loop While MsgBox("Vuoi inserire un altro codice?", vbYesNo + vbQuestion, "PROSEGUO O ESCO?") = vbYes Exit Sub ActiveSheet.Range("A2").CurrentRegion.Sort key1:=ActiveSheet.Range("B2"), Order1:=xlAscending, Header:=xlYes GestErr: MsgBox "il foglio con il nome " & MesePrecedente & " NON esiste", vbOKOnly + vbCritical End SubCiao frasubb,
dovresti allegare un file di esempio e fornire qualche dettaglio in più riguardo al risultato desiderato.
P.S. ricordati per le prossime volte di utilizzate i TagCode (pulsante codice VBA) per pubblicare il tuo codice. Questa volta l'ho sistemato io.
Esempio di come faccio
Option Explicit Sub Aggiorna() Dim Fg As Long, Fgg As String, Tot As Long Application.ScreenUpdating = False Fgg = ActiveSheet.Name Fg = ActiveSheet.Index + 1 Tot = Worksheets.Count If Fg <= Tot Then Sheets(Fgg).Range("A1:Z100").Copy Sheets(Fg).Range("A1").PasteSpecial Else MsgBox "il foglio non esiste" End If Application.ScreenUpdating = True End SubCiao Raffaele, grazie per la risposta ma non ho capito dove devo scrivere le stringhe che mi suggerisci, ovvero sostituire in toto quello che ho io, oppure in aggiunta.
Mi fai sapere per favore ?
Grazie mille
Ciao Alex, grazie e provvedo ad allegare il file esempio.
Per quanto riguarda i TagCode, posso intuire cosa siano ma non so precisamente a cosa/quali alludi e come dovrei fare.
Spero di non aver sbagliato ulteriormente, qualora fosse, chiedo scusa ma non so precisamente di cosa parli.
Grazie
Allegati:
You must be logged in to view attached files.L'esempio (cambiando solo il range), fà esattamente quello richiesto (basta inserirlo in un Modulo e abbinargli un bottone). Vedendo l'allegato presumo che Tu debba dare ulteriori spiegazioni, perchè presumendo che esistano i 12 fogli dei mesi, esiste pure un "Foglio2" totalmente differente. Non credo che "Dicembre" ci debba copiarci dentro?
Buonasera a tutti,
scusate ma avrei una piccola necessità, ovvero ampliare l'operatività di questa macro (vedi sotto).
Mi spiego: oltre a trasferire da un foglio all'altro i dati indicati nella macro stessa e relativi alle colonne F, M, O, vorrei trasferire anche ciò che è presente nella colonna R ovvero il suo contenuto, senza quindi impostarne un testo prestabilito.
Io ho inserito la stringa nella macro che allego qui di seguito, ma ovviamente mi trasferisce il testo "NO".
Come faccio ad ottenere ciò che vorrei ?
Grazie
Sub Transfert() Dim MIoMese Dim MesePrecedente Dim DataMia Dim Codice Dim CellaW MIoMese = ActiveSheet.Name DataMia = CDate("01 " & MIoMese & " 2000") DataMia = Format(DataMia - 2, "Mmmm") Dim m_stAddress Dim MioRangeFiltro MesePrecedente = UCase(Left(DataMia, 1)) & Right(DataMia, Len(DataMia) - 1) On Error GoTo GestErr Do With Sheets(MesePrecedente).Range("A:A") On Error GoTo 0 Codice = InputBox("Inserire codice Contatore", "InserireCodice") If Codice = "" Then Exit Sub Set CellaW = .Find(What:=Codice) If Not CellaW Is Nothing Then m_stAddress = CellaW.Address Do 'Sheets(MesePrecedente).Activate 'CellaW.Select 'CellaW.Resize(1, 17).Select 'Sheets(MIoMese).Activate 'Sheets(MIoMese).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Resize(1, 17).Select Application.EnableEvents = False '<-aggiunta CellaW.Resize(1, 17).Copy Destination:=Sheets(MIoMese).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) If Application.Evaluate(Sheets(MIoMese).Cells(Cells(Rows.Count, 1).End(xlUp).Row, "K").Address) > 1 Then 'test se il valore in K è maggiore di 1 '<-aggiunta Sheets(MIoMese).Cells(Cells(Rows.Count, 1).End(xlUp).Row, "F") = DateAdd("m", 1, Sheets(MIoMese).Cells(Cells(Rows.Count, 1).End(xlUp).Row, "F")) '<-aggiunta Sheets(MIoMese).Cells(Cells(Rows.Count, 1).End(xlUp).Row, "M") = "NO" Sheets(MIoMese).Cells(Cells(Rows.Count, 1).End(xlUp).Row, "O") = "NO" Sheets(MIoMese).Cells(Cells(Rows.Count, 1).End(xlUp).Row, "R") = "NO" End If '<-aggiunta Application.EnableEvents = True '<-aggiunta Set CellaW = .FindNext(CellaW) Loop While Not CellaW Is Nothing And CellaW.Address <> m_stAddress Else MsgBox ("Codice Non Trovato") End If End With With Sheets(MIoMese) .Sort.SortFields.Clear Set MioRangeFiltro = .Range(Sheets(MIoMese).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0), "Q1") .Sort.SortFields.Add2 Key:=Range("B:B") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With .Sort .SetRange MioRangeFiltro .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End With Loop While MsgBox("Vuoi inserire un altro codice?", vbYesNo + vbQuestion, "PROSEGUO O ESCO?") = vbYes Set CellaW = Range("A:A").Find(What:=Codice, SearchOrder:=xlByRows, SearchDirection:=xlPrevious) If Not CellaW Is Nothing Then Cells(CellaW.Row, "B").Select End If Exit Sub ActiveSheet.Range("A2").CurrentRegion.Sort Key1:=ActiveSheet.Range("B2"), Order1:=xlAscending, Header:=xlYes GestErr: MsgBox "il foglio con il nome " & MesePrecedente & " NON esiste", vbOKOnly + vbCritical End SubCiao @frasubb, cerca di ricordarti di inserire il codice nel TagCode. Per la seconda volta l'ho modificato io. Se non sai come si fa, basta che tu prema sul pulsante
(codice VBA). A quel punto si aprirà l'editor per inserire le stringhe di codice.Venendo al problema. In questa linea di codice:
CellaW.Resize(1, 17).Copy Destination:=Sheets(MIoMese).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)con Resize(1, 17) stai indicando al codice di espandere il range di 0 righe e 17 colonne. Quindi partendo da CellaW, che rappresenta una cella in colonna A, se ti espandi di 17 colonne arrivi alla colonna Q. A questo punto come faresti tu?
Chiedo scusa, non avevo fatto caso dove fosse posto il pulsante CODICE VBA, la prossima volta seguirò la regola.
Per quanto riguarda la soluzione del mio problema, ho modificato (1, 17) con (1, 18). Capendo poco o niente di vba, non sapevo che bastasse solo far questo.
Grazie
Bene che hai risolto.
Volevo chiederti...la richiesta iniziale di questa discussione era trasferire i dati dal foglio attuale a quello successivo, ma in base all'ultimo codice che hai postato sembra che tu non abbia risolto il problema ma i dati copiato si incollano ancora nel foglio precedente. Per caso vuoi ancora continuare a risolvere questo problema oppure va bene così com'è ora il meccanismo?
il problema ma i dati copiato si incollano ancora nel foglio precedente
praticamente, la macro "trasferisci" mi incolla i dati del foglio precedente stando posizionato nel foglio immediatamente successivo, e questo mi va bene.
Visto che me lo chiedi, e ti ringrazio, "approfitto" per dirti se possiamo aggiungere una nuova istruzione, ovvero trasferire i dati dal foglio attivo a quello immediatamente successivo, sempre digitando il numero di contatore come già prevede la macro.
Si può fare ?
Grazie mille e spero di essermi spiegato
Si può fare ?
Certo, ma credo che era la richiesta iniziale. Quindi anziché prelevare i dati dal foglio precedente, li spostiamo dal foglio attuale al foglio successivo.
Una domanda. Se sei nel foglio "Dicembre", i dati dove dovranno andare?
EDIT: Ma tu i dati li vuoi Trasferire (cioè tagliarli dal Foglio attuale ed spostarli sul Foglio Successivo) oppure vuoi solo Copiarli ed Incollarli?
Altra domanda: ho visto che esegui un primo ciclo
DO...LOOPsu codice Contatore. Ma come mai? Può esserci più di un codice Contatore uguale?Capisco il secondo ciclo
DO...LOOPche chiedi se vuoi trasferire un nuovo codice, ma il primo mi sembra strano. In genere dovresti avere un codice Contatore univoco.1) si esatto, spostiamo dal foglio attivo al successivo facendo un'operazione di copia/incolla. No tagli
2) se possibile, sarebbe ottimale fare così:
a) dal foglio Dicembre tagliare i dati ed incollarli nel foglio Gennaio della medesima cartella di lavoro, quindi in poche parole fare undici passi indietro
b) allo stesso momento dell'azione al punto "a" appena descritto, cancellare tutti i dati di tutti i fogli (Febbraio - Novembre). E' chiaro che poi sarà mia cura "salvare con nome" per rinominare il file. Ovviamente, se necessario, nessun problema creare un nuovo pulsante "ad hoc" solo per l'azione di Dicembre; se non dovesse servire, meglio ancora
Spero di essermi spiegato e che il tutto sia fattibile.
Grazie mille !
Si, può capitare che in un foglio ci siano contatori uguali, ovviamente però riferiti allo stesso nominativo
Ciao @frasubb
ma quando sei a Dicembre e vuoi tagliare i dati per incollarli al foglio di Gennaio, i dati che già sono in Gennaio dovranno essere cancellati oppure no? Ovvero i dati provenienti da Dicembre dovranno accodarsi a quelli già presenti in Gennaio?
Se si dovranno accodare, allora non ci sono problemi, ma se bisogna prima cancellare quelli esistenti, le cose si complicano.
Tu immagina che oggi vuoi tagliare alcuni dati da Dicembre e metterli in Gennaio. La macro andrà a cancellare i dati esistenti per far posto a quelli di Dicembre. Poi diciamo che esegui di nuovo la macro per spostare altri dati di Dicembre in Gennaio. La macro andrà a cancellare di nuovo i dati in Gennaio (anche quelli precedentemente incollati prima da Dicembre). Non so se mi son spiegato. Ci vorrebbe una discriminante per evitare che vengano cancellati i dati tagliati ed incollato da Dicembre. Altrimenti tutte le volte andrà a cancellare i dati in Gennaio.
Poi un altro problema...se la macro dovrà cancellare anche i dati da Febbraio a Novembre, tutte le volte che lanci la macro con il foglio di Dicembre attivo, i dati da Febbraio a Novembre verranno, appunto, cancellati. Quindi immagina che per errore trasferisci dei dati da Dicembre a Gennaio, poi la macro ti andrà a cancellare a che quelli da Febbraio a Novembre. A quel punto le cose si complicano. Bisogna avere dei controlli a monte che ti avvisano che ti trovi nel foglio di Dicembre e che l'azione di "Trasferimento dati" comporta l'eliminazione di altri dati in altri fogli.
Secondo me la strada più comoda che non va a creare problemi, è questa:
Una volta che hai terminato con Novembre, ti salvi il file e ne crei una copia. Poi si utilizza una macro (diversa da quella che Trasferisce i dati), che ti va a cancellare tutti i dati da Febbraio a Novembre (poi se anche o dati di Gennaio dovranno essere cancellati allora sarà incluso anche quel Foglio). La lanci, i dati verranno cancellati, poi passi al mese di Dicembre ed utilizzi la macro per Trasferire i dati, che taglia i dati e li incolla in quello di Gennaio.
Poi altro consiglio che ti do, ho notato che ci sono delle regole di Formazione Condizionale. Per quel poco che ho visto, ci sarebbero degli errori. Mi sembra di aver notato che per ogni cella hai applicato una regola, che poi la regola, identica, si ripete per le celle intorno. Ad esempio in colonna A dove sono presenti i nominativi, ho visto che c'è la regola che se ci sono omonimie allora viene evidenziata la cella di una tonalità di verde. Ecco, lì avresti dovuto scegliere l'intera colonna e applicare la regola. Mentre a me sembra che tu abbia scelto singole celle e ad ogni cella hai creato la regola.
alexps81 ha scritto:
ma quando sei a Dicembre e vuoi tagliare i dati per incollarli al foglio di Gennaio, i dati che già sono in Gennaio dovranno essere cancellati oppure no? Ovvero i dati provenienti da Dicembre dovranno accodarsi a quelli già presenti in Gennaio?Buongiorno Alex, grazie ancora per la tua assistenza e professionalità.
Non preoccuparti, la macro operante nel solo foglio di dicembre deve "solo" copiare i dati in quanto il foglio di Gennaio lo svuoto io manualmente subito prima.
Ok per la cancellazione dei dati Febbraio-Novembre perché rinomino subito il file
Mi sembra che così possa andare, ovviamente dimmi te.
Grazie mille
Io mi sento di consigliarti una strategia diversa:
1) Il file che utilizzi lo rinomi come vuoi tu ma alla fine ci metti "-2025". Esempio "Database-2025.xlsm"
2) A questo punto finché operi tra Gennaio e Novembre, tutto prosegue come già detto. I dati vengono copiati ed incollati nel mese successivo.
3) Se operi nel mese di Dicembre possono accadere 2 cose: la prima...se il file relativo all'anno successivo ("Database-2026") NON esiste allora lo crea in automatico creando una copia esatta del 2025 ma cancella tutti i dati dei fogli Gennaio-Dicembre. Poi prende i dati di Dicembre del 2025 e li sposta in quello di Gennaio 2026. I dati di Dicembre 2025 che sono stati spostati verranno rimossi dal foglio.
La seconda cosa che può accadere è che se il file relativo al 2026 esiste, allora lo apre e sposta i dati nel foglio Gennaio 2026 accodandoli a quelli già esistenti. I dati di Dicembre 2025 verranno rimossi.
Potrebbe andare come soluzione?
3) Se operi nel mese di Dicembre possono accadere 2 cose: la prima...se il file relativo all'anno successivo ("Database-2026") NON esiste allora lo crea in automatico creando una copia esatta del 2025 ma cancella tutti i dati dei fogli Gennaio-Dicembre. Poi prende i dati di Dicembre del 2025 e li sposta in quello di Gennaio 2026. I dati di Dicembre 2025 che sono stati spostati verranno rimossi dal foglio
Questa è la soluzione a mio avviso ottimale, l'importante è che nel database 2025 i dati di Dicembre (2025) rimangano lì anche una volta spostati in Gennaio 2026.
Ho capito bene ?
i dati di Dicembre (2025) rimangano lì anche una volta spostati in Gennaio 2026.
Ahh....ok. pensavo dovessero cancellarsi da Dicembre. Ok meglio allora...ci risparmiamo dei passaggi.
Stasera ti aggiorno.
Ciao @frasubb
prova a dare uno sguardo al file allegato "Database-2025". Se esegui un Transfert tra i mesi Gennaio-Novembre allora i dati si copiano e incollano nel mese successivo (accodandosi ai dati già esistenti). Se esegui un Transfert su Dicembre allora la macro valuta se esiste un file (nello stesso percorso) chiamato "Database-2026". Se esiste allora accoda i dati a quelli già esistenti nel Foglio di Gennaio 2026. Se non esiste il file, allora lo crea e fa tutto il resto.
Fai delle varie prove per capire se tutto funziona bene.
Ti invito fortemente a rivedere tutta la parte dedicata alla Formattazione Condizionale nei vari fogli.
Allegati:
You must be logged in to view attached files.Ciao Alex,
provando la tua macro, funziona tutto tranne il fatto che in sede di trasferimento da un mese all'altro, la colonna denominata "scad. pag." (colonna F) riporta, nel mese successivo, una data completamente sballata.
Con la precedente macro, che ti ricordo trasferiva i record del mese precedente stando piazzato al mese immediatamente successivo, questa cosa non avveniva.
Visto che ci siamo, ti chiedo, sempre per favore, innanzitutto la cortesia di ripristinare il comportamento normale della macro, ma poi provo a chiedere:
1) in sede di trasferimento, spostare la scadenza di un mese esatto, nella situazione in cui il numero di rate residue (colonna K) sia maggiore di zero e che contemporaneamente la colonna M contenga "Si";
2) in sede di trasferimento, riportare nel nuovo mese la medesima data di scadenza presente nel precedente, qualora la colonna M del mese da cui andiamo a trasferire (vecchio mese), contenga "No"
Si può fare ?
Grazie infinite !
p.s. allego file non totalmente funzionante come sopra descritto
Allegati:
You must be logged in to view attached files.in sede di trasferimento da un mese all'altro, la colonna denominata "scad. pag." (colonna F) riporta, nel mese successivo, una data completamente sballata
Ok, risolto. Avevo messo come riferimento la colonna "K" anziché la "F" nella Function
DateAdd()Ora però non mi è ben chiaro il resto. Ho come l'impressione che le casistiche siano da definire meglio:
1) Se in cella di colonna "K" ho un numero > 0 e contemporaneamente in cella di colonna "M" è riportato "SI" allora aggiungo un mese alla data in "F"...se invece in "K" è > 0 e in cella di colonna "M" c'è scritto "NO", cosa succede?
2) Se in cella in colonna "M" risulta scritto "NO" allora lasciamo la data del mese precedente...ma questo a prescindere dal numero presente in cella di colonna "K"?
3) Se "K" risulta < 0 deve lasciare la data del mese precedente? Un po' come avviene nel secondo punto?
4) Nel codice che hai postato sin dall'inizio avevi messo una condizione più o meno simile a quanto hai descritto ma in più avevi messo che se si aggiunge il mese alla data in "K", poi in "M" e in "O" riporti la scritta "NO"
Comunque prova a riassumere meglio ed in modo più dettagliato tutte le casistiche.
Ciao Alex,
comincio doverosamente nel ringraziarti per il tempo che impieghi nel risolvermi i problemi che ti pongo, e sono tanti ! Grazie
Detto ciò, rispondo in ordine:
1) Se in cella di colonna "K" ho un numero > 0 e contemporaneamente in cella di colonna "M" è riportato "SI" allora aggiungo un mese alla data in "F"...se invece in "K" è > 0 e in cella di colonna "M" c'è scritto "NO", cosa succede?
se "K" >0 e colonna "M" = "Si" ..... allora "F" incrementa di un mese -----> se "K">0 e colonna "M" = "NO" .... allora "F" rimane uguale alla data riportata nel vecchio mese. Faccio presente che "K" non può mai essere <0
2) Se in cella in colonna "M" risulta scritto "NO" allora lasciamo la data del mese precedente...ma questo a prescindere dal numero presente in cella di colonna "K"?
Esatto !!
3) Se "K" risulta < 0 deve lasciare la data del mese precedente? Un po' come avviene nel secondo punto?
"K" non potrà mai essere inferiore a zero
4) Nel codice che hai postato sin dall'inizio avevi messo una condizione più o meno simile a quanto hai descritto ma in più avevi messo che se si aggiunge il mese alla data in "K", poi in "M" e in "O" riporti la scritta "NO"
Ignora le istruzioni del punto 4) ovvero non servono più, l'importante è che si riesca fare tutto quello descritto nei punti 1, 2, 3
-
AutoreArticoli
