Soluzioni varie II parte.    (aggiornabile n. 11) - pagina vista: volte

indice dei paragrafi :

 Controllare e confrontare
 la digitazione nelle TextBox
 Salvare una tabella di Excel in
 Word come Immagine

Nascondere veramente un Foglio di Excel

Messaggi multiriga da più celle

Copiare Collegamenti (HyperLinks)

Salti di celle in cicli su intervalli

 TextBox Multiline - eliminare quadratini  Le OptionButton e il GroupName
 Celle: selezione guidata su intervalli  Contare alla rovescia  Nome Foglio con funzione .Formula in vba    
         
         
         
         
         
         
         
         
   

  • 1) - Controllare e confrontare la digitazione nelle TextBox . Normalmente quando si voglia controllare se ciò che scriviamo in TextBox corrisponde a determinati valori predefiniti, sfruttiamo un controllo di verifica dopo che abbiamo completato la digitazione; potrebbe essere un controllo testuale o numerico, come ad esempio una password oppure una data, o ancora un dato alfanumerico, sia come dati costanti previsti direttamente nel codice, sia come variabili provenienti da valori scritti in determinate celle di un foglio di lavoro. Ho scelto l'evento Change della TextBox che si verifica ad ogni carattere digitato nella TextBox stessa; questo ci consente di intervenire sul singolo carattere ev. digitato errato, e di modificarlo senza dover riscrivere la parte giusta già scritta. Presento quindi un semplice esercizio che controllerà una ipotetica password "Ciliegia" con controllo carattere per carattere mentre si digita; se si verifica un errore, faccio avvisare con un messaggio, quindi selezioniamo il carattere errato per poterlo modificare; ognuno può impostare le condizioni da eseguire se si verificano errori, modificando opportunamente le istruzioni dell'esempio:

Private Sub TextBox1_Change()
Dim LungAtt As Integer    
'variabile per rilevare ad ogni cambio la lunghezza dei caratteri nella TextBox
Dim Ariscontrare           
 'queste dichiarazioni di variabili sono dimensionate come Variant (testo o numeri)
Dim CarattereScritto
Dim CarattereAriscontrare

Ariscontrare = "Ciliegia" 
 'testo da confrontare con ciò che scriveremo nella TextBox
LungAtt = Len(TextBox1)  
'prendiamo la lunghezza dei caratteri presenti nella textbox ad ogni digitazione
CarattereScritto = Mid(TextBox1, LungAtt, 1) 
 'quindi rileviamo tramite Mid il carattere appena digitato, nella posizione 'LungAtt

CarattereAriscontrare = Mid(Ariscontrare, LungAtt, 1) 
'rileviamo anche il carattere della variabile Ariscontrare, stessa 'posizione di LungAtt

If CarattereScritto <> CarattereAriscontrare Then  '
infine confrontiamo se esistono differenze tra i due caratteri, allora

MsgBox "Errore di digitazione"     
'avvisiamo con un messaggio
TextBox1.SelStart = LungAtt - 1
'impostiamo il punto iniziale del carattere da selezionare (l'ultimo, quindi prima del..)
TextBox1.SelLength = LungAtt   
'selezioniamo l'ultimo carattere errato per poterlo correggere

