› Sviluppare funzionalita su Microsoft Office con VBA › formattare Textbox
-
AutoreArticoli
-
Ciao a tutti,
avrei la necessità di formattare la textbox chiamata "TxtDebOrig", facendo sì che mentre scrivo l'importo dentro di essa, si compili automaticamente nel formato "XX.XXX,XX"
Grazie mille in anticipo a chi vorrà aiutarmi
Questa è una procedura che utilizzo spesso in questi casi:
in un Modulo Standard ci metti questo
Sub valuta_in_TextBox(ByVal TB As MSForms.TextBox) Dim testo As String Dim valore As Double Static blLock As Boolean On Error GoTo safetyExit If blLock Then Exit Sub testo = Trim(Replace(Replace(TB.Text, ",", ""), ".", "")) If testo = "" Then Exit Sub valore = CDbl(testo) / 100 blLock = True TB.Text = Format(valore, "#,##0.00") TB.SelStart = Len(TB.Text) safetyExit: blLock = False End Subpoi all'evento Change della TextBox che ti interessa ci scrivi questo (esempio per la TextBox
TxtDebOrig)Private Sub TxtDebOrig_Change() valuta_in_TextBox TxtDebOrig End SubMa puoi adottare lo stesso metodo ad altre TextBox identiche.
Volendo darti una spiegazione...all'evento Change della TxtDebOrig, viene richiamata ogni volta la Sub valuta_in_TextBox che accetta come parametro proprio la TxtDebOrig. Se hai bisogno di altre spiegazioni sul comportamento della Sub valuta_in_TextBox chiedi pure.
ciao
altra soluzione, va cambiato il nome Textbox1
`Private Sub TextBox1_Change() Dim num As String, k As Integer, i As Integer, txtb As String If InStr(Textbox1, ",") > 0 Then Exit Sub If Not IsNumeric(Textbox1) Then Textbox1 = "": Exit Sub End If num = "": k = 0: txtb = Replace(Textbox1, ".", "") If Len(txtb) > 3 Then For i = Len(txtb) To 1 Step -1 k = k + 1: num = Mid(txtb, i, 1) & num If k Mod 3 = 0 And i > 1 Then num = "." & num Next i End If If num <> "" Then Textbox1 = num End Sub`Ciao @alexps81 e ovviamente grazie del tuo suggerimento.
Funziona tutto bene nella textbox, però queste modifiche da te suggerite mi hanno inibito il buon funzionamento del tasto TAB, cioè se lo spingo non mi consente di passare alla successiva textbox presente nella userform, bensì mi aggiunge delle tabulazioni all'interno della textbox dove mi trovo in quel momento. Se invece la textbox in quel momento attiva è vuota, allora il TAB funziona e mi sposta regolarmente alla successiva.
Spero di essermi spiegato. Si può risolvere ?
Il buon funzionamento del tasto TAB è per me essenziale
Grazie
Ciao @lukereds e grazie come sempre per il tuo supporto.
Io ho inserito il tuo codice all'interno dell'evento change della textbox TxtDebOrigin, sostituito il nome della stessa a TextBox1, ma nella user non cambia niente ovvero scrivo i numeri come se non avessi apportato alcuna modifica
ciao,
allego il file, vuoi ottenere quanto in immagine corretto?
Allegati:
You must be logged in to view attached files.@alexps81 ora sembra funzionare la formattazione dei numeri (io non ho fatto niente di diverso da prima ...), però quando vado a confermare con il tasto per trasferire i dati dalla user al foglio, mi evidenzia in giallo, quindi è un errore, questa riga di codice
arr(nRows, 6) = CDate(Format(TxtScadPag, "dd/mm/yy")) 'F '<-- da replicare@lukereds grazie mille ma con il codice che ho io, quando vado a trasferire i dati da user a foglio, mi da errore
prova ad allegare il tuo codice che gestisce la textbox (meno righe possibili)
Comunque il funzionamento della sub precedente, nel mio file allegato, è quello che ti serve?
prova ad allegare il tuo codice che gestisce la textbox (meno righe possibili)
sono tante righe ..... non saprei quali scegliere
nel mio file allegato, è quello che ti serve?
si, sarebbe ok anche se preferirei la modalità che compila automaticamente il l'importo
Questa è una procedura che utilizzo spesso in questi casi:
ora funziona ma poi quando vado ad inserire i dati sul foglio, mi blocca segnalando questo errore di cui allego screen.
Tengo a precisare che io non ho cambiato niente per far si che si alterni il funzionamento di una cosa piuttosto che l'altra, fa tutto da solo random
Allegati:
You must be logged in to view attached files.Ciao @frasubb, a me non da alcun problema di questi da te segnalati:
mi hanno inibito il buon funzionamento del tasto TAB
quando vado a confermare con il tasto per trasferire i dati dalla user al foglio, mi evidenzia in giallo, quindi è un errore, questa riga di codice
quando vado ad inserire i dati sul foglio, mi blocca segnalando questo errore di cui allego screen.
Prova ad allegare il file con il codice e le modifiche suggerite. Spiega bene in quale situazione riscontri problemi.
preferirei la modalità che compila automaticamente il l'importo
Cosa intendi con compilare automaticamente?
Cosa intendi con compilare automaticamente?
che il numero si compila mentre lo scrivo. da destra a sinistra, sapendo che ci sono due decimali
Ciao @alexps81 ora sembra funzionare il tasto TAB, ma lo faceva anche ieri e poi decideva lui quando dare errore.
Evidenzio anche il fatto che il codice relativo al tasto "Inserisci" della userform, non mi calcola più esattamente (vedi file allegato) i giorni della colonna G, che non sono altro che la differenza tra la cella V2 (che rimane fissa) e quelle dinamiche della colonna G oggetto di inserimento dati. E' fondamentale che calcoli bene, come fare per risolvere ?
Grazie mille
Allegati:
You must be logged in to view attached files.quando vado ad inserire i dati sul foglio, mi blocca segnalando questo errore di cui allego screen
Ok questo l'ho risolto. In pratica siccome adesso le TextBox dove indichi le valute ( ad esempio la TxtDebOrigin) vengono gestite da una macro che gli applica una formattazione specifica, non è più necessaria la trasformazione con Replace dei punti e delle virgole con il Separatore dei decimali come si è fatto fin ora qui:
If Not IsEmpty(arr(r, 8)) And IsNumeric(arr(r, 8)) Then Cells(r + 1, "H").NumberFormat = "#,##0.00" s = arr(r, 8) s = Replace(s, ".", Application.DecimalSeparator) '<---qui s = Replace(s, ",", Application.DecimalSeparator) '<---qui Cells(r + 1, "H").Value = CDbl(s) Else Cells(r + 1, "H").NumberFormat = "@" End IfComunque pubblicherò la soluzione non appena spieghi meglio questa situazione:
non mi calcola più esattamente (vedi file allegato) i giorni della colonna G, che non sono altro che la differenza tra la cella V2 (che rimane fissa) e quelle dinamiche della colonna G oggetto di inserimento dati
Dunque già in altri post ti ho chiesto come mai fai una valutazione con delle ipotetiche CheckBox (ChkSiPag e ChkSiContb) nonostante non fossero presenti nella UserForm. Hai detto che in poche parole non sono altro che un refuso di vecchie prove ma che adesso non sono più presenti.
Ok ma nel codice lo sono ancora...esattamente qui:
If ChkSiPag = True Then '<---------------QUI arr(nRows, 7) = "PAGATO" 'G arr(nRows, 13) = "Si" 'M Else arr(nRows, 7) = CLng(arr(nRows, 6)) - CLng(Date) arr(nRows, 13) = "No" End If ..... ..... ..... ..... If ChkSiContab = True Then '<---------------QUI arr(nRows, 15) = "Si" 'O Else arr(nRows, 15) = "No" End IfSecondo questi due spezzoni di codice, tradotto il ragionamento è il seguente:
Se la CheckBox ChkSiPag è spuntata allora in cella di colonna G scrivi "PAGATO" e contestualmente in cella di colonna M scrivi "Si" altrimenti se la ChkSiPag non risulta spuntata allora in cella di colonna G scrivi il risultato della differenza del numero di giorni che intercorre tra la data odierna e quella scritta in cella di colonna F e contestualmente in colonna M scrivi "NO"
Ora non essendo presente la ChkSiPag va da sé che varrà sempre la seconda condizione (ovvero la differenza di giorni tra oggi e la data scritta in F).
Chiarisci meglio questa parte perché è poco chiara. Le ChekBox non sono presenti, quindi il codice va sistemato. Quello che avevi scritto in "V2" non era altro che la data attuale ma adesso non seve più perché gestiamo tutto tramite VBA. Fammi capire in colonna "G" cosa deve realmente risultare e come dovrebbe avvenire.
Ciao @alexps81, spiego i vari passaggi:
Dunque già in altri post ti ho chiesto come mai fai una valutazione con delle ipotetiche CheckBox (ChkSiPag e ChkSiContb) nonostante non fossero presenti nella UserForm. Hai detto che in poche parole non sono altro che un refuso di vecchie prove ma che adesso non sono più presenti.
ho tolto dal codice le righe relative al ChkSiPag e ChkSiContab perchè, giustamente come mi ha sempre detto e fatto notare, non servono più. Ora il "PAGATO" viene gestito dal ChkPagato presente nella userform3, scrivendo "Si" in colonna M, ma il "pagato" non me lo scrive seppur abbia inserito queste righe di codice
If ChkPagato = True Then '<---------------QUI arr(nRows, 7) = "PAGATO" 'G Else arr(nRows, 7) = CLng(arr(nRows, 6)) - CLng(Date) End IfOvviamente, non mi scrive il numero di giorni che sarebbero dovuti dalla differenza di F (non la prima riga ma quella aggiuntiva) e la data di OGGI.
Concludo riepilogando:
1) spuntando ChkPagato da userform3, avrei bisogno di scrivere "pagato" in colonna G e contemporaneamente "Si" in colonna M.
2) in colonna G, scrivere il numero di giorni dati dalla differenza della colonna F (riga aggiuntiva) e Oggi
@frasubb come al solito dobbiamo andare per gradi. Innanzitutto quel pezzo di codice che hai pubblicato dove stai cercando di metterlo? Nella UserForm3? Se così fosse...non funzionerà mai. Non ha alcuna attinenza.
Allora facciamo un po' di ordine. La tua UserForm3, perdonami, ma è un disastro. Stavo cercando un modo per spiegarti i difetti ma dovrei scrivere un poema. Tra l'altro per il corretto proseguimento è necessario sistemarla.
Ti allego il file modificato nella UserForm3. Inizia a vedere se funziona così come vorresti. Fai varie prove...sicuramente sarà ancora da sistemare ma per ora è un buon punto di partenza. Il codice è commentato quindi puoi capire bene il funzionamento.
Ho ancora molti dubbi su come stai portando avanti questo tuo progetto. Ad esempio nella UserForm3, quando inserisci una NUOVA DATA DI SCADENZA, colori di rosso il font in colonna "F" tramite codice VBA. Onestamente non mi fa impazzire questa cosa perché quando inserisci nuovi Nominativi, poi avverrà l'ordinamento alfabetico (Bubble Sort). Il colore Rosso in colonna "F" non seguirà il nominativo ma resterà in quelle celle. Secondo me serve sfruttare la Formattazione Condizionale, che si presta meglio al caso specifico.
Un'altra cosa...la TxtDaPag stabilisce quanto bisogna "pagare" in base alla divisione tra TxtAccord e TxtNumRate. Ok...va bene...ma penso che l'evento Exit da sfruttare sia su TxtNumRate e non TxtDaPag.
Comunque per ora, con queste mie modifiche, quando inserisci un nuovo nominativo tramite UserForm1, in colonne "G" e "Q" non mette alcun dato in quanto non ho capito bene come vuoi procedere dato che quelle celle dipendono dalla UserForm3.
Allegati:
You must be logged in to view attached files.Ciao @alexps81 e innanzitutto grazie !!!!
Ho provato il file che mi hai mandato, però forse non mi sono spiegato chiaramente su una cosa relativamente alla colonna F, ovvero ....:
1) dalla userform1, quando vado ad inserire la data di scadenza (TxtScadPag), nel foglio mi viene trasferita in colonna F sia sulla prima riga che su quella aggiuntiva, e fin qui tutto giusto.
2) dalla userform3, quando eventualmente vado a digitare una nuova data di scadenza (TxtNuovaScad), questa deve essere trasferita solo nella riga aggiuntiva della colonna F, lasciando quindi inalterata quelle precedentemente inserita tramite userform1 (TxtScadPag).
3) anche col tuo nuovo codice, il calcolo dei giorni riportati in colonna "G" è errato. Per rispiegare il tutto, la colonna "G" deve corrispondere alla differenza tra la data presente nella riga aggiuntiva della colonna F e "oggi" (es. data col. F 20/01/26 mentre oggi è 22/01/26 .... -----> la colonna G deve avere il risultato di "-2"
Si ok...ma oltre questo a me interessa sapere se la UserForm3 adesso è corretta e poi quando compili la UserForm1 i dati in colonna G e Q quando ci vanno?
Ti eri reso conto che la ComboBox in UserForm3 veniva popolata con tutti i dati presenti in colonna B? Prelevava anche i Codici Fiscali. A quel punto non andava bene nemmeno il calcolo della riga del nominativo scelto. Ecco perché è stato necessario sistemarla.
Comunque, adesso fai un inserimento da UserForm1 e fai sapere cosa manca... sicuro c'è qualche intervento da fare in G e Q ma devi spiegarti bene perché solo tu sai cosa realmente vuoi ottenere.
@alexps81 la userform3 è perfetta.
Indico definitivamente quello di cui avrei bisogno:
- dalla userform3 inserire la nuova scadenza nella riga aggiuntiva del foglio
- in colonna G avere il calcolo dei giorni dati dalla differenza tra la data presente nella riga aggiuntiva della colonna F e "oggi"
- in colonna Q inserire “No” di default in sede di dati compilati in userform1 (tasto “inserisci”), mentre inserire “Si” quando spunto la checkbox “paga” della userform3, (che automaticamente inserisce “pagato” in G)
la userform3 è perfetta.
Ottimo. Ora su questa base sarà possibile gestire tutto il resto.
Indico definitivamente quello di cui avrei bisogno:
Basta semplicemente apportare le seguenti modifiche:
1) In Private Sub cmdConferma_Click() della UserForm3 sostituisci così:
If TxtNuovaScad <> "" Then '<--se esiste una NUOVA DATA SCADENZA allora la trascrive in colonna "F" e la colora di rosso Cells(rigaContatore + 1, "F").Value = CDate(TxtNuovaScad) Cells(rigaContatore + 1, "F").Font.ColorIndex = 3 'colora il nuovo testo in ROSSO End If2) In Private Sub cmdInvia_Click() della UserForm1 rimuovi il commento alla riga di codice:
arr(nRows, 17) = "No" 'Q3) Piccole modifiche e considerazioni: sempre in UserForm1 ho lasciato per errore ancora questa parte di codice
If ChkSiContab = True Then arr(nRows, 15) = "Sì" 'O Else arr(nRows, 15) = "No" End Ifcioè il "Sì" o "No" in colonna "O" in base allo stato della CheckBox ChkSiContab. Ma abbiamo detto che quella CheckBox non è più presente nella UserForm1. Quindi penso che se di default deve essere sempre "No", basta rimuovere quel pezzo di codice e lasciare semplicemente così:
arr(nRows, 15) = "No"Altra cosa...come ti ho suggerito, penso che non va bene lasciar colorare di rosso tramite VBA il font in colonna "F" quando modifichi la data di scadenza. Questo perché l'effetto sarà permanente in quella cella e quando inserirai nuovi nominativi, per l'effetto dell'ordinamento alfabetico, il colore del font non seguirà il nominativo. Ragion per cui la scelta migliore è l'applicazione della Formattazione Condizionale. Quindi ti consiglio di eliminare questa riga di codice nella UserForm3:
Cells(rigaContatore + 1, "F").Font.ColorIndex = 3 'colora il nuovo testo in ROSSOResta da capire quale logica seguire per far colorare di rosso quelle celle in colonna "F" quando modifichi la data. Osservando il funzionamento del tuo file, l'unica idea che mi è venuta in mente è quella di valutare se la cella sopra ha una data diversa da quella sotto. Se son diverse allora colora di rosso il font della cella sotto. Ovviamente la valutazione va fatta solo a coppie fisse: "F2"/"F3" - "F4"/"F5" - "F6"/"F7" - "F8"/"F9" ecc....
Se il metodo è corretto allora ti propongo di selezionare l'intervallo di celle "F3:F390", poi ti porti in Formattazione Condizionale e nella barra della formula ci scrivi: =E(RESTO(RIF.RIGA();2)=1; F3<>INDICE(F:F; RIF.RIGA()-1)) ed infine scegli come colore del carattere il rosso.
ciao @alexps81 va tutto benissimo, solo che, come invece era prima che mi facessi tutto questo lavoro di perfezionamento dei codici, in sede di compilazione dati dalla userform1/tasto "inserisci", nella colonna G mi appariva il conteggio dei giorni che non sono altro (come anche da userform3) la differenza tra la data della riga aggiuntiva della colonna F e "oggi".
E' possibile, quindi, ripristinare tale funzionalità per favore ?
Grazie mille
Ciao @frasubb, mi sa che ora ho capito meglio quello che intendi e se quello che penso sia giusto, credo che bisogna fare un passo indietro e tronare alle Formule...almeno in colonna "G".
Da quello che ho inteso, la colonna "G" deve essere aggiornabile giorno per giorno. Cioè se in colonna "M" risulta Pagato = No, allora in "G" devi avere la differenza tra la data indicata in "F" (riga aggiuntiva) e oggi. Se invece, sempre in colonna "M" risulta Pagato = Sì, allora in colonna "G" deve apparire "PAGATO".
Questo tipo di calcolo deve essere aggiornabile ogni giorno, ecco perché una Formula è la migliore soluzione. Ti propongo questo nuovo allegato. Prova a vedere se risolviamo.
Allegati:
You must be logged in to view attached files.Ciao alexps81, grazie mille di tutto come sempre, sei un fenomeno.
Ho però riscontrato il fatto che se dalla combo di ricerca seleziono un nominativo, tutti i suoi dati relativi non mi compaiono nella userform1 perché magari ho bisogno di apportare una modifica.
Si può risolvere ?
Allego file
Allegati:
You must be logged in to view attached files. -
AutoreArticoli
