› Sviluppare funzionalita su Microsoft Office con VBA › Textbox Userfom che riporta valore cella di un foglio specifico con valuta
-
AutoreArticoli
-
Ciao a tutti!
Ho un'altro problema..
In pratica vorrei che le mie textbox riportino i valori presenti di una specifica cella abbianata di un determinato foglio.
Per ora ho creato questa:
Private Sub UserForm_Initialize() Dim I As Long For I = 2 To 3 With Me.cboOperazione .AddItem Sheets("Impostazioni").Range("a" & I) End With Next I Dim f As Long For f = 2 To 5 With Me.cboMezzo .AddItem Sheets("Impostazioni").Range("b" & f) End With Next f Dim h As Long For h = 2 To 11 With Me.cboCerca .AddItem Sheets("Fatture").Range("b" & h) End With Next h Dim g As Long For g = 2 To 4 With Me.cboTipo .AddItem Sheets("Impostazioni").Range("c" & g) End With Next g TextBox7.Value = Sheets("Totale").Range("A2").Value TextBox5.Value = Sheets("Totale").Range("C2").Value TextBox6.Value = Sheets("Totale").Range("B2").Value End Sub
Tuttavia non riesco a trasformare i valori in valuta..
Al momento sto provando con questo codice:
Private Sub TextBox7_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) TextBox7 = Format(TextBox7, "#,###.#0 €") End Sub Private Sub TextBox5_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) TextBox5 = Format(TextBox5, "#,###.#0 €") End Sub Private Sub TextBox6_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) TextBox6 = Format(TextBox6, "#,###.#0 €") End Sub
Ma non funziona...
Come posso fare?
Grazie mille!
Ciao
Ricordati che ciò che esce da una TextBox è sempre una "stringa"
Prova così
TextBox5 = "€. " & Val(TextBox5)
oppure al contrario se preferisci il simbolo alla fine
Tieni comunque presente che è sempre una "stringa"
Ciao,
Mario
nell'evento Initialize della tua userform modifica la riga in questo modo, da questo
TextBox7.Value = Sheets("Totale").Range("A2").Value
a questo
TextBox7.Value = Format(Sheets("Totale").Range("A2").Value, "#,###.#0 €")
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )Ci sono riuscito!
Almeno sulla parte interessata.
Ora ho gli ultimi due problemi da risolvere prima di dire "ho completato il file" 😀 e uno riguarda sempre textbox e valuta.
1) Problema modifica dati con selezione fattura:
Tramite questo codice faccio apparire nella combobox chiamata "cboCerca" la lista delle fatture presente nel mio foglio "Fatture" della colonna B.
Private Sub UserForm_Initialize()
Dim h As Long
For h = 2 To 11
With Me.cboCerca
.AddItem Sheets("Fatture").Range("b" & h)
End With
Next h
End Sub
Il problema è che una volta inserita la prima fattura non la visualizza dentro la combobox (appare tutto vuoto), mentre se chiudo e riapro la userform viene fuori come se si aggiornasse.
Cosa devo fare per fare in modo che appaia da subito una volta inserita senza dover chiudere la Userform?
2) Problema textbox con inserimento dati cella con valuta
Attualmente se inserisco nella textbox l'importo della fattura me la riporta senza valore valuta, almeno che non divida i centesimi con il punto senza utilizzare la virgola. C'è un modo per trascrivere i dati su una cella tramite textbox sempre e comunque con la valuta a prescindere che si utilizzi il punto o la virgola?
Ho provato inserendo il codice, ma da quello che ho capito interviene solo sulla textbox, ma non su quello che viene trascritto in cella.
Attualmente se uso la virgola vengono fuori così senza il simbolo dell'euro e non vengono nemmeno calcolate nella foruma di somma:
Grazie mille!
Allego file di nuovo aggiornato.
Allegati:
You must be logged in to view attached files.la Sub UserForm_Initialize viene eseguita all'apertura della userform, quindi è inutile popolare qui la combobox, fallo tramite il pulsante conferma
Alla fine sono riuscito a sistemare il codice..
Tuttavia ha solo un problema e vi chiedo un consiglio.
Questo è il codice intero:
Private Sub btnInserisci2_Click() Dim numriga As Long numriga = 2 Do Until Sheets("Fatture").Cells(numriga, 2) = "" If Sheets("Fatture").Cells(numriga, 2) = cboCerca.Text Then Exit Do numriga = numriga + 1 Loop Foglio3.Cells(numriga, 1) = cboTipo.Text Foglio3.Cells(numriga, 2) = txtNfattura.Text Foglio3.Cells(numriga, 3) = TextBox8.Text * 1 numriga = Sheets("Totale").Range("A1").CurrentRegion.Rows.Count numriga = numriga + 0 Foglio4.Cells(numriga, 2) = TextBox6.Text cboCerca.Text = "" cboTipo.Text = "" txtNfattura.Text = "" TextBox8.Text = "" cboCerca.SetFocus '-------------------------------------------------------------------- '-------------------MODIFICA-------------------------------- '-------------------------------------------------------------------- cboCerca.Clear For h = 2 To 11 With Me.cboCerca .AddItem Sheets("Fatture").Range("b" & h) End With Next h '-------------------------------------------------------------------- MsgBox ("Inserimento eseguito con successo!") End Sub
Problema..
Se premo il commandbutton btnInserisci2 e lascio i campi vuoti non mi da nessun errore e fino a qui tutto bene.
Tuttavia se invece metto un valore nella combobox "cboTipo" e lascio vuota la TextBox8 dove solitamente inserisco l'importo e confermo con "btnInserisci2" mi appare il seguente errore:
e mi evidenzia la seguente stringa:
Cosa devo cambiare di quella stringa per evitare che si ripresenti l'errore?
Quel codice mi permette in pratica che venga sempre fuori la valuta anche se inserisco valori seprati da virgola tipo: 22,20 ecc..
Grazie mille!
prova a cambiare la riga con la seguente
Foglio3.Cells(numriga, 3) = Val(txtImporto.Text) * 1
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )Ho provato però non funziona 🙁
Mi da sempre lo stesso errore.
Foglio3.Cells(numriga, 3) = Val(txtImporto.Text) * 1
Forse voleva essere:
Foglio3.Cells(numriga, 3) = Val(textbox8.Text) * 1
Grazie mille! Con il tuo codice ho risolto 😊
Ultima domanda..
Ho notato che nella mia Userform veniva evidenziato come selezione il commandbutton "btnChiudi". Ma se io volessi che la selezione riguardasse una specifica TextBox? Grazie mille
I controlli espongono il metodo SetFocus che sposta su essi lo stato attivo (tranne casi particolari, ad esempio quando sono disabilitati o se il loro indice di tabulazione viene escluso o negli eventi di tastiera). Quindi con:
TextBox1.SetFocus
il textbox1 diventa il controllo attivo.
Ho provato il codice, funziona se faccio il test da VBA.
Ma se chiamo l'userform dal pulsante collegato a questa macro:
Sub Pulsante1_Click() If UserForms.Count > 0 Then Unload UserForm1 Else UserForm1.Show vbModeless End If End Sub
Si apre la Useform, ma non mi da la possibilità di scrivere nulla nella TextBox indicata (non mi appare il trattino di scrittura dentro come non fosse selezionata).
Da cosa può dipendere?
Il codice l'ho riportato qui:
Private Sub UserForm_Initialize() Dim I As Long For I = 2 To 3 With Me.cboOperazione .AddItem Sheets("Impostazioni").Range("a" & I) End With Next I Dim f As Long For f = 2 To 5 With Me.cboMezzo .AddItem Sheets("Impostazioni").Range("b" & f) End With Next f Dim h As Long For h = 2 To 11 With Me.cboCerca .AddItem Sheets("Fatture").Range("b" & h) End With Next h Dim g As Long For g = 2 To 6 With Me.cboTipo .AddItem Sheets("Impostazioni").Range("c" & g) End With Next g txtUtenza.SetFocus TextBox7.Value = Sheets("Totale").Range("A2").Value TextBox5.Value = Sheets("Totale").Range("C2").Value TextBox6.Value = Sheets("Totale").Range("B2").Value TextBox5 = Format(TextBox5, "#,###0.#0 €") TextBox6 = Format(TextBox6, "#,###0.#0 €") TextBox7 = Format(TextBox7, "#,###0.#0 €") End Sub
Grazie mille!
Purtroppo non mi da la possibilità di modificare il testo del messaggio precedente che risulta al quanto incomprensibile e mi scuso.
In sostanza ho inserito il codice seguente:
TextBox1.SetFocus
Funziona quando lo avvio tramite la Visual Basic (F5 - Esegui Sub/Userform), diversamente se apro la Userform attraverso la macro avviata da commandbutton appare così:
La textbox sarebbe quella accando a "utenza" e non appare il trattino in automatico per l'inserimento del testo, in più se provo a scrivere non succede nulla.
Il codice l'ho inserito qui:
Private Sub UserForm_Initialize() Dim I As Long For I = 2 To 3 With Me.cboOperazione .AddItem Sheets("Impostazioni").Range("a" & I) End With Next I Dim f As Long For f = 2 To 5 With Me.cboMezzo .AddItem Sheets("Impostazioni").Range("b" & f) End With Next f Dim h As Long For h = 2 To 11 With Me.cboCerca .AddItem Sheets("Fatture").Range("b" & h) End With Next h Dim g As Long For g = 2 To 6 With Me.cboTipo .AddItem Sheets("Impostazioni").Range("c" & g) End With Next g txtUtenza.SetFocus TextBox7.Value = Sheets("Totale").Range("A2").Value TextBox5.Value = Sheets("Totale").Range("C2").Value TextBox6.Value = Sheets("Totale").Range("B2").Value TextBox5 = Format(TextBox5, "#,###0.#0 €") TextBox6 = Format(TextBox6, "#,###0.#0 €") TextBox7 = Format(TextBox7, "#,###0.#0 €") End Sub
Va scritto in un posto diverso o in modo diverso?
Non spiego come mai funziona se avviato dalla Visual Basic (F5 - Esegui Sub/Userform) però..
Grazie mille!
Scusate il doppio post ma non riuscendo a modificare il precedente non si capiva nulla.
Va scritto in un posto diverso o in modo diverso?
Secondo me funziona però non te ne accorgi perchè hai anticipato troppo l'istruzione. Credo infatti che impostare i vari Value e Format imponga al compilatore di spostarsi sui vari controlli per determinarne l'output. Sposta quindi la SetFocus subito prima di End Sub e vediamo che succede.
Secondo me funziona
Ho fatto dei test, non funziona 🙂 l'inghippo è dovuto probabilmente al fatto che il form viene invocato, dal pulsante sul foglio, in modalità modeless, il che restituisce il controllo al foglio e ruba quindi lo stato attivo ai controlli del form. Questo peraltro non espone un metodo SetFocus quindi secondo le mie prove dovresti cavartela con un arrangiamento: un sub pubblica che simula la pressione dei tasti freccia giu e freccia su per spostarsi e poi tornare al controllo desiderato.
Eccoti le modifiche da provare:
'codice del pulsante: Sub Pulsante1_Click() If UserForms.Count > 0 Then Unload UserForm1 Else UserForm1.Show vbModeless UserForm1.showcaret End If End Sub
nel form aggiungi la sub pubblica showcaret():
Public Sub showcaret() txtUtenza.SetFocus SendKeys "{DOWN}{UP}" End Sub
Grazie mille! Sono riuscito a risolvere grazie al tuo aiuto 🙂
Avrei un ultima cosa da chiedere.
Non avevo calcolato che se mi salvano la ricevuta con i dati inseriti dovevo creare anche un pulsante per il reset.
Ci sono riuscito creando questa macro che parte all'apertura del file excel o premendo sul pulsante dedicato:
Sub Nuova() ' ' Nuova Macro ' ' Sheets("Cliente").Select Range("A2:D2").Select Selection.ClearContents Range("A2").Select Sheets("Fatture").Select Range("A2:C11").Select Selection.ClearContents Range("A2").Select Sheets("Totale").Select Range("B2").Select Selection.ClearContents Sheets("Ricevuta").Select End Sub
L'unica cosa che mi da fastidio a livello estetico è che quando apro il file o resetto si vedono delle righe sullo sfondo per alcuni frangenti di secondo.
C'è la possibilità di evitare questo elemento di disturbo grafico?
Grazie mille!
Puoi utilizzare il metodo che disabilita l'aggiornamento dello schermo, da riabilitare all'uscita della sub:
Application,.ScreenUpdating = False '(e chiaramente True alla fine)
Ti aggiungo che tutti quei Select non son necessari:
Sub Nuova() ' ' Nuova Macro ' Application.ScreenUpdating = False WorkSheets("Cliente").Range("A2:D2").ClearContents WorkSheets("Fatture").Range("A2:C11").ClearContents WorkSheets("Totale").Range("B2").ClearContents WorkSheets("Ricevuta").Select Application.ScreenUpdating = True End Sub
Funziona alla grande! 😀
Stavo pensando però ad un'ultima cosa..
Pensavo di aggiungere la funzione che invia direttamente tramite mail in formato PDF la ricevuta.
Tramite la registrazione di macro ho seguito il percorso corretto, tuttavia quando l'attivo viene fuori in formato Excel e non PDF.
Ecco il codice:
Sub Invia() ' ' Invia Macro ' ' ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ "C:\Users\CASTEL~1\AppData\Local\Temp\01.11.19 RICEVUTA DI PAGAMENTO_new_2019.pdf" _ , Quality:=xlQualityStandard, IncludeDocProperties:=False, _ IgnorePrintAreas:=False, OpenAfterPublish:=False Application.Dialogs(xlDialogSendMail).Show End Sub
Io vorrei che uscisse in PDF direttamente.. come si può fare?
Inoltre volevo chiederti se è possibile tramite un commandbutton chiudere oltre all'useform (che sono riuscito a creare) anche l'intero foglio Excel.
Ho trovato questo codice, ma chiude anche altri file Excel che ho aperto:
Private Sub btnChiudi_Click() Application.Quit End Sub
Io invece vorrei chiudere solo il file della ricevuta.
Grazie mille! 🙂
Fatte queste modifiche avrò completato finalmente il mio file ricevute che condividerò volentieri
Io vorrei che uscisse in PDF direttamente.. come si può fare?
Il metodo che hai giustamente provato si preoccupa di allegare il foglio attivo a una mail. L'unica strada è pilotare Outlook da Excel mediante automazione (vale se usi questo client di posta, altrimenti è una faccenda diversa): una volta generato il pdf e salvato con un percorso e nome preciso, crei un oggetto MailItem cui alleghi il file pdf, scrivi l'oggetto e il corpo della mail da codice, inserisci il destinatario e spedisci. Diverse volte ne abbiamo parlato anche qui in forum,. Una breve ricerca e trovi tutto.
Io invece vorrei chiudere solo il file della ricevuta.
Se hai aperto un file separato con un nome preciso, che tu conosci a priori, il comando:
Windows("nomefilefattura.xlsx").Close False
provvede a chiudere il file con quel nome preciso (e lo chiude senza salvare le modifiche: metti True se vuoi salvare le modifiche).
Sub Invia() ' --> User settings, change to suit Const IsDisplay As Boolean = True ' Change to False to .Send instead of .Display Const IsSilent As Boolean = False ' Change to True to Send without the confirmation MsgBox ' <-- End of settings Dim IsCreated As Boolean Dim i As Long Dim PdfFile As String Dim OutlApp As Object Dim char As Variant ' ' Define PDF filename PdfFile = Range("C15").Value '===============>> CELLA CONTENENTE IL MESE ' Replace unallowed symbols by the underscore char For Each char In Split("? "" / \ < > * | :") PdfFile = Replace(PdfFile, char, "_") Next ' Add %TEMP% path to the file name and limit too long pathname PdfFile = Left(Environ("TEMP") & "\" & PdfFile, 251) & ".pdf" ' Export an active sheet as PDF With ActiveSheet .ExportAsFixedFormat Type:=xlTypePDF, _ Filename:=PdfFile, _ Quality:=xlQualityStandard, _ IncludeDocProperties:=True, _ IgnorePrintAreas:=False, _ From:=1, To:=1, _ OpenAfterPublish:=False End With ' Use already open Outlook if possible On Error Resume Next Set OutlApp = GetObject(, "Outlook.Application") If Err Then Set OutlApp = CreateObject("Outlook.Application") IsCreated = True End If On Error GoTo 0 ' Prepare e-mail with PDF attachment With OutlApp.CreateItem(0) ' Prepare e-mail .Attachments.Add PdfFile ' Try to send or just display the e-mail On Error Resume Next If IsDisplay Then .Display Else .Send ' Show error of .Send method If Not IsDisplay Then ' Return focus to Excel's window Application.Visible = True ' Report on error or success If Err Then MsgBox "E-mail was not sent for some reasons" & vbLf & "Please check it", vbExclamation .Display Else If Not IsSilent Then MsgBox "E-mail successfully sent", vbInformation End If End If End If On Error GoTo 0 End With ' Delete PDF file Kill PdfFile ' Quit Outlook if it was created by this code If IsCreated Then OutlApp.Quit ' Release memory of the object variable Set OutlApp = Nothing End Sub
Ho trovato questo codice che sembra funzionare.
Ho cancellato alcune parti che mi sembravano in più.
Tuttavia cosa devo modificare per fare in modo che il PDF contenga il nome del file?
' Define PDF filename PdfFile = Range("C15").Value '===============>> CELLA CONTENENTE IL MESE
Questa sembra la parte da variare, ma non so come.
Poi volevo chiederti se su tale codice che ho inserito ci sono altre parti che posso cancellare che non servono.
A me basta che apra la mail con dentro il file pdf.
Ho cancellato alcune parti che mi sembravano in più.
Veramente a me sembra un ottimo codice, niente da eliminare a parte il MsgBox iniziale, del tutto inutile, e a parte che devi inserire destinatario, oggetto e corpo del testo (lo puoi fare anche da codice ovviamente).
cosa devo modificare per fare in modo che il PDF contenga il nome del file?
Devi assegnare alla variabile di testo "pdffile" il percorso e il nome del pdf da allegare. Il codice che proponi pesca questo nome dalla cella C15 del foglio attivo. Tu invece hai passato a ExportAsFixedFormat questo valore:
Filename:= "C:\Users\CASTEL~1\AppData\Local\Temp\01.11.19 RICEVUTA DI PAGAMENTO_new_2019.pdf"
e pertanto è questa stringa che devi assegnare a pdffile affinchè il pdf venga allegato alla mail. Più o meno così:
' Prepare e-mail pdffile = "C:\Users\CASTEL~1\AppData\Local\Temp\01.11.19 RICEVUTA DI PAGAMENTO_new_2019.pdf" .Attachments.Add PdfFile
Ci sono riuscito 😀 Grazie mille!
Per rendere il tutto perfetto come vorrei volevo chiederti se è possibile fare una cosa del genere.
Ho una combobox che ha il compito di creare una lista aggiornata delle fatture che inserisco per un massimo di 10.
questo è il codice per prendere la lista delle fatture:
Private Sub UserForm_Initialize() Dim h As Long For h = 2 To 11 With Me.cboCerca .AddItem Sheets("Fatture").Range("b" & h) End With Next h End Sub
Poi ho inserito un'altro codice che si occupa di aggiornare la lista della combobox cboCerca ogni volta che premo il commandbutton btnInserisci2, in più mi permette selezionandola di modificare i dati relativi a quella specifica fattura:
Private Sub btnInserisci2_Click() Dim numriga As Long numriga = 2 Do Until Sheets("Fatture").Cells(numriga, 2) = "" If Sheets("Fatture").Cells(numriga, 2) = cboCerca.Text Then Exit Do numriga = numriga + 1 Loop cboCerca.Clear For h = 2 To 11 With Me.cboCerca .AddItem Sheets("Fatture").Range("b" & h) End With Next h End Sub
Ora la mia domanda è questa.
E' possibile quando seleziono il numero fattura dalla combobox cbocerca che le rispettive textbox (sono tre: Tipo, N. Fattura e Importo) si riempiono con i dati della fattura selezionata in automatico?
Al momento i campi delle textbox rimangono vuoti e se modifico la fattura devo inserire per forza tutti e tre i dati nuovamente, altrimenti mi sovrascrive il valore vuoto cancellandomi di fatto quelli della cella collegata.
Grazie mille!
Nel mentre cerco di capire la tua domanda, cosa che non mi è facilissima senza uno scenario davanti, ti faccio pensare sul fatto che nel codice che vedo (in btnInserisci2) utilizzi un modo piuttosto lento per individuare il contenuto di cboCerca all'interno del foglio Fatture, colonna B. Il codice parte da riga 2 e le scorre tutte finchè non trova in colonna B il contenuto di cboCerca (che presumo sia un numero di fattura). C'è un sistema più veloce, che richiede meno righe di codice (due sole in effetti): consiste nell'utilizzare il metodo Find dell'oggetto Range. Se ti interessa, approfondiamo.
Anche riempire una combobox richiede meno codice (con List o RowSource, dipende dall'applicazione).
Credo di aver capito la tua domanda: tu selezioni un numero fattura, inserendola in cboCerca. Di conseguenza le altre textbox devono riempirsi con i valori corrispondenti, presi sempre dal foglio Fatture.
La risposta a questo quesito l'ho già data, quasi inconsapevolmente, quando ti ho suggerito poco fa di utilizzare Find nella colonna B per cercare il numero di fattura. Il risultato di Find è un oggetto range, cioè la cella dove trovasi il dato cercato, e quindi a partire da tale cella puoi recuperare i valori delle celle precedenti e successive. Più complicato a dire che a codificare 🙂
Vuoi provarci, studiandoti il metodo Find di Range, o preferisci un aiuto più spinto?
Se mi potessi dare un aiuto più spinto te ne sarei davvero grato. Tutto quello che ho fatto finora lo devo unicamente alle persone come te che con molta disponibilità e pazienza mi spiegano come fare 😁 io mi limito ad apprendere poi a tentativi, osservando gli effetti e modificando. Se vuoi domani volentieri ti allego direttamente il file così vedi meglio come l'ho strutturato. Essenzialmente il cbocerca mi serve per dare una selezione alla riga da modificare partendo dal numero fattura. Ho fatto un totale di 10 righe, suddivise su tre colonnne: A1 "Tipo" - B1 "Fattura" - C1 "Importo". Cbocerca mi trova tutte le fatture nella colonna B. Io vorrei che nelle TextBox (che inseriscono i valori delle tre colonne A, B, C) vengano riportati in automatico i valori della fattura selezionata in cbocerca 😂 non so se mi sono spiegato,alla fine è più complicato da descrivere
-
AutoreArticoli