End If
End Sub

  • 2)  -  Salvare una tabella di Excel in Word come immagine. Può necessitare di importare una tabella dati di Excel in un documento di Word; se seguiamo la strada normale possiamo copiare la tabella all’interno del documento Word, con il risultato di avere una tabella che è modificabile, ma che appesantisce il file in termini di kb, oppure possiamo incollare (all’interno di testo già presente sul foglio di Word)) la tabella di Excel come immagine; è sufficiente, al momento di incollare la tabella, scegliere dal menù "Modifica" la voce "Incolla Speciale", e si aprirà una finestrina in cui selezionare l'opzione "Incolla" Come "Bitmap", (vedi immagine sotto) ; le immagini hanno il vantaggio di poterle corredare con didascalie ed effetti grafici, si possono ridimensionare, tagliare, o ritoccare; inoltre in Word si può scegliere la posizione del testo rispetto ad esse. Esiste poi un'altro risvolto importante: se compiliamo un documento doc che integra una tabella proveniente da Excel e la tabella l'abbiamo incollata come tabella, ricordiamoci che la stessa è modificabile non solo da noi, ma anche da altri, e se inviamo il documento a qualcuno, potremmo vederci ritornare lo stesso con dati che non sono quelli da noi predisposti, quindi.....meglio un'immagine i questi casi.

 

  • 3)  -  Nascondere veramente un Foglio di Excel - Possiamo farlo attraverso istruzioni vba oppure manualmente, vediamo prima tramite vba: una delle opzioni della proprietà "Visible" di un foglio di lavoro, è l'opzione xlSheetVeryHidden corrispondente al valore 2 (tra i tre valori numerici della proprietà: -1 alias xlSheetVisible, 0 alias xlSheetHidden, 2 alias xlSheetVeryHidden). Utilizzando quindi l'impostazione 2 il foglio così nascosto non sarà visibile nè intercettabile dal menù Formato/Foglio in quanto l'opzione "Scopri" sarà disattivata. Se vorremo quindi impedire di visualizzare dati contenuti sul foglio 2 ad esempio, potremo scegliere l'evento Workbook_Open oppure l'evento Activate del Foglio prescelto, dove inserire una semplice istruzione:

 all'apertura della cartella  o all'ttivazione del Foglio2

Private Sub Workbook_Open()
Sheets(2).Visible = 2
End Sub

Private Sub Worksheet_Activate()
Sheets(2).Visible = 2
End Sub

Se dovremo di nuovo rendere visibile il foglio, useremo una istruzione inversa, quindi : Sheets(2).Visible = -1   Poichè se usiamo istruzioni vba, all'apertura
di una cartella è possibile disabilitare le macro e quindi le eventuali istruzioni per nascondere vengono meno, potremo impostare la proprietà "Visibile" al valore 2 manualmente; la cosa è fattibile con semplicità: basta entrare nell'editor del vba (ALT+F11), fare doppio click sul foglio che vogliamo nascondere nella finestra Progetto, e nella finestra delle proprietà del foglio in questione, selezionarne la proprietà Visible e impostarne il valore (vedi immagine sotto); fatto questo, per evitare l'accesso libero al Progetto, basterà impostare una password di protezione al VBAProject dal menù  Strumenti/Proprietà di VBAProject/Protezione/Proteggi foglio dalla visualizzazione e applicare una password; questa protezione (del vbaproject) non viene intercettata come macro e non viene richiesta nessuna attivazione macro all'apertura della cartella.

  • 4)  -  Messaggi multiriga da più celle - Volendo visualizzare in una MsgBox il testo contenuto in un intervallo di celle, dovremo scorrere le celle dell'intervallo con un ciclo For Next oppure For Each Next, leggere il contenuto di ogni cella e concatenarlo ( & ) al successivo, avendo cura di andare a capo dopo ogni cella letta, usando una costante (vbCr) in modo da ottenere un Messaggio che si sviluppa in verticale. Nell'esempio impostiamo un intervallo iniziando dalla cella attiva in quel momento, e fino al termine dell'intervallo usiamo una variabile (Lem) per aggiungere ad ogni ciclo il testo letto nelle celle

Sub Messaggio()
Dim Lem As String
Dim Cell As Object
Set Intervallo = Range(ActiveCell, ActiveCell.End(xlDown))
For Each Cell In Intervallo
Lem = Lem & Cell.Value & vbCr
Next
MsgBox Lem
End Sub

