Sviluppare funzionalita su Microsoft Office con VBA Inserimento di caselle di testo in Word da Excel VBA

Login Registrati
Stai vedendo 20 articoli - dal 1 a 20 (di 20 totali)
  • Autore
    Articoli
  • #42535 Score: 0 | Risposta

    Fulvio
    Partecipante

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

      vecchio frac
      Senior Moderator
        272 pts

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

        #42538 Score: 0 | Risposta

        vecchio frac
        Senior Moderator
          272 pts

          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.

          #42539 Score: 0 | Risposta

          Fulvio
          Partecipante

            Ok grazie Vecchio frac, domani ci provo e ti saprò dire

            #42540 Score: 0 | Risposta

            vecchio frac
            Senior Moderator
              272 pts

              Naturalmente se intendevi proprio che vuoi inserire una casella di testo in una certa posizione, cambia tutto   

              #42541 Score: 0 | Risposta

              vecchio frac
              Senior Moderator
                272 pts

                Esempio

                ActiveDocument.Shapes.AddTextbox msoTextOrientationHorizontal, 50, 50, 25, 25

                #42637 Score: 0 | Risposta

                Fulvio
                Partecipante

                  ti ringrazio, ma non funziona, eseguendo mi da errore "Tipo non corrispondente"

                  #42640 Score: 0 | Risposta

                  vecchio frac
                  Senior Moderator
                    272 pts

                    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.

                    #42647 Score: 0 | Risposta

                    Fulvio
                    Partecipante

                      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

                      #42648 Score: 0 | Risposta

                      vecchio frac
                      Senior Moderator
                        272 pts

                        Non c'era bisogno di giustificarsi però grazie della tua premura. Torna quando vuoi e quando puoi.

                        #42755 Score: 0 | Risposta

                        Fulvio
                        Partecipante

                          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

                          #42762 Score: 0 | Risposta

                          vecchio frac
                          Senior Moderator
                            272 pts

                            Fulvio ha scritto:

                            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.

                            #42765 Score: 0 | Risposta

                            Fulvio
                            Partecipante

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

                              vecchio frac
                              Senior Moderator
                                272 pts

                                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 With
                                

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

                                 

                                #42772 Score: 0 | Risposta

                                Fulvio
                                Partecipante

                                  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

                                  #42773 Score: 0 | Risposta

                                  Fulvio
                                  Partecipante

                                    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

                                    #42780 Score: 0 | Risposta

                                    LucaSR
                                    Partecipante
                                      15 pts

                                      Fulvio ha scritto:

                                      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 

                                      #42785 Score: 0 | Risposta

                                      Fulvio
                                      Partecipante

                                        Fatto adesso grazie LucaSr

                                        #42786 Score: 0 | Risposta

                                        Fulvio
                                        Partecipante

                                          Grazie a tutti segno come risolta, visto che adesso sembra funzionare tutto a modo

                                          #42791 Score: 0 | Risposta

                                          vecchio frac
                                          Senior Moderator
                                            272 pts

                                            Fulvio ha scritto:

                                            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
                                            
                                          Login Registrati
                                          Stai vedendo 20 articoli - dal 1 a 20 (di 20 totali)
                                          Rispondi a: Inserimento di caselle di testo in Word da Excel VBA
                                          Gli allegati sono permessi solo ad utenti REGISTRATI
                                          Le tue informazioni: