› Sviluppare funzionalita su Microsoft Office con VBA › INVIO automatico alla digitazione di certi tasti
-
AutoreArticoli
-
ABRAMO48 ha scritto:
Grazie carissimi, vi farò sapere ...
E' un problema interessante noo?Il problema è interessante ma il contesto è piuttosto confuso; se come gestire le lettere sembra abbastanza chiaro, per i numeri non c'è nessuna casistica:
- che valori possono assumere?
- che formato?
- possono esserci due o più valori numerici consecutivi?
- altre informazioni utili .....
Credo che nell'attesa possiamo farci una bevuta insieme

ho l'impressione che nell'attesa ce ne potremo fare più di una di bevute
Vi allego l'intero progetto pronto per il 2025 - mese di Gennaio.
Vi allego anche i dati come mi vengono passati e come io devo inserirli, giorno per giorno.
Possono benissimo essere utilizzati per simulare i dati di Gennaio 2025.
Il file zippato è la cartella che contiene l'esecutivo e la cartella SAVE.
La cartella può stare ovunque (dovrebbe) e basta lanciare l'esecutivo perchè si apra tutto (spero).
Poi dovrebbe essere tutto intuitivo ...
Questo è il contesto in cui avviene il problema che ho aperto.
Grazie!
Allegati:
You must be logged in to view attached files.C'era un problema, ci riprovo ...
Allegati:
You must be logged in to view attached files.Bene, però dovresti fare ancora una cosa: allegare un nuovo file senza macro e contente solo il foglio con la tabella "REGISTRO PRESENZE - CODICI" con i dati dell'immagine del pdf che hai allegato (dicembre 2024) compilato manualmente così come vorresti risultasse.
ecco qua. il file che ti allego è proprio il file di DICEMBRE corrispondente al pdf, tradotto.
IO digito i dati presenti nel pdf così come sono, pensa il programma, immediatamente, in corrispondenza del codice digitato a tradurlo o a scartarlo se è errato. p.e. nella cella H17 io digito c INVIO e compare subito CF perché è festivo (cui corrisponde poi, nella tabella delle ore successiva, una diversa traduzione in ore di straordinario).
Il mio problema è eliminare quell'INVIO ... perché, in pratica, mi raddoppiano la digitazione.
Ovvio che se digito un numero l'INVIO è d'obbligo perché il programma non sa quando finisce il numero.
Allegati:
You must be logged in to view attached files.Tutto ok, pero' vorrei sapere se hai provato la mia soluzione e cosa te ne pare.
No Vecchio Frac (purtroppo ho un problema famigliare che mi preme, una sorta di previsione economica a lunga scadenza, in excel ovviamente).
Però ho dato un'occhiata alle tue istruzioni, vediamo se ho capito:
1) Private Sub Worksheet_Activate()
Application.OnKey "+M", "onkey_M"
End Sub
Questo comando fa attivare la funzione onkey_M se viene digitato SHIFT+M (ma se premo CAPS-LOCK lo shift non diventa automatico?)
2) la funzione onkey_M, nel caso la cella si trovi nel range previsto, esegue il comando
Application.SendKeys ("{F2}{HOME}M") (che devo capire) ma immagino potrebbe inviare la combinazione di tasti M e poi ENTER (che è quello che voglio).
Ora vedrò di trovare il tempo per fare una prova …
Grazie Vecchio Frac!, siete proprio indispensabili.
Ho fatto il programmatore tutta la vita (dai tempi delle schede perforate! IBM 360) Assembler, Cobol, Basic, Progress e ora VBA. Ho fatto un programma per il mio amico tabaccaio per gestire l’ordine dei tabacchi: sono quasi 12.000 (dodicimila) righe di codice (al netto dei commenti e delle righe bianche ovviamente), quasi 400 tra sub e funzioni, una decina di file … Non sono proprio un principiante, ma al vostro confronto mi sembra di essere un alunno di scuola elementare …
Discussione interessante, se ho capito bene il problema è inserire tutto il "testo"(numeri compresi) in sequenza evitando il più possibile il tasto "INVIO".
A mio parere il problema può essere risolto usando un espressione regolare per dividere il testo digitato, dove viene inserito (cella, form, etc.) non dovrebbe essere un problema...
Posto questo codice d'esempio (volutamente incompleto) per darvi uno spunto su cui ragionare....
Sub split() Dim rx As RegExp Dim ma As MatchCollection Dim s As String: s = "asdfghhj-4,54,042,5..sda.a" Set rx = New RegExp With rx .Global = True .Pattern = "([a-zA-Z]{1})|(-?[1-9]{1},[0-5]{1})|(-?[1-9]{1})|(\.)" Set ma = .Execute(s) End With Set rx = Nothing Set ma = Nothing End SubA mio parere il problema può essere risolto usando un espressione regolare per dividere il testo digitato,
Infatti, era quello che avevo pensato anch'io.
Però c'è una complicazione relativa ai valori numerici: qualora ci siano due codici numerici consecutivi; prendiamo ad esempio la colonna del 31 Dicembre: 6.M6.39F dove 39 è un singolo valore; con il pattern proposto verrebbe suddiviso in 3 e 9; inoltre non riconosce lo 0.
Si può comunque risolvere modificando il pattern in:
.Pattern = "([a-zA-Z]{1})|(-?[0-9]{1,2},[0-5]{1})|(-?[0-9]{1,2})|(\.)"è vero che se 39 fossero due valori distinti, 3 e 9, non verrebbero discriminati però si risolve avendo l'accortezza di separare eventuali numeri interi consecutivi con un +:
6.M6.39F -> sarebbe suddiviso in 6 . M 6 . 39 F
6.M6.3+9F -> sarebbe suddiviso in 6 . M 6 . 3 9 F
6.M6.139F -> sarebbe suddiviso in 6 . M 6 . 13 9 F
6.M6.1+39F -> sarebbe suddiviso in 6 . M 6 . 1 39 F
6.M6.1039F -> sarebbe suddiviso in 6 . M 6 . 10 39 F
6.M6.392,5F -> sarebbe suddiviso in 6 . M 6 . 39 2,5 F
6.M6.39-2,5F -> sarebbe suddiviso in 6 . M 6 . 39 -2,5 F
6.M6.3+92,5F -> sarebbe suddiviso in 6 . M 6 . 3 92,5 F
6.M6.39-2,543F -> sarebbe suddiviso in 6 . M 6 . 39 -2,5 43 F
6.M6.39-2,54+3F -> sarebbe suddiviso in 6 . M 6 . 39 -2,5 4 3 F
Si può comunque risolvere modificando il pattern in:
.Pattern = "([a-zA-Z]{1})|(-?[0-9]{1,2},[0-5]{1})|(-?[0-9]{1,2})|(\.)"Infatti la separazione dei numeri è una delle problematiche da affrontare/personalizzare, ma dovresti ricontrollare la tua correzione del pattern....non corrisponde con la tua spiegazione del problema
ma dovresti ricontrollare la tua correzione del pattern....non corrisponde con la tua spiegazione del problema
ciao,
non ho capito cosa intendi dire: nel tuo pattern usi [1-9]{1} quindi escludi lo 0 e prendi in considerazione i singoli numeri, nel mio uso [0-9]{1,2} quindi include lo 0 e considera 1 o 2 numeri consecutivi, di qui la necessità di separare 13 con il + se si vogliono avere i due valori 1 e 3 anziché 13 o, per 139, 1+39 per avere 1 e 39 anziché 13 e 3.
Puoi chiarirmi l'osservazione così da capire?
Puoi chiarirmi l'osservazione così da capire?
Ciao,
la tua spiegazione sul problema della separazione dei numeri (interi o con decimali) è più che corretta, nell'espressione regolare hai dimenticato il carattere di separazione "+"
Ora c'è da dire che sarà ABRAMO48 a decidere se seguire questa strada e a personalizzare secondo le sue esigenze l'espressione regolare, potrebbe anche decidere di usare un carattere qualsiasi come "segnaposto" ogni volta che trova un valore numerico e compilare in seguito (manualmente) le celle rimaste vuote, le possibilità sono molte.
Per ritornare all'espressione regolare... al solo scopo di migliorarla, per la selezione dei "numeri"... la modificherei come segue, rimane il fatto che va migliorata/personalizzata.
.Pattern = "([a-zA-Z]{1})|((-|\+)(0{1}|[1-9]{1,2}),[0-9]{1,2})|((-|\+)[1-9]{1}[0-9]{1}?)|(\.)"Con questo Pattern i numeri devono essere preceduto da un segni positivo/negativo, i numeri con decimali iniziano con il singolo zero o con due numeri interi, i numeri senza decimali non possono iniziare con lo zero.
L'espressione regolare l'ho testata e mi sembra fare il suo sporco lavoro
, c'è da dire che se per un errore di battitura dell'operatore manca il carattere separatore (+/-) l'espressione regolare non funziona come dovrebbe...PS: ho usato regex101.com per fare un controllo al volo dell'espressione regolare, a mio parere molto comodo per fare controlli veloci ed accurati.
la tua spiegazione sul problema della separazione dei numeri (interi o con decimali) è più che corretta, nell'espressione regolare hai dimenticato il carattere di separazione "+"
In realtà non serve, potresti usare anche * o § visto che non deve essere "catturato" ma serve solo a separare nel punto voluto il numero in due match. Prova il codice in Excel e vedrai che il pattern funziona.
regex101 è un ottimo tool, anche se in VBA l'implementazione delle regex è molto limitata rispetto ad altri linguaggi.
6.M6.139F -> sarebbe suddiviso in 6 . M 6 . 13 9 F
6.M6.1+39F -> sarebbe suddiviso in 6 . M 6 . 1 39 F
Vero il pattern come è scritto funziona, ma se il carattere separatore (qualunque esso sia) viene omesso dall'operatore durante l'inserimento dei dati, viene restituito un risultato verificabile solo con controllo visivo.
Mentre invece, se l'espressione regolare non restituisce una corrispondenza, può essere un aiuto per identificare più velocemente la parte mancante (visivamente o tramite codice con il conteggio delle corrispondenze).
Mentre invece, se l'espressione regolare non restituisce una corrispondenza, può essere un aiuto per identificare più velocemente la parte mancante
Ma né il mio né il tuo pattern "non restituisce una corrispondenza" se si omette il separatore: 139 col tuo diventa
1 3 9col mio13 9. Del resto è impossibile, da codice, discriminare se l'utente digitando 139 (assumendo che i valori validi siano compresi tra -99,9 e 99,9) intenda 1 3 9 o 1 39 o 13 9....identificare più velocemente la parte mancante (visivamente o tramite codice con il conteggio delle corrispondenze)
In effetti si potrebbe, da codice, impostare un marker sui valori di due cifre e poi mostrare un alert di verifica di quei valori (magari una UF per scegliere tra le due o tre possibili interpretazioni).
Ma come riuscite, in Excel, a digitare una A (poniamo) e a fare in modo che Excel inserisca la A e si posizioni nella prossima cella?
Perche' e' questa in fondo la domanda iniziale.
Poi tutto bello, sofisticato e complicato ma l'origine della questione e' "come faccio a inserire un qualcosa senza dover premere Invio ma inserendo il valore ed essere subito pronto al valore successivo?"
Ecco io suggerivo OnKey proprio perche' non c' un evento CellChange (come fosse una Textbox).
Ed era qui la mia curiosita' su altre soluzioni
Vecchio frac sto provando onKey e funziona:
Private Sub Worksheet_Activate() Dim cella As Range Set RM = Workbooks(ActiveWorkbook.Name).Worksheets(ActiveSheet.Name) Application.OnKey "+M", "onkey_X" For Each cella In RM.Range("H95:H100") Application.OnKey "+" & cella, "onkey_X" Next End SubHo eseguito un ciclo per attivare onKey per tutti i codici previsti in tabella.
Ora devo cercare di far funzionare SendKeys ma ... non è accettato sotto Macintosh ... allego le schermate.
Ci studierò un po' su ...
Allegati:
You must be logged in to view attached files.Ma né il mio né il tuo pattern "non restituisce una corrispondenza"
Oops.....dovevo controllarla con più attenzione, avevo fatto un controllo veloce e sembrava essere corretta, sorry
In effetti si potrebbe, da codice, impostare un marker sui valori di due cifre e poi mostrare un alert di verifica di quei valori (magari una UF per scegliere tra le due o tre possibili interpretazioni).
Era la mia idea iniziale...
Ed era qui la mia curiosita' su altre soluzioni