se invece vorremo il testo restituito come una unica stringa con il testo separato da trattini, sarà sufficiente modificare la seguente istruzione:
Lem = Lem & Cell.Value & " - "

 

  • 5)  -  Copiare Collegamenti (HyperLinks) - Quando si voglia copiare un "collegamento ipertestuale" (un Hyperlinks) posto in una cella, rendendolo uguale in una altra cella di un altro foglio non possiamo usare una normale uguaglianza come faremmo ad esempio : Sheets("Foglio2").Range("A1").Value = Sheets("Foglio1").Range("A1").Value in quanto gli HyperLinks non sono proprietà delle celle, come Value o Text, ma devono essere "creati" usando il metodo Add che prevede di indicare il foglio e la cella di destinazione e, separati da una semplice virgola, l'origine dell'HyperLinks (foglio e cella di origine) come nell'esempio sotto: l'Hyperlinks è sul Foglio1, cella A1 e lo "copiamo" nel Foglio2, cella A1, cioè lo "Aggiungiamo" (Add) sul Foglio2, cella A1,

Sheets("Foglio2").Hyperlinks.Add Range("A1"), Sheets("Foglio1").Range("A1")

 

  • 6)  -  Salti di celle in cicli su intervalli -  Una interessante soluzione per coloro che, dovendo scorrere un intervallo, hanno necessità di "lavorare" solo su determinate "sequenze" di celle nell'intervallo stesso; supponiamo tanto per capire, di voler scorrere l'intervallo della colonna A, dalla riga 1 alla riga 300, e di voler assegnare a gruppi di 5 celle con salti di 5 celle da lasciare inalterate, un determinato colore, il rosso ad esempio; oppure potremmo con lo stesso sistema, assegnare un valore, oppure una parola, insomma, dobbiamo "agire" su 5 celle si e su 5 celle no; useremo un doppio ciclo For Next: il primo ciclo esterno inizierà dalla riga 1 (ma potrebbe essere una riga qualsiasi), il secondo ciclo conterà quindi il numero di celle previsto 5 (abbiamo detto di voler agire di 5 celle in 5 con salto di 5); terminato il secondo ciclo interno, prima di incrementare di 1 unità il contatore del ciclo esterno, aggiungeremo alla variabile contatore tanti valori quanta è la differenza da aggiungere: 5 celle su cui si è agito + 5 celle da lasciare vuote (5 + 5 = 10 - 1 (che è il valore attuale del ciclo) = 9)

Sub SaltaneCinque()
Col = 1     
'colonna A
For ri = 1 To 300   
'iniziamo il ciclo esterno partendo fal numero della riga scelta, la riga 1

     For v = 0 To 4    'dobbiamo iniziare un ciclo che inizi da zero dato che va sommato a ri (e da 0 a 4 sono 5 cicli)
        Cells(v + ri, Col) = "salve"  
'e nella cella ora scorsa scriviamo una parola

        Cells(v + ri, Col).Interior.ColorIndex = 3      'e coloriamo la cella di rosso
     Next v
  ri = ri + 9  
'al valore attuale del ciclo si aggiunge 9
Next ri
End Sub

  • 7)  - TextBox Multiline - eliminare quadratini - quando si invia il testo contenuto in una textbox multiline, ad una cella di un foglio di lavoro o ad altra destinazione (p.es: documento di Word), nella cella di destinazione appaiono tanti quadratini  come questi " " che altro non sono che il simbolo del comando "INVIO" o "TAB" solitamente usati per andare a capo quando si digita testo nel Multiline. Infatti Excel registra l'avvenuta pressione del tasto anche se noi non vediamo il quadratino, che però appare inesorabilmente quando inviamo tramite istruzioni vba tutto il testo ad una cella o altra destinazione. Corrispondono alle istruzioni vba VbCl  o VbCr normalmente usati in istruzioni per comporre ad esempio testo su più righe in MessageBox o similari (si possono ottenere invece in scrittura usando ALT+10 oppure ALT+13 sul tastierino numerico). Ricordo che per usare una TextBox Multiline è necessario impostare così le seguenti proprietà di quella TextBox:

  • MultiLine impostata a True - questo consentirà di poter scrivere su più righe.

  • EnterKeyBehavior impostata a True - questo consente di andare a capo quando si preme il tasto Invio.

  • ScrollBars impostata a 2-fmScrollBarsVertical - questo munisce di barra di scorrimento verticale la textbox, in modo che si possa scorrere il testo.

  • WordWrap impostata a True - questo consente l'automatismo di andare a capo al termine della riga.

         Per eliminare i quadratini ( ) sfrutteremo la funzione Replace inserita nel comando che useremo per l'invio del testo dalla Multiline ad una cella del foglio il cui formato (da Formato Cella) andrà
         impostato  a "Testo a capo", rimpiazzando i comandi vba (invio o Tab) con uno spazio vuoto:

