› Sviluppare funzionalita su Microsoft Office con VBA › Inserimento di caselle di testo in Word da Excel VBA
-
AutoreArticoli
-
Ciao,
mi sto cimentando in un nuovo esperimento.
voglio costruire una pagina word partendo da un file excel.
ho trovato il modo per aprire un nuovo documento word
ho iniziato ad inserire N righe di testo statico
volevo anche aggiungere delle caselle di testo accanto a delle parole, in word sono presenti queste caselle di testo tra le forme, ma non sto trovando il modo per farle inserire dalla mia funzione.
se registro la macro di inserimento in excel sull'editor di vba mi riporta la funzione, ma se faccio la stessa cosa in word, mi registra una macro vuota.
allego un'immagine giusto per farvi capire cosa volevo inserire, ma alla fine sono le classiche checkbox
Allegati:
You must be logged in to view attached files.Un suggerimento potrebbe essere quello di inserire un carattere "quadrato vuoto" (oppure "quadrato spuntato" se è una check list quella che devi implementare) ricavandolo dai caratteri Wingdings.
Potresti anche costruire un template di Word che riempi con i dati voluti. Allora i quadratini possono essere sostituiti da cellette di tabella (usa le tabelle Luke! sono molto potenti e flessibili) che possono essere manipolate per quanto riguarda i loro bordi (anche in diagonale).
A naso una cosa così:
selection.Font.Name = "wingdings"selection.typetext chr(111)disegna un quadratino che se lo evidenzi e lo formatti come testo normale diventa una "o" minuscola. Ma in Wingdings è un quadratino.
Naturalmente se intendevi proprio che vuoi inserire una casella di testo in una certa posizione, cambia tutto
Esempio
ActiveDocument.Shapes.AddTextbox msoTextOrientationHorizontal, 50, 50, 25, 25ti ringrazio, ma non funziona, eseguendo mi da errore "Tipo non corrispondente"
L'istruzione l'ho provata in Word e funziona correttamente. Se tu l'hai provata in Word e non ti funziona, è strano: quindi specifica che versione di Word stai usando.
E' altamente probabile comunque che tu voglia farlo da Excel. Io non ho spiegato come fare perchè mi sembra prematuro, dal momento che prima bisogna capire se questa è una soluzione accettabile per te. Dopodichè ok, bisogna istanziare gli oggetti giusti, aprire gli oggetti giusti e pilotare gli oggetti giusti.
Mi sono entrate alcune attività urgenti da seguire e quindi essendo questo solo un esercizio sono costretto a sospenderlo. quindi per il momento chiudo il thread e poi eventualmente ne aprirò uno nuovo quando potrò rimetterci la testa
Non c'era bisogno di giustificarsi però grazie della tua premura. Torna quando vuoi e quando puoi.
Ah dimenticavo, la sub scritta in VBA direttamente in un foglio WORD funziona, mentre se la lancio adeguandola da excel mi da errore.
sembra che non si riesca ad attivare il documento word e quindi l'ActiveDocument va a prendere se esiste un documento aperto in precedenza altrimenti se non esiste da errore.
ho una mezza idea di quello che devo fare, ma ancora non ho potuto provare per il motivo scritto sopra.
suppongo che io debba dopo aver creato il documento salvarlo in un percorso a piacere e vedere se così posso impostarlo come activedocument.
ma vi farò sapere quando riuscirò a provarci
salvarlo in un percorso a piacere e vedere se così posso impostarlo come activedocument.
No, non complicarti le cose inutilmente, ti basta impostare un riferimento all'oggetto Document assegnandolo ad una variabile oggetto. Ne riparliamo quando hai voglia/tempo/possibilità di farlo.
non so perché, ma oggi funziona meglio.
anche se ha ancora grossa crisi!!!
i problemi che sto riscontrando sono questi due, allego anche il file così mi puoi/potete bacchettare su la forma rozza del codice
Problema 1: Se lo lancio una prima volta mi crea il documento e mi mette il chechbox, se lo lancio una seconda volta e non ho chiuso il vecchio documento, mi crea il documento scrive tutto, ma il checkbox lo mette nel vecchio documento
Problema 2: ActiveDocument.Shapes.AddTextbox msoTextOrientationHorizontal, 140, 5, 15.6, 15.6 mi da errore in modo randomico, una volta funziona e l'altra no ed è dovuto al 140 o al 5
Allegati:
You must be logged in to view attached files.Allora, scrivo la mia opinione.
Il codice che presenti non è così male e nemmeno così rozzo (o patetico come vedo nei commenti al codice) 🙂
Per farlo funzionare io ho utilizzato l'early binding cioè ho dichiarato le variabili as object invece che del tipo corretto, perchè non ho referenziato la libreria di Word. Fatto questo e l'aggiustamento che segue, funziona tutto benissimo.L'aggiustamento, che risolve il primo punto, è nel sostituire le istanze di ActiveDocument con WordDoc. Non capisco perchè non lo fai, dal momento che hai creato questo oggetto ma poi non lo usi.
Ecco le mie uniche modifiche al tuo codice:
'--- questo blocco mi serve per creare lo shape di tipo textbox e per il momento popolarlo con una X - INIZIO With WordDoc .Shapes.AddTextbox msoTextOrientationHorizontal, 140, 40, 15.6, 15.6 .Shapes(.Shapes.Count).Name = "check_" & .Shapes.Count End With With WordDoc.Shapes("check_1").TextFrame.TextRange .Text = "X" .Font.Name = "Calibri" .Font.Size = 11 .Font.Bold = True .ParagraphFormat.LeftIndent = WordApp.CentimetersToPoints(-0.1) .ParagraphFormat.LineSpacing = WordApp.LinesToPoints(0.7) End WithNota che per LeftIndent e LineSpacing ho dovuto specificare WordApp perchè le due funzioni di conversione (da centimetri a punti e da linee a punti) sono metodi dell'oggetto Word Application e quindi sono sconosciute a Excel: pertanto le devi referenziare esplicitamente. Avendo già istanziato l'oggetto Word Application, la correzione è facilissima.
Stilisticamente, puoi utilizzare nel seguito un With WordSel ... End With per evitare di scrivere ripetutamente WordSel.TypeText (puoi sostituire con .TypeText). Una finezza ininfluente 🙂
Il problema 2 non l'ho riscontrato nemmeno dopo un ciclo ininterrotto di dieci chiamate all'intera procedura (che ha generato dieci fogli word perfettamente compilati).
L'unica stranezza è la posizione della Shape con la X... in alto nel foglio. Vabbè forse devi aggiustare le misure. Dipende dove devi metterla 🙂
Ah consiglio importante... manca Option Explicit, mettilo in testa al modulo, sempre, quando sviluppi con VBA.
Prima di tutto ti ringrazio, ho provato la tua soluzione (mantenendo le variabili di tipo Word) e sembra funzionare.
Non ho usato WordDoc semplicemente perché ho copiato la funzione che avevo scritto in Word ed ho mantenuto quello scritto di la anche perché quando inserivo WordDoc mi dava errore e solo ieri quando ho aggiunto le note mi sono accorto che il problema era legato ad altro e sinceramente mi è passato di mente di sostituire ActiveDocument con WordDoc.
Per il LeftIndent e LineSpacing non ne avevo la minima idea, quindi ti ringrazio per la segnalazione/correzione.
Per il WordSel hai pienamente ragione ed è una cosa che faccio solitamente a lavoro finito, prima scrivo un codice che "funziona" e poi lo miglioro/snellisco successivamente, è sciocco, ma per il momento faccio fatica a scrivere codice fatto bene sin da subito.
con la tua modifica il secondo problema non si presenta nemmeno a me, quindi probabilmente poteva essere legato al ActiveDocument e si è risolto usando WordDoc.
per quanto riguarda il tuo ultimo punto, ovvero il fatto che lo mette in alto a sinistra del documento, io ho una mia idea che devo ancora verificare, secondo me e potrei sbagliarmi quando si indica questa stringa
msoTextOrientationHorizontal, 140, 40, 15.6, 15.6
con 140 e 40 il sistema intende i punti da sinistra a destra e da sopra a sotto, della riga in cui si inserisce il checkbox e non quelli della pagina.
Per quanto riguarda Option Explicit, che dire non posso che darti ragione, ma mi dimentico sempre di metterlo
Comunque ripeto ti ringrazio per l'aiuto e quando troverò la soluzione di impaginazione della check box aggiungerò un altro commento così chi leggerà in futuro avrà tutte le informazioni necessarie
Grazie ancora
Per quanto riguarda il posizionamento nella pagina ovviamente la mia idea era sbagliata.
il posizionamento viene fatto a livello di pagina (non so se ci siano più pagine cosa succede)
comunque con la struttura che ho allegato, non so come mai il sistema posiziona i check box tutti assieme e poi li riposiziona nella pagina partendo dal basso
ho cambiato la mia struttura inserendo i check box alla fine della scrittura del testo e in questo caso i check box li posiziona nella pagina partendo dall'alto.
io ho optato per quest'ultima soluzione perché mi sembra più affidabile
Per quanto riguarda Option Explicit, che dire non posso che darti ragione, ma mi dimentico sempre di metterlo
Ciao vai su Strumenti -> Opzioni, li c'è una checkbox da spuntare. Una volta fatto sarà l' IDE di VBA ad inserirla per te
Grazie a tutti segno come risolta, visto che adesso sembra funzionare tutto a modo
ho cambiato la mia struttura inserendo i check box alla fine della scrittura del testo
Valuta l'opzione di creare una tabella di una cella e di inserirvi la Shape. Dovunque sia la tabellina, il codice vi posiziona dentro una casella di testo.
Sub test() Dim sx As Single Dim al As Single sx = ActiveDocument.Tables(1).Range.Information(wdHorizontalPositionRelativeToPage) al = ActiveDocument.Tables(1).Range.Information(wdVerticalPositionRelativeToPage) ActiveDocument.Shapes.AddTextbox msoTextOrientationHorizontal, sx, al, 13, 13 End Sub -
AutoreArticoli
