› Sviluppare funzionalita su Microsoft Office con VBA › CommandButton per salvataggio valori celle su altro foglio Excel
-
AutoreArticoli
-
Ciao a tutti!
Avrei necessità per velocizzare il salvataggio di alcuni dati di creare un commandbutton che trasferisca i valori di determinate celle su un'altro foglio Excel.
Mi spiego meglio:
Ho un file Excel chiamato "Modello Ricevuta".
All'interno ho un foglio chiamato "Fatture" diviso in tre colonne:
Colonna A: Tipologia di fatture (esempio Nota di credito, ecc)
Colonna B: Numeri delle fatture
Colonna C: Importo
Io dovrei trasferire i dati di queste celle tramite il click del commandbutton "btnCassa" su un'altro foglio Excel chiamato "Cassa".
Come faccio a trasferire i dati da un foglio all'altro?
Grazie mille!
Allego i due file
Allegati:
You must be logged in to view attached files.Stai facendo confusione tra Foglio e File, dagli allegati si evince che Cassa è un altro file e non un foglio di Modello Ricevuta. Comunque potresti iniziare utilizzando il registratore di macro
Riflettendoci meglio credo che la soluzione migliore sia gestire il tutto da un file unico.
A tal proposito la mia idea sarebbe questa.
Vorrei che mentre compilo la ricevuta i dati vengano trascritti in automatico nelle celle apposite del foglio "Contanti".
Dando un'occhio al file che vi allego aggiornato come mi consigliate di procedere?
Qual'è la maniera più pratica e veloce?
Ho provato tramite codice VBA applicato sul commandbutton di inserimento dati, il problema è che se dovessi inserire il numero di fattura errato verrebbe replicato anche nel foglio "contanti" e la correzzione sarebbe al quanto complessa.
Con la macro invece sto avendo un pò di difficoltà per quanto riguarda il foglio "contanti" colonna "descrizione movimento".
Come faccio ad inserire i vari numeri fatture dentro quella stessa cella?
Grazie mille!
Allegati:
You must be logged in to view attached files.Ok sono riuscito a creare una macro per l'inserimento dei dati nel foglio contanti.
Sub Contanti() ' ' Contanti Macro ' ' Sheets("Contanti").Select Range("A4").Select ActiveCell.FormulaR1C1 = Sheets("Ricevuta").Range("C15").Value Sheets("Contanti").Select Range("B4").Select ActiveCell.FormulaR1C1 = Sheets("Cliente").Range("B2").Value Sheets("Contanti").Select Range("C4").Select ActiveCell.FormulaR1C1 = Sheets("Cliente").Range("C2").Value Sheets("Contanti").Select Range("D4").Select ActiveCell.FormulaR1C1 = Sheets("Totale").Range("A2").Value Sheets("Contanti").Select Range("E4").Select ActiveCell.FormulaR1C1 = Sheets("Fatture").Range("A2").Value End Sub
Tuttavia ho tre problemi:
1) Come faccio ad inserire nel foglio "Contanti" cella "E4" i valori del foglio "Fatture" celle "A2:B2"?
Esempio: Prendiamo il foglio "Fatture". Nella cella "A2" c'è scritto "SALDO FT." e nella "B2" 201800...
Vorrei che nella cella E4 (foglio "Contanti") apparisse assieme SALDO FT. 201800....
2) Dovrei anche inserire quelli seguenti (in tutto sono 10 fatture) e separarle con una virgola.
Esempio: SALDO FT. 201800000000, SALDO FT. 201820000000.. e così via...
3) Avviata la macro poi aggiungerei la funzione di salvataggio automatico del file. L'unico problema è come passare alla riga seguente del foglio "Contanti" ogni volta che inserisco una nuova ricevuta.
Grazie mille!
La tua macro può essere semplificata così
`Sub Contanti() Sheets("Contanti").Range("A4").Value = Sheets("Ricevuta").Range("C15").Value Sheets("Contanti").Range("B4") = Sheets("Cliente").Range("B2").Value Sheets("Contanti").Range("C4") = Sheets("Cliente").Range("C2").Value Sheets("Contanti").Range("D4") = Sheets("Totale").Range("A2").Value Sheets("Contanti").Range("E4") = Sheets("Fatture").Range("A2").Value & "," & Sheets("Fatture").Range("B2").Value End Sub`
Grazie mille!
Il codice funziona perfettamente, ora ho inserito anche le altre celle in quanto possono essere inserite fino a 10 fatture diverse.
Ora però mi servirebbe fare in modo che salti le righe occupate in automatico in modo che non si sovrascriva.
Come posso fare?
Al momento il codice è questo:
Sub Contanti() ' ' Contanti Macro ' ' Sheets("Contanti").Range("A4").Value = Sheets("Ricevuta").Range("C15").Value Sheets("Contanti").Range("B4") = Sheets("Cliente").Range("B2").Value Sheets("Contanti").Range("C4") = Sheets("Cliente").Range("C2").Value Sheets("Contanti").Range("D4") = Sheets("Totale").Range("A2").Value Sheets("Contanti").Range("E4") = Sheets("Fatture").Range("A2").Value & " " & Sheets("Fatture").Range("B2").Value & "," & Sheets("Fatture").Range("A3").Value & " " & Sheets("Fatture").Range("B3").Value & "," & Sheets("Fatture").Range("A4").Value & " " & Sheets("Fatture").Range("B4").Value & "," & Sheets("Fatture").Range("A5").Value & " " & Sheets("Fatture").Range("B5").Value & "," & Sheets("Fatture").Range("A6").Value & " " & Sheets("Fatture").Range("B6").Value & "," & Sheets("Fatture").Range("A7").Value & " " & Sheets("Fatture").Range("B7").Value & "," & Sheets("Fatture").Range("A8").Value & " " & Sheets("Fatture").Range("B8").Value & "," & Sheets("Fatture").Range("A9").Value & " " & Sheets("Fatture").Range("B9").Value & "," & Sheets("Fatture").Range("A10").Value & " " & Sheets("Fatture").Range("B10").Value & "," & Sheets("Fatture").Range("A11").Value & " " & Sheets("Fatture").Range("B11").Value & "." End Sub
Così facendo però se inserisco solo una fattura mi rimangono le varie virgole e il punto finale con lo spazio vuoto in mezzo.
Esiste un modo per fare inserire le virgole solo una volta inserito il numero fattura?
Grazie
devi usare un ciclo for che ti concatena le celle solo se piene, se non riesci allega un file di esempio semplificato senza userform
Allego il file semplificato senza Userform con presente solo la Macro per il trasferimento dei dati nel foglio "Contanti".
Avrei bisogno anche che non mi appaiono le virgole dove non è presente il numero fattura nella colonna descrizione movimento.
Grazie mille!
Allegati:
You must be logged in to view attached files.Io ho provato in diversi modi ma non riesco a fare in ciclo for con condizionale "solo se celle sono vuote"..
Cosa devo inserire? 🙁
Grazie mille!
hai allegato un file praticamente senza dati, per capire occorre un esempio realistico con anche il risultato desiderato
Una cosa così?
s = "" With Worksheets("fatture") For Each ce In .Range("A2..A11") If ce.Offset(, 1) <> "" Then s = s & ce & ce.Offset(, 1) & ", " End If Next End With s = Left(s, Len(s) - 2) Worksheets("Contanti").Range("E4") = s
Però manca Option Explicit nel file di esempio e dubito che tu lo abbia nel file reale. Consiglio di inserirlo.
Allego il file con tutti i dati come esempio 🙂
Vecchio frac, intanto grazie come sempre per il tuo aiuto.
Tuttavia non me ne intendo di Option Explicit.. cosa dovrei aggiungere al codice?
Il file che ho allegato nuovo può esserti utile eventualmente?
Grazie ancora
Allegati:
You must be logged in to view attached files.Option Explicit è solo un’istruzione che rende obbligatoria la dichiarazione delle variabili e si mette in cima ad ogni modulo.
Si può anche impostare l’editor di VBA in modo che lo faccia lui automaticamente (fai qualche ricerca con Google)
Alfredo
Il codice così funziona:
Sub Contanti() ' ' Contanti Macro ' ' Dim Rng As Range s = "" With Worksheets("Fatture") For Each ce In .Range("A2..A11") If ce.Offset(, 1) <> "" Then s = s & ce & ce.Offset(, 1) & ", " End If Next End With s = Left(s, Len(s) - 2) Worksheets("Contanti").Range("E4") = s End Sub
però non mi salta la riga e non capisco il motivo..
Inoltre vorrei aggiungere anche i campi delle colonne: data, cliente, nome, importo e saldo.
Ho provato replicando il codice e cambiando i parametri ma non mi funziona.
però non mi salta la riga e non capisco il motivo
Io invece trovo che funziona (ho preso a modello l'ultimo file che hai allegato). Se cancello un numero fattura, nella cella E4 del foglio "contanti" quel numero fattura non viene riportato. Probabilmente quindi non ho capito cosa intendi.
vorrei aggiungere anche i campi delle colonne
Bè ragiona su questo: il codice così com'è costruito funziona solo inserendo nella cella E4 del foglio "Contanti" le informazioni che hai scelto. Io presumo che tu vorrai avere queste informazioni su righe diverse, al cambiare del cliente o al cambiare della data (questo non lo so, non ho letto tutto il thread e potrei sbagliare). Perciò devi prima stabilire quale sarà la riga di "Contanti" che dovrà contenere le informazioni, e poi prelevare (dalla medesima riga in cui, in colonna E, metti la descrizione dei movimenti) i dati rimanenti.
Mi spiego meglio.
Io dovrei trasferire oltre alla descrizione dei movimenti con i dati delle fatture (che con il tuo codice funziona perfettamente), anche le seguenti celle:
Foglio "Ricevute" Cella "C15" deve essere trascitta nel foglio "Contanti" cella "A4"
Foglio "Cliente" Cella "B2" deve essere trascitta nel foglio "Contanti" cella "B4"
Foglio "Cliente" Cella "C2" deve essere trascitta nel foglio "Contanti" cella "C4"
Foglio "Totale" Cella "A2" deve essere trascitta nel foglio "Contanti" cella "D4"
Questo sempre saltando la riga assieme alla descrizione dei movimenti 🙂
Ho provato a modificare il codice, ma non so come fare..
Allegati:
You must be logged in to view attached files.Ho provato a modificare il codice, ma non so come fare
Non capisco. A me sembra troppo semplice.
Option Explicit Sub Contanti() Dim s As String Dim ce As Range s = "" With Worksheets("Fatture") For Each ce In .Range("A2..A11") If ce.Offset(, 1) <> "" Then s = s & ce & ce.Offset(, 1) & ", " End If Next End With s = Left(s, Len(s) - 2) With Worksheets("Contanti") .Range("A4") = Worksheets("Ricevuta").Range("C15") .Range("B4") = Worksheets("Cliente").Range("B2") .Range("C4") = Worksheets("Cliente").Range("C2") .Range("D4") = Worksheets("Totale").Range("D4") .Range("E4") = s End With End Sub
Cosa intendi quando dici questo?
Questo sempre saltando la riga assieme alla descrizione dei movimenti
Grazie infinite vecchio frac 🙂
Il codice va benissimo.
L'unica cosa che manca è che ogni volta che avvio la macro passi alla riga successiva del foglio contanti.
In pratica io avvierò la macro una volta completa la ricevuta e potrebbe essere che finita una ne inserisca una nuova
Allegati:
You must be logged in to view attached files.passi alla riga successiva
Quindi naturalmente invece che A4, B4, C4 e così via, deve esserci un riferimento alla prima riga vuota: A..., B..., C...
Non ti resta che calcolarla prima del With e utilizzare tale riferimento di riga nel range.
Option Explicit Sub Contanti() Dim s As String Dim ce As Range Dim ultimariga As Long s = "" With Worksheets("Fatture") For Each ce In .Range("A2..A11") If ce.Offset(, 1) <> "" Then s = s & ce & ce.Offset(, 1) & ", " End If Next End With s = Left(s, Len(s) - 2) With Worksheets("Contanti") ultimariga = .Range("A" & .Range("A:A").Rows.Count).End(xlUp).Row + 1 .Range("A" & ultimariga) = Worksheets("Ricevuta").Range("C15") .Range("B" & ultimariga) = Worksheets("Cliente").Range("B2") .Range("C" & ultimariga) = Worksheets("Cliente").Range("C2") .Range("D" & ultimariga) = Worksheets("Totale").Range("A2") .Range("E" & ultimariga) = s End With End Sub
Ricordati sempre Option Explicit in testa ai tuoi moduli.
Ti adoro!
Funziona esattamente come desideravo!
Grazie, grazie e grazie! 🙂
Posso chiederti un'ultima cosa?
Se ad esempio ho una Combox con due possibili selezioni "Contanti" e "Bancomat" è possibile con questo tuo codice scrivere i dati in un foglio diverso a seconda di quello che metto nella Combobox?
La mia idea è aggiungere oltre al foglio "Contanti" anche uno chiamato "Bancomat" perché in azienda li tieniamo divisi.
Grazie mille!
Se ad esempio ho una Combox con due possibili selezioni
Il controllo Combobox è dentro un Userform o direttamente sul foglio Excel?
In questo secondo caso, è un controllo modulo o un controllo ActiveX?
Il codice da scrivere differisce un po' a seconda dei casi, ma una volta stabilito con esattezza di cosa stiamo parlando, potrai adattare la riga
With Worksheets("Contanti")
per adeguarla alla nuova esigenza e diventerà simile a questa:
With Worksheets(valore_restituito_dal_combobox)
Grazie! Ora provo 🙂
Ora però ho un problema nuovo con la Useform con multipage.
In pratica mi viene fuori questo errore quando l'avvio e non capisco da cosa dipende..
Allego il file..
L'errore si è presentato dopo che nello Sviluppo della Useform ho semplicemente selezionato una page di apertura diversa.
Come risolvo?
Grazie mille!
Allegati:
You must be logged in to view attached files.Grazie mille! Ora funziona 🙂
Domanda, se volessi che il valore numerico della cella C11 del foglio "Versamento" fosse tramutata in negativo con questa macro, cosa dovrei cambiare?
Option Explicit Sub Registra() Dim answer As Integer answer = MsgBox("Registrare il versamento cassa?", vbYesNo + vbQuestion, "Microsoft Excel") If answer = vbYes Then Dim s As String Dim ce As Range Dim ultimariga As Long s = "VERSAMENTO CASSA" With Worksheets("Versamento") For Each ce In .Range("A1") If ce.Offset(, 1) <> "" Then s = s & ce & ce.Offset(, 1) & "" End If Next End With s = Left(s, Len(s) - 0) With Worksheets("Prima nota cassa") ultimariga = .Range("A" & .Range("A:A").Rows.count).End(xlUp).Row + 1 .Range("A" & ultimariga) = Worksheets("Ricevuta").Range("C15") .Range("D" & ultimariga) = Worksheets("Versamento").Range("C11") .Range("E" & ultimariga) = s End With Application.Wait Now + TimeValue("0:00:01") MsgBox "Registrazione del versamento effettuata." Else 'do nothing End If End Sub
Grazie mille!
-
AutoreArticoli