stringa = TextBox1.Text     'è la TextBox Multiline di esempio; con la variabile "stringa" prendiamo tutto ciò che vi è stato digitato
stringa = Replace(stringa, VbCl, "")   quindi effettuiamo i rimpiazzi sia per il tasto INVIO sia per il TAB nel contenuto di "stringa"
stringa = Replace(stringa, VbCr, "")  
sostituendo le costanti VbCl e VbCr con due doppi apici che significano "vuoto"
Range("C1") = stringa
               'e infine inviamo "stringa"alla cella di destinazione (io ho messo il Range C1 come esempio)

  • 8) - Le OptionButton e la loro proprietà GroupName - un articolo sulle OptionButton non l'ho mai dedicato, ritenendo facile capire cosa sono e come si usano: sono "oggetti" ActiveX usabili in programmazione per scegliere una opzione nell'ambito di più opzioni; la loro caratteristica è quella che se ne può selezionare una soltanto tra tutte le OptionButton inserite su foglio di lavoro o su userform; è tipico della loro natura poter offrire una sola scelta tra tutte quelle che avremo inserito tutti gli altri pulsanti vengono automaticamente impostati su False, (a meno di non inserirle in un Frame per creare un gruppo di controlli OptionButton che si escludono reciprocamente) o almeno così ritenevo....tant'è che ad una domanda su come si potessero usare più OptionButton contemporaneamente, ossia si potessero selezionare più di una opzione tra tutte quelle inserite, avevo risposto picche, che non si poteva....errore errore, invece si può, come giustamente mi ha fatto rilevare un lettore del sito, il Sig. Gianluca Berbenni (che ringrazio sentitamente) sfruttando la proprietà GroupName delle OptionButton; se infatti assegniamo un valore stringa a questa proprietà, tutte le OptionButton appartenenti allo stesso gruppo reagiranno tra loro (quindi una sola opzione sarà selezionabile all'interno di quel gruppo). Va precisato che anche se le OptionButton apparterranno a gruppi diversi, il loro "numero indice" sarà sempre progressivo come deve essere in modo univoco tra gli "oggetti" della stessa Classe presenti su un foglio o su una userform. Nell'esempio sotto infatti si vedono le OptionButton che si diversificano per il loro numero indice che è progressivo, ma che a gruppi di 5 sono state assegnate a tre gruppi diversi: questa diversificazione ha consentito di poter selezionare tre OptionButton contemporaneamente, una per ogni gruppo:

  • è possibile assegnare un valore stringa alla proprietà GroupName anche in fase di esecuzione, sfruttando l'evento Activate della Userform con istruzione tipo : OptionButton1.GroupName = "uno",  OptionButton2.GroupName = "uno"    ecc. ecc  oppure usare cicli su "insiemi", anche se consiglio di non affollare con  troppe istruzioni l'Activate della userform e di inserire il nome ad un gruppo in fase di progettazione scrivendolo in corrispondenza della proprietà GroupName di ogni OptionButton.

  • 9)  - Celle: selezione guidata su intervalli - Esiste già un articolo già presente che tratta la selezione guidata su celle (vedi) dove si scorre un intervallo di celle conseguenti le une alle altre e su una riga dopo l'altra; in questo esercizio invece dovremo "saltare" su determinate celle di un intervallo predefinito (anche in questo caso potremmo lavorare su intervallo variabile sfruttando le istruzioni dell'altro articolo): simuliamo quindi di intervenire sull'intervallo A1:C50 e vogliamo, dopo aver inserito o modificato la cella A1, premendo il tasto "Invio" (Enter) saltare alla C1, da questa passare alla A2 indi alla C2 e così via fino al termine dell'intervallo: sfrutteremo anche in questo case l'evento WorkSheet_Change per il posizionamento delle istruzioni; sfrutteremo il metodo Intersect per intervenire soltanto se verrà modificata una cella dell'intervallo desiderato e il problema si risolve semplicemente rilevando il numero di riga e il numero di colonna della cella che ha subito il cambiamento, cioè la cella Target . (Target è l'argomento dell'evento Worksheet_Change e come tale va sfruttato).

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A1:A50, C1:C50")) Is Nothing Then
Exit Sub
Else
riga = Target.Row   
'con "riga" prendiamo il numero di riga della cella che ha subito il cambiamento
colonna = Target.Column   
'e con "colonna" prendiamo il numero della colonna della cella che ha subito il cambiamento
Select Case colonna         
'quindi impostiamo con Select Case il controllo di quale colonna ha subito il cambiamento, e
                                       'dato che i salti sono solo tra due colonne useremo i numeri di identificazione delle colonne
                                        'per decidere a quale cella saltare usando l'istruzione Select.
      Case Is = 1
           Cells(riga, 3).Select
     Case Is = 3
           Cells(riga + 1, 1).Select
   Case Else
