Sviluppare funzionalita su Microsoft Office con VBA Macro per selezione intervallo righe da input box

LoginRegistrati
Stai vedendo 16 articoli - dal 1 a 16 (di 16 totali)
  • Autore
    Articoli
  • #26906 Risposta

    M4rK081
    Partecipante

      Ciao a tutti!
      Sono un nuovo iscritto purtroppo senza alcuna o quasi competenza di programmazione.
      Avrei la necessità di ricevere aiuto in merito alla realizzazione di una macro da inserire all'interno di un file Excel che mi permetta attraverso una input box, con la quale andare a chiedere all'utente di scegliere quale/i righe del file Excel vuole selezionare ed importarne il contenuto all'interno di un file Word attraverso una stampa unione.
      Ho un file Excel che utilizzo come sorta di DB ed ho un file Word già predisposto per ricevere i dati all’interno di alcune tabelle.
      La Macro che sono riuscito a realizzare mi permette di selezionare dal DB (file Excel) una riga a mia scelta dalla quale prelevare i dati ed importarli nel file Word (fin qui nessun problema, funziona correttamente).
      Avrei bisogno invece di poter selezionare più righe ed ottenere per ciascuna di esse un singolo file Word.

      Allego i files in questione.

      Allegati:
      You must be logged in to view attached files.
      #26909 Risposta
      patel
      patel
      Moderatore
        39 pts

        Potresti provare con Application.InputBox che ti permette di selezionare direttamente dal foglio le righe o il range, per capire prova questo codice

        Sub a()
        Dim rng As Range
        Set rng = Application.InputBox(prompt:="select range to copy", Type:=8)
        rng.Copy Sheets(2).Range("A1")
        End Sub

         

        #26910 Risposta

        M4rK081
        Partecipante

          No, ho bisogno di selezionare di volta in volta righe differenti.

          Questo perché essendo il mio foglio Excel composto da centinaia di righe, mi sarebbe comodo poter scegliere per quali di esse andare ad importare i dati nel file Word.

          #26911 Risposta
          patel
          patel
          Moderatore
            39 pts

            Rileggi il post precedente, l'ho modificato

            #26912 Risposta

            M4rK081
            Partecipante

              Perdonami ma sono assolutamente non esperto di programmazione (quello che sono riuscito a fare fino ad ora è frutto di diversi copia ed incolla di codici presi da esempi vari).

              Questo è il codice della mia Macro, potresti indicarmi come potrei modificarlo?

              Ti ringrazio.

              Sub StampaWord()
              
                  Dim xWord As Object
                  Dim wdFileName As Variant
                  Dim xTab As Object          ' Oggetto Tabella data
                  Dim xTab1 As Object         ' Oggetto Tabella sez a1
                  Dim xTab2 As Object         ' Oggetto Tabella sez a2
                  Dim xTab3 As Object         ' Oggetto Tabella sez a3
                  Dim xTab4 As Object         ' Oggetto Tabella sez a4
                  Dim xTab5 As Object         ' Oggetto Tabella riepilogo sezioni
                  Dim xTab6 As Object         ' Oggetto Tabella riepilogo sezioni
                  Dim NumTotRows1 As Long     'NUMERO DI RIGHE DATABASE
                  Dim I As Integer            'INDICE
                  Dim risp As String
                  Dim nriga As String
                  
              
                  Application.ScreenUpdating = False                               ' Serve per disabilitare i saltellamenti dello schermo (macro più veloci)
                  
                  Set Wb = ActiveWorkbook
                  With Wb
                      Set WsG = Sheets("Check")
                  End With
                  
                  NumTotRows1 = WsG.Range("AO" & Rows.Count).End(xlUp).Row
              
                  
                  wdFileName = Application.GetOpenFilename()
                  If wdFileName = False Then Exit Sub 'user cancelled import file browser
                  
              ciclo:
                  I = 2
                  risp = InputBox("Inserisci la riga che vuoi importare:", "Numero della pratica", "Numero cliente")
                  If risp <> "" Then
                  If Not IsNumeric(risp) Then
                     MsgBox risp & " è una stringa, devi digitare un numero"
                     GoTo ciclo
                  Else
                  End If
              
              nriga = risp
              If nriga <= 1 Then
                     MsgBox risp & " è un numero inferiore a 2, devi digitare un numero superiore"
                     GoTo ciclo
                  Else
                  End If
                  
                  For I = 2 To NumTotRows1
                    If I = nriga Then
                      Set xWord = CreateObject("Word.Application")
                      xWord.Documents.Open wdFileName
                      
                      Set xTab = xWord.ActiveDocument.Tables(1)
                      Set xTab1 = xWord.ActiveDocument.Tables(2)
                      Set xTab2 = xWord.ActiveDocument.Tables(3)
                      Set xTab3 = xWord.ActiveDocument.Tables(4)
                      Set xTab4 = xWord.ActiveDocument.Tables(5)
                      Set xTab5 = xWord.ActiveDocument.Tables(6)
                      Set xTab6 = xWord.ActiveDocument.Tables(8)
                      
                      xTab.Rows(1).Cells(2).Range.Text = WsG.Cells(NumTotRows1 + 2, 2)
                      
                      xTab1.Rows(2).Cells(2).Range.Text = WsG.Cells(1, 2)
                      xTab1.Rows(2).Cells(3).Range.Text = WsG.Cells(I, 2)
                      xTab1.Rows(3).Cells(2).Range.Text = WsG.Cells(1, 3)
                      xTab1.Rows(3).Cells(3).Range.Text = WsG.Cells(I, 3)
                      xTab1.Rows(4).Cells(2).Range.Text = WsG.Cells(1, 4)
                      xTab1.Rows(4).Cells(3).Range.Text = WsG.Cells(I, 4)
                      xTab1.Rows(5).Cells(2).Range.Text = WsG.Cells(1, 5)
                      xTab1.Rows(5).Cells(3).Range.Text = WsG.Cells(I, 5)
                      xTab1.Rows(6).Cells(2).Range.Text = WsG.Cells(1, 6)
                      xTab1.Rows(6).Cells(3).Range.Text = WsG.Cells(I, 6)
                      xTab1.Rows(7).Cells(2).Range.Text = WsG.Cells(1, 7)
                      xTab1.Rows(7).Cells(3).Range.Text = WsG.Cells(I, 7)
                      xTab1.Rows(8).Cells(2).Range.Text = WsG.Cells(1, 8)
                      xTab1.Rows(8).Cells(3).Range.Text = WsG.Cells(I, 8)
                      xTab1.Rows(9).Cells(2).Range.Text = WsG.Cells(1, 9)
                      xTab1.Rows(9).Cells(3).Range.Text = WsG.Cells(I, 9)
                      xTab1.Rows(10).Cells(2).Range.Text = WsG.Cells(1, 10)
                      xTab1.Rows(10).Cells(3).Range.Text = WsG.Cells(I, 10)
                      xTab1.Rows(11).Cells(2).Range.Text = WsG.Cells(1, 11)
                      xTab1.Rows(11).Cells(3).Range.Text = WsG.Cells(I, 11)
                      xTab1.Rows(12).Cells(2).Range.Text = WsG.Cells(1, 12)
                      xTab1.Rows(12).Cells(3).Range.Text = WsG.Cells(I, 12)
                      xTab1.Rows(13).Cells(2).Range.Text = WsG.Cells(1, 13)
                      xTab1.Rows(13).Cells(3).Range.Text = WsG.Cells(I, 13)
                      
                      xTab2.Rows(3).Cells(2).Range.Text = WsG.Cells(1, 14)
                      xTab2.Rows(3).Cells(3).Range.Text = WsG.Cells(I, 14)
                      xTab2.Rows(4).Cells(2).Range.Text = WsG.Cells(1, 15)
                      xTab2.Rows(4).Cells(3).Range.Text = WsG.Cells(I, 15)
                      
                      xTab3.Rows(3).Cells(2).Range.Text = WsG.Cells(1, 16)
                      xTab3.Rows(3).Cells(3).Range.Text = WsG.Cells(I, 16)
                      xTab3.Rows(4).Cells(2).Range.Text = WsG.Cells(1, 17)
                      xTab3.Rows(4).Cells(3).Range.Text = WsG.Cells(I, 17)
                      xTab3.Rows(5).Cells(2).Range.Text = WsG.Cells(1, 18)
                      xTab3.Rows(5).Cells(3).Range.Text = WsG.Cells(I, 18)
                      xTab3.Rows(6).Cells(2).Range.Text = WsG.Cells(1, 19)
                      xTab3.Rows(6).Cells(3).Range.Text = WsG.Cells(I, 19)
                      xTab3.Rows(7).Cells(2).Range.Text = WsG.Cells(1, 20)
                      xTab3.Rows(7).Cells(3).Range.Text = WsG.Cells(I, 20)
                      xTab3.Rows(8).Cells(2).Range.Text = WsG.Cells(1, 21)
                      xTab3.Rows(8).Cells(3).Range.Text = WsG.Cells(I, 21)
                      xTab3.Rows(9).Cells(2).Range.Text = WsG.Cells(1, 22)
                      xTab3.Rows(9).Cells(3).Range.Text = WsG.Cells(I, 22)
                      xTab3.Rows(10).Cells(2).Range.Text = WsG.Cells(1, 23)
                      xTab3.Rows(10).Cells(3).Range.Text = WsG.Cells(I, 23)
                      xTab3.Rows(11).Cells(2).Range.Text = WsG.Cells(1, 24)
                      xTab3.Rows(11).Cells(3).Range.Text = WsG.Cells(I, 24)
                      xTab3.Rows(12).Cells(2).Range.Text = WsG.Cells(1, 25)
                      xTab3.Rows(12).Cells(3).Range.Text = WsG.Cells(I, 25)
                      xTab3.Rows(13).Cells(2).Range.Text = WsG.Cells(1, 26)
                      xTab3.Rows(13).Cells(3).Range.Text = WsG.Cells(I, 26)
                      xTab3.Rows(14).Cells(2).Range.Text = WsG.Cells(1, 27)
                      xTab3.Rows(14).Cells(3).Range.Text = WsG.Cells(I, 27)
                      xTab3.Rows(15).Cells(2).Range.Text = WsG.Cells(1, 28)
                      xTab3.Rows(15).Cells(3).Range.Text = WsG.Cells(I, 28)
                      xTab3.Rows(16).Cells(2).Range.Text = WsG.Cells(1, 29)
                      xTab3.Rows(16).Cells(3).Range.Text = WsG.Cells(I, 29)
                      xTab3.Rows(17).Cells(2).Range.Text = WsG.Cells(1, 30)
                      xTab3.Rows(17).Cells(3).Range.Text = WsG.Cells(I, 30)
                      xTab3.Rows(18).Cells(2).Range.Text = WsG.Cells(1, 31)
                      xTab3.Rows(18).Cells(3).Range.Text = WsG.Cells(I, 31)
                      
                      
                      xTab4.Rows(2).Cells(2).Range.Text = WsG.Cells(1, 36)
                      xTab4.Rows(2).Cells(3).Range.Text = WsG.Cells(I, 36)
                      xTab4.Rows(3).Cells(2).Range.Text = WsG.Cells(1, 37)
                      xTab4.Rows(3).Cells(3).Range.Text = WsG.Cells(I, 37)
                      xTab4.Rows(4).Cells(2).Range.Text = WsG.Cells(1, 38)
                      xTab4.Rows(4).Cells(3).Range.Text = WsG.Cells(I, 38)
                      xTab4.Rows(5).Cells(2).Range.Text = WsG.Cells(1, 39)
                      xTab4.Rows(5).Cells(3).Range.Text = WsG.Cells(I, 39)
                      xTab4.Rows(6).Cells(2).Range.Text = WsG.Cells(1, 40)
                      xTab4.Rows(6).Cells(3).Range.Text = WsG.Cells(I, 40)
                      xTab4.Rows(7).Cells(2).Range.Text = WsG.Cells(1, 41)
                      xTab4.Rows(7).Cells(3).Range.Text = WsG.Cells(I, 41)
                      
                      
                      xTab5.Rows(2).Cells(1).Range.Text = WsG.Cells(1, 32)
                      xTab5.Rows(2).Cells(2).Range.Text = WsG.Cells(I, 32)
                      
                      xTab6.Rows(1).Cells(1).Range.Text = WsG.Cells(1, 33)
                      xTab6.Rows(1).Cells(2).Range.Text = WsG.Cells(I, 33)
                      xTab6.Rows(2).Cells(1).Range.Text = WsG.Cells(1, 34)
                      xTab6.Rows(2).Cells(2).Range.Text = WsG.Cells(I, 34)
                      xTab6.Rows(3).Cells(1).Range.Text = WsG.Cells(1, 35)
                      xTab6.Rows(3).Cells(2).Range.Text = WsG.Cells(I, 35)
                      
                      
                      xWord.ActiveDocument.SaveAs wdFileName & I & ".doc"
                      xWord.ActiveDocument.Close
                      xWord.Quit
                      
                      Exit Sub
                    End If
                  Next I
                  Else
                      MsgBox "La riga non corrisponde a nessun cliente"
                  End If
              
              
              
              
                  Application.ScreenUpdating = True
              
              End Sub
              #26913 Risposta
              patel
              patel
              Moderatore
                39 pts

                L'obiettivo del forum è di aiutare a risolvere i problemi, non di fornire soluzioni pronte, se vuoi imparare il VBA trovi un corso in fondo alla pagina

                #26914 Risposta

                M4rK081
                Partecipante

                  Non chiedevo la soluzione pronta, ma semplicemente di capire il codice che mi hai suggerito cosa dovrebbe sostituire del mio....

                  #26929 Risposta
                  patel
                  patel
                  Moderatore
                    39 pts

                    Potresti copiare le righe selezionate in un altro foglio e poi su questo fare un ciclo che le esplora tutte ed utilizza il codice già scritto con le opportune modifiche, non è una cosa semplice e richiede un po' di tempo

                    #26933 Risposta

                    M4rK081
                    Partecipante

                      Bene, come non detto.... ho capito che non è una cosa che fa per me 🙁

                      #26943 Risposta
                      patel
                      patel
                      Moderatore
                        39 pts

                        Se hai intenzione di imparare e ci provi qui siamo sempre disponibili ad aiutarti

                        #27015 Risposta

                        M4rK081
                        Partecipante

                          Ciao, sono riuscito finalmente ad arrivare ad una soluzione definitiva che mi permette di raggiungere l'obiettivo che mi ero prefissato. 

                          Avrei però un'ultima esigenza, ovvero, poter convertire automaticamente tutti i file Word generati in file PDF.

                          Qualcuno potrebbe darmi indicazioni in merito? 

                          #27016 Risposta
                          patel
                          patel
                          Moderatore
                            39 pts

                            Sarebbe gentile da parte tua condividere la soluzione col forum, per il resto puoi risolvere con una semplice ricerca su google del tipo "vba word to pdf"

                            #27019 Risposta

                            M4rK081
                            Partecipante

                              Ho risolto andando a prevedere una colonna aggiuntiva all'interno del mio file Excel nella quale sono andato ad indicare lo "STATO" in cui si trovano le pratiche.

                              Fatto questo, con un semplice ciclo For vado a selezionare solo quelle righe che contengono nella colonna "STATO" la parola "EVASA" per poi procedere alla generazione del file Word.

                              Al momento, non sapendo come andare a generare contemporaneamente anche i files PDF, ho risolto con una macro che mi converte in PDF tutti i file Word generati e presenti all'interno della cartella nella quale si trova il file Excel.

                              #27030 Risposta

                              M4rK081
                              Partecipante

                                M4rK081 ha scritto:

                                Al momento, non sapendo come andare a generare contemporaneamente anche i files PDF, ho risolto con una macro che mi converte in PDF tutti i file Word generati e presenti all'interno della cartella nella quale si trova il file Excel.

                                Volevo chiarire ulteriormente rispetto a quest'ultima problematica...

                                La cartella nella quale si trova il mio file Excel contiene anche il file "modello" di Word utilizzato per effettuare la stampa unione. 

                                Ciò comporta il fatto che quando voglio andare a generare i files pdf, in automatico mi carica anche il file "modello" e ne crea appunto la rispettiva copia in PDF.

                                Ci sarebbe una soluzione per escludere dalla conversione solo il file "modello"?

                                 

                                #27116 Risposta

                                M4rK081
                                Partecipante

                                  Nessun suggerimento?

                                  #27145 Risposta
                                  patel
                                  patel
                                  Moderatore
                                    39 pts

                                    Il nome del file modello lo conosci, quindi devi nel ciclo escludere i file con quel nome.

                                    Se alleghi la macro che usi possiamo provare a modificarla

                                  LoginRegistrati
                                  Stai vedendo 16 articoli - dal 1 a 16 (di 16 totali)
                                  Rispondi a: Macro per selezione intervallo righe da input box
                                  Gli allegati sono permessi solo ad utenti REGISTRATI
                                  Le tue informazioni:



                                  vecchio frac - 2750 risposte

                                  albatros54
                                  albatros54 - 1009 risposte

                                  patel
                                  patel - 935 risposte

                                  Marius44
                                  Marius44 - 795 risposte

                                  Luca73
                                  Luca73 - 685 risposte