› Excel e gli applicativi Microsoft Office › Formattazione delle celle e del testo
-
AutoreArticoli
-
Ciao a tutti,
sto cercando di capire come scrivere il codice per fare in modo che:
-la cella sia di una certa larghezza (determinate colonne) e altezza (determinate righe)
-il testo sia centrato e in grassetto (tutto il foglio)
-il testo di una cella vada a capo (determinate celle)
-le celle abbiano un colore particolare (determinate celle)
Grazie mille..
Parliamo di una tabella Word o di un foglio Excel?
Hai un esempio da mostrare per capire il risultato atteso?
Hai provato a stendere un po' di codice?
Come sei messo a VBA?
Ciao,
allora in poche parole ho scritto il codice per poter giocare a MasterMind su Excel..l'ho scritto però ora vorrei che una volta che si clicca sul pulsante di avvio, si formattino le celle in una certa maniera.
Ti appiccico qui una foto di come avrei in mente di far venire fuori le celle..
Per quanto riguarda il testo (e il colore delle celle) devo ancora pensarci, però vedi le celle con il testo a capo? Vedi che alcune hanno dimensioni diverse da quelle di default?
Una cella è un oggetto Range che espone determinate proprietà e tra queste ci sono quelle che impostano (o recuperano) il valore del colore di primo piano, di sfondo, eventuale bordo, allineamento, stile, ecc.
Per esempio:
with range("A1").Font .Color = vbred .Bold = True .Name = "Consolas" .Size = 24 end withimposta A1 in colore rosso, grassetto e font "consolas" di dimensione 24.
Sulla dimensione delle colonne puoi usare Autofit:
columns(1).autofit 'aggiusta in larghezza la colonna A rows(10).autofit 'aggiusta in altezza la riga 10-la cella sia di una certa larghezza (determinate colonne) e altezza (determinate righe)
Per impostare un valore preciso:
range("A1").columnWidth = 16 'imposta la larghezza della colonna A a 16 pixel range("A1").RowHeight = 16 'imposta l'altezza della cella A1 a 16 pixelho scritto il codice per poter giocare a MasterMind
Ottimo esercizio 🙂
Mi ricorda quando ne ho realizzato la mia versione con le famigerate macro di Lotus 1-2-3 (era il 1990 circa). Quel programmino lo spedii a una rivista che oggi non c'è più e ricevetti pure un premietto in denaro 😉
Uooooooooo
!!!!!!!Mitico, grazie mille!!! Sìsì, io sono del parere che se bisogna imparare una cosa, si fa molto prima divertendosi!!!
Ottimo davvero, anche perchè spieghi sempre qualcosina in più, che è molto utile!!!
Una cosa, per mettere che faccia "testo a capo", che devo scrivere?!
PS
Dì la verità....nella vita precedente facevi l'aiutante a forma di graffetta di Office?!
per mettere che faccia "testo a capo", che devo scrivere?
Che ne dici di provare con:
range("A1").WrapText = TrueUn buon trucco per cominciare a impratichirsi e scoprire da sè queste cose è utilizzare il "registratore di macro". Che poi produce codice da affinare e ottimizzare, vabbè, ma è ottimo per imparare.
Un trucco avanzato è utilizzare il visualizzatore oggetti (premi F2 nell'editor) per scoprire tutti - ma proprio tutti - gli oggetti dell'applicazione a disposizione, con i loro bravi metodi e proprietà.
facevi l'aiutante a forma di graffetta di Office
Sì... e ancor prima facevo l'OVL di WordStar e prima ancora il "Border Assistant" di Framework IV della Ashton Tate 😀
Eheh
Grazie mille come sempre.....ascolta io ho scritto così:
Columns(1).AutoFit Columns(5).AutoFit Columns(6).AutoFit Columns(7).AutoFit Columns(8).AutoFit 'Imposta le colonne segnate a larghezza adattata a quello che c'è scritto dentro Range(10).ColumnWidth = 119 Range(11).ColumnWidth = 75 'Imposta le larghezze delle colonne, in pixel Range("J1").WrapText = True Range("K1").WrapText = True 'Imposta il "Testo a capo" nelle colonne indicateperò mi dà questo errore:

Che sbaglio?
Mmm ho trovato che prima devo mettere il testo a capo e poi la larghezza delle colonne.... Però è anche una questione di logica...l'autofit lo fa solamente dopo che ho inserito il testo....non è una cosa sempre attiva, che ogni volta che io inserisco del testo, la macro fa si che la cella si autofitti istantaneamente.....
Mentre l'errore era causato da quello che mettevo dentro le parentesi:
Range("J1").WrapText = TrueLa sintassi corretta è:
Range("J:J").WrapText = TrueOra però ho qualche altra questione da risolvere....
La sintassi corretta è:
No, mi spiace, è corretto anche indicare solo una cella. Come è giusto che sia 🙂
Può darsi che a causare l'errore fossero magari delle celle unite. Non è nemmeno corretto che ci sia la sequenza di operazioni che hai indicato, no no, deve esserci qualcos'altro.
Non hai detto su quale riga di codice si verifica l'errore. Ci vorrebbe il file per capire meglio...
ho qualche altra questione da risolvere
Risolto un problema di solito se ne presenta subito un altro, è sempre così 🙂
Mmmm diciamo che ho messo alcune righe di codice prima di altre e ora non mi dà l'errore nemmeno mettendo
Range("J1").WrapText = Trueal posto di
Range("J:J").WrapText = Trueperchè infatti, come dici tu (c'ho dovuto ragionare un attimo) la sintassi è cmq corretta...
Comunque ora l'errore non lo dà più, però se guardi l'allegato vedi che la colonna J non è bellissima da vedere, per quello impostavo che il testo andasse a capo ma comunque poi gli fissavo una certa larghezza alla colonna....però mettendo i pixel corrispondenti, e cioè 106 (trascinando con il mouse la larghezza della colonna, quesa mi sembra una dimensione decente) viene fuori una cosa spropositata...
Allegati:
You must be logged in to view attached files.Ho indovinato il numero in nove tentativi 🙂
mettendo i pixel corrispondenti, e cioè 106
L'unità di misura è in punti, non in pixel. Cioè devi guardare il primo dei due numeri che vengono fuori quando clicchi e trascini la larghezza della colonna (106 pixel = 14.43 punti). Che poi i punti dipendono da font, dimensione e stile del carattere oltre che dalla risoluzione dello schermo... fai una cosa approssimata senza perderti nelle misure precise, se cambi pc o monitor puoi sicuramente notare delle differenze rispetto al tuo pc di sviluppo e allora la frustrazione è doppia 🙂
columns(10).columnwidth=14.43 'colonna J, 106 pixel circaConcentrati per ora sull'algoritmo e sulla modalità di interazione con l'utente. Non mi piace molto l'inputbox, sarebbe preferibile inserire un numero direttamente nella cella e poi premere un pulsante per confermare l'inserimento della riga.
Comunque l'idea è molto carina, e mi piace 🙂
Alcuni consigli non richiesti:
- metti sempre Option Explicit in testa ai moduli e quindi dichiara tutte le variabili che utilizzi ("i", "j" non sono definite);
- se dichiari una variabile, dichiarala del tipo giusto;
- se dichiari più variabili sulla stessa riga, specifica per ognuna di esse il proprio tipo, altrimenti vengono tutte dichiarate As Variant (esempio, nella riga "Dim NumX1, NumX2, NumX3, NumX4 As Integer", soltanto NumX4 è di tipo Integer, le altre sono anonime e quindi di tipo Variant, con un piccolo spreco di memoria e perdita di performances);
- compatta le istruzioni: invece di una sfilza di Cells(j, 3) = "--" puoi avere un range unico: Range(Cells(j, 3), Cells(j, 8)) = "--";
- indenta le istruzioni nei blocchi (If...End If) per la leggibilità del codice come hai fatto con Do e For (oppure, visto che sono If single line, mantieni ognuno di essi su una stessa linea senza usare End If;
- a cosa ti serve la Classe1?
L'unità di misura è in punti, non in pixel.
Ok capito!
Non mi piace molto l'inputbox, sarebbe preferibile inserire un numero direttamente nella cella e poi premere un pulsante per confermare l'inserimento della riga.
Mmm...interessante....sarebbe però anche il caso di inserire qualche controllo....del tipo che mi deve dare errore se viene digitato qualche numero maggiore di 6, oppure negativo.....o meglio diciamo diverso da interi compresi tra 0 e 6!!
- metti sempre Option Explicit in testa ai moduli e quindi dichiara tutte le variabili che utilizzi ("i", "j" non sono definite);
- se dichiari più variabili sulla stessa riga, specifica per ognuna di esse il proprio tipo, altrimenti vengono tutte dichiarate As Variant (esempio, nella riga "Dim NumX1, NumX2, NumX3, NumX4 As Integer", soltanto NumX4 è di tipo Integer, le altre sono anonime e quindi di tipo Variant, con un piccolo spreco di memoria e perdita di performances);
Non sapevo, quindi dovrei scrivere:
Dim NumX1 As Integer Dim NumX2 As Integer Dim NumX3 As Integer Dim NumX4 As Integer? Ma sono stra sicuro che mi dirai che c'è un modo per raggruppare queste istruzioni in un'unica riga!!!
Come mi hai consigliato di fare per la cornicetta...In effetti si rende più snello il tutto.- indenta le istruzioni nei blocchi (If...End If) per la leggibilità del codice come hai fatto con Do e For (oppure, visto che sono If single line, mantieni ognuno di essi su una stessa linea senza usare End If;
Questo non l'ho capito....indentare? Cioè mettere in un formato ordinato? Pensavo di aver messo tutto in modo abbastanza ordinato.....intendi forse che avrei dovuto scriverli così:
`If Cells((j + 1), 4) = NumX1 Then PosOk = PosOk + 1 If Cells((j + 1), 5) = NumX2 Then PosOk = PosOk + 1 If Cells((j + 1), 6) = NumX3 Then PosOk = PosOk + 1 If Cells((j + 1), 7) = NumX4 Then PosOk = PosOk + 1`? E senza l' END IF finale?!
- a cosa ti serve la Classe1?
Te lo spiego qnd riesco a trovare cosa vuol dire!!! (Sto cercando il significato!!!)
Grazie mille intanto!!
1) Inserire dei controlli sull'input dell'utente è importantissimo proprio per evitare inserimenti incongrui che possono rompere il codice!
2) Le Dim una per riga sono un'ottima idea. Non c'è alcun modo di compattarle nel senso che intendi tu. Ogni variabile deve avere il "As tipo".
3) Indentare significa scrivere le istruzioni per blocchi logici. If ... Then ... End If è un blocco logico, For ... Next è un altro. Dopo ogni istruzione di apertura lasci quattro spazi e continui a scrivere codice che riguarda quel blocco, fino alla chiusura del blocco. Esempio (completamente inventato):
For i = 1 to 100 a = a + 1 b = a / 2 If a > 10 Then b = 0 range("A1") = "bip" Else b = b / 2 range("A1") = b End If For q = 1 to 3 range("A2") = "Calcolo " & q Next q Next i4) If permette di essere scritto su una linea sola e in tal caso non serve End If. Utile per compattare lo spazio occupato dal codice.
5) Classe1... probabilmente hai cliccato involontariamente... ma sapere cos'è una classe potrebbe esserti utile un giorno 🙂
Ciao..andiamo per gradi..
1) Ok, voglio ora inserire dei controlli..
Innanzitutto ho tolto il box per l'inserimento dei numeri, però, quando il programma legge le varie righe, arriva qui e..
MsgBox "Digita nelle quattro celle i tuoi numeri e poi clicca su TEST", vbOK 'Regole 3 Num1 = Cells((j + 1), 4) Num2 = Cells((j + 1), 5) Num3 = Cells((j + 1), 6) Num4 = Cells((j + 1), 7)niente, lui continua a ri-presentarmi questo box di invito ad inserire i numeri ma.....eccheccaspita, lasciameli almeno inserire no?!!?
sì, il fatto è proprio che non mi permette di inserirli perchè non ho niente che lo metta un attimo in "pausa", passa subito al j successivo.Quindi proprio dopo queste righe avrei bisogno di cliccare un bottone che gli faccia fare i test e quindi andare avanti con il gioco.
MA...finora io ho sempre scritto il codice per una macro e POI assegnato l'intera macro ad un pulsante....vuoi dirmi che in questo caso dovrei fare una macro dentro ad una macro (Macroception?!) e assegnare la macro interna ad un pulsante? Esiste una cosa del genere?!?!
Allegati:
You must be logged in to view attached files.Ciao ..ma e scritto per vb6?
mi puoi aiutare cosa manca per far formattare le colonne excel a1 b1 c1 ecc....
dal codice spezzettato da solo errori
cia a presto
ma non e' codice per visual basic 6
e' per vba?
ma a chi serve?
Ciao @FRANCESCOSTRANO
Perchè ti accodi ad una discussione ormai datata? Ne perdi in visibilità.
Il codice postato è per VBA e serve all'originario richiedente che aveva un problema con la formattazione di testo e celle..
A te cosa serve in particolare? Prova ad aprire una tua discussione specificando il tutto.
Ciao,
Mario
-
AutoreArticoli