End Select
End If
End Sub

 

  • 10)  -  Contare alla rovescia -  Impostiamo un ciclo For Next per assegnare dei valori in discesa a delle celle del foglio di lavoro; usiamo un ciclo For Next giusto per automatizzare il tutto; (infatti è possibilie fare la stessa operazione manualmente, semplicemente scrivendo nella cella di inizio il valore più alto da cui bisogna scendere, nella cella immediatamente successiva il valore immediatamente inferiore, spostarsi nell'angolo inferiore a destra della cella ed usare il trascinamento. provvederà excel a proseguire la serie di valori in diminuzione

  • 11)  -  Nome Foglio con funzione .Formula in vba - un problema che mi ha preso per diversi giorni richiedeva che si collegassero due celle : una di origine di un foglio che può cambiare come origine e che contiene una formula,  e una cella di destinazione posta su un altro foglio, sempre quello; inoltre è richiesto che il collugamnento fosse dinamico, cioè che la cella destinazione si aggiornase automaticamente al variare di valori richiamati nella cella di origine , normalmente la si risolve con una istruzio simile a questa (nella cella destinazione) : =Foglio1!G10  cioe: uguale al foglio numero x punto esclamativo range cella origine. Nella trasposizione in istruzione VBA la cosa si rende simile a:
    Sheets("Destino").Cells(tuariga, tuacolonna).Formula = "=Foglio1!G10"  . Il mio inganno personale era che ritenevo la sintassi Foglio1 l'identificazione di un foglio attraverso il suo numero, (come si legge nel EditorVBA) mentre invece l'istruzione si riferisce al NOME del foglio (quello messo tra parentesi e che possiamo modificare a nostro piacere, anche lui visibile nell'EditorVBA), vedi immagine sotto:

    dovendo per cui gestire il nome di un foglio ballerino, conviene usare una variabile per reperire il nome del foglio attivo da cui lanciare la macro e una eventuale sintassi diventerebbe:

    X = ActiveSheet.Name

    Sheets("Destino").Cells(tuariga, tuacolonna).Formula = "=" & X & "!G10"

    12)  - 

 

 

prelevato sul sito www.ennius.altervista.org

- Ritorna in cima ^^