Provo a spiegare a grandi linee, inserisco tutti i caratteri in sequenza in un unica stringa (in una cella o in un UF), confermo, il codice VBA distribuisce i caratteri della stringa nelle celle.
L'uso di un espressione regolare può tornare utile per dividere ed eseguire dei controlli di coerenza dei dati inseriti, ma si può tranquillamente farne a meno.
Se poi escludiamo il controllo dei numeri, diventa ancora più semplice, inserimento stringa di caratteri, loop e fatto....
Se poi escludiamo il controllo dei numeri, diventa ancora più semplice, inserimento stringa di caratteri, loop e fatto
Scusa sono di coccio ma non capisco come implementi l'inserimento della stringa di caratteri.
Sono davanti al mio bel foglio Excel e voglio che nel range A1:A10 se digito la A mi inserisce in cella una A, se digito una M mi inserisce una M, se digito 1 mi inserisce 1. Dopo l'inserimento la cella attiva diventa la successiva del range. Fuori da quel range non deve succedere niente di particolare, percio' se digito A in B1, Excel entra in edit mode, la cella B1 presenta la A e il cursore lampeggiante rimane in B1 per l'editing successivo.
Questo e', credo, il succo del post originale.
Peccato che SendKeys non funziona su Mac da quello che dice Abramo, ma il resto dovrebbe funzionare. L'utilizzo di SendKeys serve a intercettare Shift+lettera furoi dal range prescritto, per simulare il comportamento normale (che altrimenti verrebbe intercettato comunque da OnKey).
Sono davanti al mio bel foglio Excel e voglio che nel range A1:A10 se digito la A mi inserisce in cella una A, se digito una M mi inserisce una M, se digito 1 mi inserisce 1.
No, tu digiti in A1
AM1e premi invio quindi lui suddivide la stringa in signoli caratteri (StrConv()? ma meglio regex), li elabora (aggiunge se serve M o F etc.) e li scrive in A1 A2 A3 .....Con StrConv è più complicato perché devi gestire nel codice la verifica dei caratteri numerici consecutivi, ma entrambe le soluzioni hanno il problema che la cella A1 dove essere preventivamente formattata come testo perché se la stringa da inserire iniziasse con un numero negativo (-1AC5) avresti una segnalazione di "errore nella formula". Puoi farlo nell'evento SelectionChange impostando
Target.NumberFormat = "@"e nell'evento Change reimpostarlo a "General" ...Ho corretto l'espressione regolare, adesso dovrebbe funzionare (salvo che qualcuno non trovi un baco
), a scopo dimostrativo ho fatto una piccola macro con una UserForm che si attiva facendo doppio click sulla cella evidenziata in giallo "INPUTBOX".La macro è solo una base per mostrare il risultato finale, non è da intendersi come un "prodotto finito".

