Sviluppare funzionalita su Microsoft Office con VBA INVIO automatico alla digitazione di certi tasti

Login Registrati
Stai vedendo 25 articoli - dal 26 a 50 (di 61 totali)
  • Autore
    Articoli
  • #51129 Score: 0 | Risposta

    scossa
    Partecipante
      37 pts

      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 .....

       

      vecchio frac ha scritto:

      Credo che nell'attesa possiamo farci una bevuta insieme 

      ho l'impressione che nell'attesa ce ne potremo fare più di una di bevute  

      #51133 Score: 0 | Risposta

      ABRAMO48
      Partecipante
        1 pt

        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.
        #51136 Score: 0 | Risposta

        ABRAMO48
        Partecipante
          1 pt

          Allego il progetto.

          #51138 Score: 0 | Risposta

          ABRAMO48
          Partecipante
            1 pt

            C'era un problema, ci riprovo ...

            Allegati:
            You must be logged in to view attached files.
            #51140 Score: 0 | Risposta

            scossa
            Partecipante
              37 pts

              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.

              #51142 Score: 0 | Risposta

              ABRAMO48
              Partecipante
                1 pt

                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.
                #51144 Score: 0 | Risposta

                vecchio frac
                Senior Moderator
                  272 pts

                  Tutto ok, pero' vorrei sapere se hai provato la mia soluzione e cosa te ne pare.

                  #51145 Score: 0 | Risposta

                  ABRAMO48
                  Partecipante
                    1 pt

                    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 …

                    #51147 Score: 0 | Risposta

                    romidio
                    Partecipante
                      1 pt

                      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 Sub
                      #51151 Score: 0 | Risposta

                      scossa
                      Partecipante
                        37 pts

                        dsw ha scritto:

                        A 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

                        #51152 Score: 0 | Risposta

                        romidio
                        Partecipante
                          1 pt

                          scossa ha scritto:

                          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

                          #51154 Score: 0 | Risposta

                          scossa
                          Partecipante
                            37 pts

                            dsw ha scritto:

                            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?

                             

                            #51155 Score: 0 | Risposta

                            romidio
                            Partecipante
                              1 pt

                              scossa ha scritto:

                              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.

                              #51157 Score: 0 | Risposta

                              scossa
                              Partecipante
                                37 pts

                                dsw ha scritto:

                                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.

                                 

                                 

                                #51158 Score: 0 | Risposta

                                romidio
                                Partecipante
                                  1 pt

                                  scossa ha scritto:

                                  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).

                                  #51161 Score: 0 | Risposta

                                  scossa
                                  Partecipante
                                    37 pts

                                    dsw ha scritto:

                                    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 9 col mio 13 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.

                                    dsw ha scritto:

                                    ...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).

                                     

                                     

                                    #51162 Score: 0 | Risposta

                                    vecchio frac
                                    Senior Moderator
                                      272 pts

                                      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 

                                      #51163 Score: 0 | Risposta

                                      ABRAMO48
                                      Partecipante
                                        1 pt

                                        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 Sub

                                        Ho 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.
                                        #51166 Score: 0 | Risposta

                                        romidio
                                        Partecipante
                                          1 pt

                                          scossa ha scritto:

                                          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   

                                          scossa ha scritto:

                                          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... 

                                          vecchio frac ha scritto:

                                          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....   

                                          #51167 Score: 0 | Risposta

                                          vecchio frac
                                          Senior Moderator
                                            272 pts

                                            dsw ha scritto:

                                            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).

                                            #51170 Score: 0 | Risposta

                                            scossa
                                            Partecipante
                                              37 pts

                                              vecchio frac ha scritto:

                                              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 AM1 e 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" ...

                                              #51171 Score: 0 | Risposta

                                              romidio
                                              Partecipante
                                                1 pt

                                                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".

                                                UserForm inserimento testo da "splittare"

                                                 

                                                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.
                                                #51173 Score: 0 | Risposta

                                                scossa
                                                Partecipante
                                                  37 pts

                                                  Ottima "stuzzichino" dsw, penso che l'idea della UF sia vincente.

                                                  dsw ha scritto:

                                                  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).

                                                   

                                                  #51174 Score: 1 | Risposta

                                                  romidio
                                                  Partecipante
                                                    1 pt

                                                    scossa ha scritto:

                                                    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....  

                                                    #51175 Score: 0 | Risposta

                                                    scossa
                                                    Partecipante
                                                      37 pts

                                                      dsw ha scritto:

                                                      è 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.

                                                    Login Registrati
                                                    Stai vedendo 25 articoli - dal 26 a 50 (di 61 totali)
                                                    Rispondi a: INVIO automatico alla digitazione di certi tasti
                                                    Gli allegati sono permessi solo ad utenti REGISTRATI
                                                    Le tue informazioni: