delimitare parole su cella riga



  • delimitare parole su cella / riga
    di maxmi data: 10/09/2013 17:06:32

    Salve A tutti,

    c'è la possibilità con codice vba di delimitare le parole che vengono scritte su una riga,
    ed eventualmente con un MsgBox che ti dice che si è raggiunto la
    lunghezza massima di inserimento parole ?
    Dovrei applicare questo soluzione su una cella / riga
    A20-A21
    grazie



  • di totygno71 (utente non iscritto) data: 10/09/2013 17:42:09

    ciao maxmi

    cosa intendi per "delimitare le parole scritte?"



  • di maxmi data: 10/09/2013 20:13:23

    Ciao totygno71

    per delimitazione intendo che su quella cella / riga non si possa scrivere
    più di 66 parole.
    Quando arrivo alla 66 parola, anche se digito ancora
    non mi deve scrivere nulla e se possibile mi esca
    un MsgBox.



  • di totygno71 data: 10/09/2013 20:23:57

    ok
    ma 69 parole o 69 caratteri



  • di maxmi data: 10/09/2013 20:38:35

    si scusa 66 caratteri



  • di Vecchio Frac data: 10/09/2013 20:42:31

    Non credo che si possa fare.
    L'edit in cella non è intercettabile.
    Il controllo avverrà dopo aver premuto Invio troncando ai primi 66 caratteri oppure mediante l'inserimento in una textbox (e qui sì il controllo può essere su ogni carattere digitato).





  • di totygno71 data: 10/09/2013 20:45:24

    Ecco VF è come i bimbi.... la voce della verità... ^_^



  • di maxmi data: 10/09/2013 21:33:54

    ok potrebbe andare bene anche una textbox



  • di HarryBosch data: 11/09/2013 01:05:44

    Ciao Ragazzi
    anche la convalida dati permette di validare la lunghezza minima e massima di una cella, ma il controllo avviene sempre a posteriori, ovvero all'uscita.

    Sotto la scheda -->Sviluppo-->Inserisci troverai i controlli ActiveX tra cui selezionare la textbox, ovvero la "casella di testo". Posizionala nella cella interessata e dalle proprietà (tasto destro) puoi divertirti con le varie opzioni: la proprietà "MaxLenght" permette di impostare un valore max di caratteri.
    Allego un semplicissimo file di esempio.



  • di maxmi (utente non iscritto) data: 11/09/2013 11:10:07

    lavoro con excel 2003 non risco ad aprire il tuo file.
    Segueno le tue indicazioni non vedo
    il controllo ActiveX
    o sbaglio io




  • di Vecchio Frac data: 11/09/2013 11:23:30

    Il controllo nel file proposto è quella casella di testo nella cella con lo sfondo giallo.
    La conversione da xlsx a xls non permette l'attivazione di tali controlli.
    Per riprodurre l'esempio:
    - apri un foglio nuovo del tuo Excel
    - visualizza la barra dei menu "Strumenti di controllo"
    - scegli il controllo textbox
    - disegnalo sullo schermo
    - ora visualizza le proprietà di questo controllo (tasto destro - proprietà)
    - imposta la sua proprietà MaxLength a 10
    - sulla barra strumenti di controllo togli la modalità di progettazione (primo pulsantino)
    - ora puoi giocare con la textbox (limitata a dieci caratteri)






  • di maxmi data: 11/09/2013 14:40:46

    ok Vecchio Frac
    2 cose da chiedere
    c'è un sistema per scrivere sempre
    in maiuscolo sulla textBox ?

    e poi c'è la possibilità di inserire un messaggio che
    ti dica raggiunta massima delimitazione inserimento carratteri ?



  • di maxmi (utente non iscritto) data: 11/09/2013 16:39:03

    se volessi percorre la strada x inserire dati attraverso un UserForm
    con una textBox.
    Io avrei fatto questa bozza codice, vorrei, ma non ne ho le capacità
    di eseguire questo form anche sulla riga A21.
    Il form dovrebbe attivarsi quando si selezione le righe
    A20-A21.
    Qualcuno avra' le convulsioni quandro vedrà il codice
    abbiate pietà, sto imparando ! accetto le bacchettate nelle mani
    come faceva il mio maesto alle scule elementari
    tanto tanto tempo fa.
    grazie



  • di HarryBosch data: 11/09/2013 21:06:12

    Scusate, non mi ero accorto che già all'inizio era stata indicata la versione 2003 in uso.
    cit. -> "c'è un sistema per scrivere sempre in maiuscolo sulla textBox ? "
    Me.TextBox1 = UCase(Me.TextBox1)
    da legare all'evento Change della textbox (si potrebbe convertire direttamente solo l'ultima lettera inserita, ma su 70 caratteri le prestazioni non ne risentono).

    cit. ->" inserire un messaggio che ti dica raggiunta massima delimitazione inserimento caratteri"
    If Len(Me.TextBox1) = Me.TextBox1.MaxLength Then
    questa istruzione controlla se la lunghezza del testo inserito è pari al numero massimo di caratteri inserito nelle proprietà.

    E' necessario un accorgimento per evitare la ricorsione del codice. Inserisci la routine sotto nella Userform e prova a scrivere. All'ultimo carattere inserito esce il messaggio di avviso.
     
    Private Sub TextBox1_Change()
      Static bLoop As Boolean
      If bLoop Then Exit Sub
      bLoop = True
    
    'converto direttamente in maiuscolo man mano che scrivo
      Me.TextBox1 = UCase(Me.TextBox1)
    
      If Len(Me.TextBox1) = Me.TextBox1.MaxLength Then
        MsgBox "Massima delimitazione inserimento carratteri"
      End If
    
      bLoop = False
    End Sub



  • di HarryBosch data: 11/09/2013 21:37:16

    E per il codice che hai scritto non c'è bisogno di bacchettarti ^_^
    L'unico accorgimento che posso darti è che per riferirti alla Userform nella quale ti trovi, basta utilizzare il "Me." senza ripetere per esteso Userform2.

    cit. -> "Il form dovrebbe attivarsi quando si selezione le righe A20-A21"
    Devi agire sull'evento SelectionChange del foglio in questione. Nell'editor vba devi cliccare due volte sul nome del foglio (Dati nel tuo caso) nella finestra dei progetti. In questo modulo riporta la routine sotto.
    Ora, selezionando una delle due celle si attiverà la userform. A questo punto dovrai modificare anche l'inserimento del valore, che dovrà avvenire nella cella attiva al momento.



     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      'se l'intervallo selezionato non rientra in A20:A21 esci
      If Intersect(Target, [A20:A21]) Is Nothing Then Exit Sub
      
      'altrimenti apro la Form
      UserForm2.Show
    End Sub
    
    'questa sub va in sostituzione della precedente, per riportare il testo nella cella A20 o A21, a seconda di quella attiva al momento
    Private Sub CommandButton1_Click()
      ActiveCell = Me.TextBox1.Value
      TextBox1.Text = ""
    End Sub



  • di maxmi data: 11/09/2013 23:42:01

    ok ho provato e funziona tutto.
    Chiedo,
    ho notato che dopo avere inserito dati su riga A20 e poi A21
    se per sbaglio mi riposizione nella A20 per
    controllare quello che ho scritto mi si riapre il form.
    E' possibile che questo accada solo se faccio il doppio clik,
    ho sto dicendo una minchiata
    Poi c'è il sistema perche' il puntatore sia gia' dentro alla textbox



  • di HarryBosch data: 12/09/2013 00:06:53

    Certo, esiste anche l'evento DoubleClick, da inserire sempre all'interno del foglio interessato, in sostituzione del p recedente SelectionChange.
    Per puntare alla textbox all'apertura del form, devi passargli il "fuoco" :)
    textbox1.setfocus
    da legare all'evento di attivazione della Userform.

    Ti riallego il file "textbox in userfom" dove ti ho inserito anche i commenti



  • di maxmi data: 12/09/2013 11:16:49

    Nel foglio dati ho gia questo codice
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    se inserisco anche questo mi dice logicamnete, nome
    non univico, come posso avviare a questo problema.


    'evento double click
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    'se l'intervallo selezionato non rientra in A20:A21 esci

     
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect(Target, Me.Range("B4")) Is Nothing Then
        UserForm1.Show
    
    'evento double click
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
        'se l'intervallo selezionato non rientra in A20:A21 esci
      If Intersect(Target, [A20:A21]) Is Nothing Then Exit Sub



  • di Vecchio Frac data: 12/09/2013 11:26:35

    Logicamente devi fondere le istruzioni in un unico evento BeforeDoubleClick.
    Non possono coesistere procedure, funzioni o eventi distinti aventi medesima firma.
    Le tue istruzioni devono quindi rientrare necessariamente nello stesso blocco "Private Sub Worksheet_BeforeDoubleClick() ... End Sub".
    E siccome anche la sequenza delle operazioni è importante, in un linguaggio come VBA che è in parte sequenziale (come i vecchi BASIC) e in parte è event-driven (poichè è basato su piattaforma Windows), ti lascio il piacere di capire quale mettere prima e quale mettere dopo ^_^





  • di maxmi data: 12/09/2013 11:44:47

    ok mi sembra che cosi sia giusto
    funziona.

     
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Not Intersect(Target, Me.Range("B4")) Is Nothing Then
        UserForm1.Show
    End If
    Cancel = True
     'se l'intervallo selezionato non rientra in A20:A21 esci
      If Intersect(Target, [A20:A21]) Is Nothing Then Exit Sub
      
      'altrimenti apro la Form
      UserForm2.Show
    End Sub



  • di maxmi data: 12/09/2013 13:11:53

    Due Domande ?
    sull Userfor2 ho aggiunto un pulsante con il nome Modifica testo
    è possibile e come si fa' programmarlo per modificare il testo scritto sulle testBox.

    E poi si potrebbe inserire una contatottore che ti conta i caratteri scritti,
    visto che ho messo come limite 69 caratteri per riga
    grazie



  • di Vecchio Frac data: 12/09/2013 14:50:34

    Sembra che tu stia cercando di reinventare un Notepad ^_^
    Le tue prossime domande saranno: come inserire pulsanti di formattazione e allineamento del testo :)





  • di totygno71 (utente non iscritto) data: 12/09/2013 14:57:19

    Orroreeeeeeeeeee.... O_o
    Potrebbe trattarsi di un compito in classe! ^_^



  • di maxmi (utente non iscritto) data: 12/09/2013 16:15:47

    e bravo totygno71 !
    ma purtroppo i compiti in classe li ho finiti di fare
    alle medie nel 1972.
    Sono ancora giovane per ricomciare a rifarli !



  • di maxmi (utente non iscritto) data: 12/09/2013 20:15:51

    ciao Vecchio Frac
    non voglio creae nessun Notepad ma ho visto
    che se volessi correggere una parola dapo avere inserita,
    non lo posso fare.
    Perche' se seleziona la riga A20 ( per esempio ) mi si riapre il form.
    Si puo coreggere quello che si è scritto, andando sulla barra sopra
    ma qui mi sei fregato perche' puoi inserire piu di 69 caratteri.
    Per quanto riguarda il contatore che ti dice quanti caratteri hai scritto,
    e perchè ho visto su vari link che hanno questi contatori,
    diciamo come la funzione di excel =lunghezza testo.



  • di HarryBosch data: 12/09/2013 20:48:39

    Puoi sempre inserire una protezione a quelle celle, così l'unico modo per modificarle resta quello di richiamare la Form cliccando due volte. All'apertura della form carichi l'eventuale testo già presente.
    Ogni operazione di inserimento in quelle celle dovrà prevedere la disattivazione della protezione e il reinserimento al ternine:
    ActiveSheet.Unprotect
    ' varie operazioni
    ActiveSheet.Protect

    eventualmente da scrivere con password. Ti riallego il file con questa modifica: "textbox in userform - 1"



  • di totygno71 (utente non iscritto) data: 12/09/2013 20:55:51

    me la spieghi?
     
    Static bLoop As Boolean
      If bLoop Then Exit Sub
      bLoop = True
    bLoop = False
    



  • di HarryBosch data: 12/09/2013 21:39:39

    Come no!
    In pratica tutto quell'ambaradan serve per evitare la ricorsione del codice. Se provi a toglierlo, e scrivi nella textbox fino all'ultimo carattere consentito, uscirà la Msgbox di avviso: due volte però! Questo perché l'evento (Change) si scatena sia quando scrivi l'ultimo carattere, sia quando esso viene convertito in maiuscolo.
    Onde ciò, una bella Static booleana impedisce il ripetersi della chiamata.
    Di solito è sufficiente inserire il codice tra
    application.EnableEvents = false
    'codice
    application.EnableEvents =true
    ma in questo caso non funziona. Su questo punto avevo letto un articolo molto interessante, ma non riesco a trovarlo...



  • di totygno71 (utente non iscritto) data: 13/09/2013 08:43:55

    Chiarissimo "l'ambaradam" e soprattutto utile
    Grazie Harry_



  • di Vecchio Frac data: 13/09/2013 09:59:18

    cit. "non voglio creare nessun Notepad"
    ---> Eppure sarebbe un utilissimo esercizio. Ci sono diversi gradi di difficoltà da superare ^_^





  • di maxmi (utente non iscritto) data: 13/09/2013 18:07:31

    si hai raggione Vecchio Frac
    ma devo superare anche il mio grado di istruzione
    che si è fermato alle medie nel 1972.
    Mettici pure che mastico poco l'inglese
    sai che frittata!
    Comunque si puo' fare, diciamo iniziare.



  • di maxmi (utente non iscritto) data: 13/09/2013 22:57:59

    Ciao HarryBosch
    funziona tutto
    grazie a tutti !
    alla prossima



  • di maxmi data: 14/09/2013 00:17:55

    chudo il post



  • di Vecchio Frac data: 14/09/2013 09:16:27

    cit. "ma devo superare anche il mio grado di istruzione "
    ---> Questo è irrilevante. Io ho studiato di tutto, tranne informatica e matematica... ti aiuterai con la passione e l'esperienza ^_^

    cit. "che si è fermato alle medie nel 1972. "
    ---> LOL, sei un po' più vecchietto di me allora. Benvenuto nel club ^_^

    cit. "Mettici pure che mastico poco l'inglese "
    ---> Questo, se vogliamo, è l'unico punto che darebbe qualche aiutino in più. Io non ho studiato inglese, ma alla fine le cose sono sempre quelle e dopo un po' si va a senso e intuito, e si capisce benissimo ^_^





  • di maxmi data: 17/09/2013 21:07:53

    ciao Vecchio Frac
    scusa se non ti ho risposto prima,
    grazie per la tua disponibilità
    appena possibile provverò a vedere
    di reinventare un Notepad, ma la vedo dura



  • di maxmi data: 17/09/2013 21:09:20

    richiudo