Piccolo suggerimento, se si usa l'evento "BeforeDoubleClick" associato alla prima cella della riga del modulo da compilare anzichè "SelectionChange" non è necessario modificare il formato della cella (come suggerito da scossa), il codice(non presente in questo esempio) inserira il valore/testo nel formato corretto.
Allegati:
You must be logged in to view attached files.Ottima "stuzzichino" dsw, penso che l'idea della UF sia vincente.
Ho corretto l'espressione regolare, adesso dovrebbe funzionare (salvo che qualcuno non trovi un baco
)Personalmente non condivido l'obbligo di digitare sempre il segno
+per i numeri positivi: l'obiettivo dell'OP è ridurre al minimo i tasti da premere; anche perché il disturbo di inserire sempre il + non rende immune da errori: se devo inserire due interi consecutivi (p.e. 3 e 8) e digito il + solo davanti al primo otterrei +38, quindi più tasti da premere a fronte di un vantaggio relativo (imho).Personalmente non condivido l'obbligo di digitare sempre il segno
+per i numeri positivi: l'obiettivo dell'OP è ridurre al minimo i tasti da premere; anche perché il "disturbo" non rende immune da errori: se devo inserire due interi consecutivi (p.e. 3 e 8) e digito il + solo davanti al primo otterrei +38, quindi più tasti da premere a fronte di un vantaggio relativo (imho).Vero, ma l'OP potrebbe anche dimenticare di inserire una "," o il carattere "-", con qualunque soluzione l'errore di battitura può capitare, è comunque l'OP a dover "segnalare" alla "macchina" quando c'è una separazione tra i numeri inseriti, ma forse sbaglio.
L'esempio con la UserForm che ho postato serviva solo per far capire meglio come avevo intenzione di utilizzare l'espressione regolare, se piace....piace....se non piace...non piace....
è comunque l'OP a dover "segnalare" alla "macchina" quando c'è una separazione tra i numeri inseriti, ma forse sbaglio.
Non sbagli affatto. Dal punto di vista di minimizzare gli errori è sicuramente la scelta più valida; bisogna vedere se l'OP preferisce risparmiare i (peraltro statisticamente pochi) più o perdere meno tempo nel debug.
-
AutoreArticoli
