Sviluppare funzionalita su Microsoft Office con VBA Comando Archia " Ciclo per registrare 10 righe di dati in Colonna"

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

    Dodi
    Partecipante
      2 pts

      Buona sera a tutti voi, 

      sono quasi a fine del gestionale che  mi son creato per lavoro, anche grazie al vostro aiuto e hai vostri consigli quando ne avevo bisogno, 

      ma mi trovo a riscrivere, e chiedere di nuovo  il vostro preziosissimo aiuto. 

       

      in pratica nella userform e nella Multipagina "Manodopera" ho una serie di textBox dove inserisco dati che successivamente archivio nel foglio GiornaleLavori. 

      il codice come l'ho scritto mi potrebbe anche andar bene. ma riscontro un rallentamento perchè ogni volta il codice così come l'ho scritto fa sempre il controllo per trovare l'ultima riga libera, 

      in pratica ora  il foglio non contiene molti dati ed è già lento di suo, figuriamoci quando ho un centinaio/ migliaio di righe già piene ; ci metterà un eternità. 

      ora chiedo a voi  se gentilmente potete darmi  una mano a trovare un modo diverso. 

      presumo che ci voglia un codice che ripete il ciclo, ma ancora non sono tanto autonomo per  poterlo creare in modo corretto e che mi permette di archiviare dati in modo più veloce. 

       

      Nota: va preso in considerazione anche che il codice così come l'ho scritto fa il controllo se le textBox (OPERAIO 1-2-3-4-5-6-7-8-9-10) e piena e numera in automatico il numero progressivo nella label a Sx delle textoBox. 

      Spero di esser stato chiaro nella spiegazione, cmq allego il file per farvi vedere come funziona e il codice che ho scritto io. 

      Magari provate anche voi a riempire tutte le textBox presenti sulla Userform e  cliccare sul tasto "Archivia", e vedete che ci mette molto tempo nel registrare i dati sul foglio Giornale lavori. Date un occhio al codice, che sicuramente per il vostro livello di conoscenza è sbagliato, o perlomeno in parte. 

       

      ringrazio per l'aiuto e resto in attesa di soluzione. . 

      Private Sub CommandButton10_Click()
      Dim RowCount As Long
      
      
      '-------------------------------------------------------------------------------Codice Archivia su Gestionale
      RowCount = Worksheets("Giornalelavori").Range("B" & Rows.Count).End(xlUp).Row
      With Worksheets("Giornalelavori").Range("B1")
      
      .Offset(RowCount, 0).Value = ordine1.Caption
      .Offset(RowCount, 1).Value = CDate(DataContr.Value)
      .Offset(RowCount, 2).Value = ComboBox7.Value
      .Offset(RowCount, 3).Value = Cantiere.Value
      .Offset(RowCount, 4).Value = ComboBox5.Value
      .Offset(RowCount, 5).Value = ComboBox6.Value
      .Offset(RowCount, 6).Value = Manodopera.Caption
      .Offset(RowCount, 7).Value = Costo1.Value
      .Offset(RowCount, 9).Value = ComboBox99.Value
      .Offset(RowCount, 11).Value = Opera.Value
      .Offset(RowCount, 12).Value = Wbs.Value
      .Offset(RowCount, 13).Value = Task_Lavorazione.Value
      .Offset(RowCount, 14).Value = attivita1.Value
      .Offset(RowCount, 16).Value = UM1.Caption
      .Offset(RowCount, 17).Value = ora1.Value
      .Offset(RowCount, 21).Value = OPERAIO1.Value
      .Offset(RowCount, 20).Value = Qualifica1.Value
      .Offset(RowCount, 22).Value = Prezzo1.Value
      
      End With
         
      
          If OPERAIO2.Text <> "" Then
      RowCount = Worksheets("Giornalelavori").Range("B" & Rows.Count).End(xlUp).Row
      With Worksheets("Giornalelavori").Range("B1")
      
      .Offset(RowCount, 0).Value = Label_OP_2.Caption
      .Offset(RowCount, 1).Value = CDate(DataContr.Value)
      .Offset(RowCount, 2).Value = ComboBox7.Value
      .Offset(RowCount, 3).Value = Cantiere.Value
      .Offset(RowCount, 4).Value = ComboBox5.Value
      .Offset(RowCount, 5).Value = ComboBox6.Value
      .Offset(RowCount, 6).Value = Manodopera.Caption
      .Offset(RowCount, 7).Value = Costo2.Value
      .Offset(RowCount, 9).Value = ComboBox99.Value
      .Offset(RowCount, 11).Value = Opera.Value
      .Offset(RowCount, 12).Value = Wbs.Value
      .Offset(RowCount, 13).Value = Task_Lavorazione.Value
      .Offset(RowCount, 14).Value = attivita2.Value
      .Offset(RowCount, 16).Value = UM2.Caption
      .Offset(RowCount, 17).Value = ora2.Value
      .Offset(RowCount, 21).Value = OPERAIO2.Value
      .Offset(RowCount, 20).Value = Qualifica2.Value
      .Offset(RowCount, 22).Value = Prezzo2.Value
      
      End With
          Else
          End If

       

      allego il file per  visionare quanto appena scritto. 

      Allegati:
      You must be logged in to view attached files.
      #26554 Score: 0 | Risposta

      Marius44
      Moderatore
        58 pts

        Ciao

        Devi tener presente che ogni"scrittura" sul foglio fa perdere tempo. Non entro nel merito del codice (ognuno di noi ha un proprio stile e se il risultato è quello che si vuole, allora va bene comunque) ma penso che si potrebbe velocizzare assegnando ad una matrice i valori da scrivere nelle celle da .Offset (RowCount, 0) fino a fino a .Offset(RowCount, 14) e poi scrivere indicando l'intervallo. Continuare poi con gli altri. 

        Altro sistema (più sbrigativo ma comporta un po' di lavoro prima) potrebbe essere quello di evitare i salti di colonna ed assegnare i valori in sequenza alla matrice e poi scrivere nell'intero intervallo)

         

        Ciao,

        Mario

        #26555 Score: 0 | Risposta

        Dodi

          Ciao Marius Grazie per la risposta, potresti propormi un codice che fa la stessa cosa del codice che ho scritto io? E magari più sintetico e che fa il controllo dal basso verso l'alto? Forse ci mette meno tempo? 

          Il problema non è tanto ora che ci sono pochi dati inseriti ma quando avrò mille righe, finché controlla tutti i cicli ci mette un eternità, e vorrei evitarlo. Potresti darmi una soluzione? 

          Anche per imparare magari nuove soluzioni e procedimenti. 

           

          Grazie 

           

           

          #26556 Score: 0 | Risposta

          Marius44
          Moderatore
            58 pts

            Ciao

            Ripeti per 10 volte questo ciclo

            1      .Offset(RowCount, 0).Value = ordine1.Caption
            10   .Offset(RowCount, 1).Value = CDate(DataContr.Value)
            10   .Offset(RowCount, 2).Value = ComboBox7.Value
            10   .Offset(RowCount, 3).Value = Cantiere.Value
            10   .Offset(RowCount, 4).Value = ComboBox5.Value
            10   .Offset(RowCount, 5).Value = ComboBox6.Value
            10   .Offset(RowCount, 6).Value = Manodopera.Caption
            1      .Offset(RowCount, 7).Value = Costo1.Value
            10   .Offset(RowCount, 9).Value = ComboBox99.Value
            10   .Offset(RowCount, 11).Value = Opera.Value
            10   .Offset(RowCount, 12).Value = Wbs.Value
            10   .Offset(RowCount, 13).Value = Task_Lavorazione.Value
            1     .Offset(RowCount, 14).Value = attivita1.Value
            1     .Offset(RowCount, 16).Value = UM1.Caption
            1     .Offset(RowCount, 17).Value = ora1.Value
            1     .Offset(RowCount, 21).Value = OPERAIO1.Value
            1     .Offset(RowCount, 20).Value = Qualifica1.Value
            1     .Offset(RowCount, 22).Value = Prezzo1.Value

            Le righe dove vedi il 10 sono identiche tutte le volte mentre le altre cambiano

            Devi trovare il sistema che, pur cambiando di volta in volta, ogni ciclo possa assegnare alla matrice il valore giusto. Ti passo un esempio (ma devi studiarci sopra per individuare il numero del controllo). Inserisci In UserForm1 un pulsante (dovrebbe venire il n°35)  ed assegnagli questo codice.

            Private Sub CommandButton35_Click()
            Dim obj As Control
            For Each obj In UserForm1.Frame2.Controls
            If TypeOf obj Is MSForms.TextBox Then
            obj.Value = True
            Stop
            End If
            Next

            End Sub

            Ho messo un stop per farti notare che tutte le TextBox avranno il valore True man mano che avanzi.

            Non è semplicissimo ma sicuramente alla tua portata.

            Ciao,

            Mario

            #26557 Score: 0 | Risposta

            GiuseppeMN
            Partecipante
              19 pts

              Buona giornata, @dodi;
              ho analizzato l'Evento:
              - Private Sub UserForm_Initialize()
              avrei una domada da porti, ho notato che avevi inserito le Istruzioni:
              - all'inizio Application.ScreenUpdating = False e alla fine Application.ScreenUpdating = True
              poi le hai rese come commento, c'è un motivo particolare?
              Queste Istruzioni migliorano i tempi di elaborazione.

              Inoltre ho notato che l'Istruzione:
              - lRiga = .Range("Z" & .Rows.Count).End(xlUp).Row + 1
              è ripetuta per ogni "Operaio"; considerando che la riga è sempre la stessa, c'è un motivo specifico per doverla ripetere?

              A margine di quanto sopra, avrei una cortesia da chiederti, come si ottiene la visualizzazione dei Codici VBA che hai proposto:

              VBA

              La visualizzazione che riesco ad ottenere è:

              Private Sub CommandButton10_Click()
              Dim RowCount As Long

              '-------------------------------------------------------------------------------Codice Archivia su Gestionale
              RowCount = Worksheets("Giornalelavori").Range("B" & Rows.Count).End(xlUp).Row
              With Worksheets("Giornalelavori").Range("B1")

              decisamente meno elegante.

              Grazie dell'attenzione che potrai dedicarmi.

              Buon Lavoro.

              Giuseppe

              #26559 Score: 0 | Risposta

              dodi

                Giuseppe Buongiorno

                la stringa 

                Application.ScreenUpdating = False e alla fine Application.ScreenUpdating = True

                le ho rese come commento perchè  quando cambio pagina sulla Multipage devo cambiare anche foglio, 

                 e se lascio attivi Application. ScreeUpdating ecc ecc non mi cambia foglio excel. 

                poi per quanto riguarda  

                Inoltre  l'Istruzione:
                - lRiga = .Range("Z" & .Rows.Count).End(xlUp).Row + 1

                la ripeto perchè,  a mia conoscenza è l'unico modo per registrare tutte le righe degl'operai in seguenza, scrivendo la prima riga e poi se la TextBox Operaio2 e piena trova la riga vuota successiva sul foglio e archivia e così via. 

                 

                il codice che ho proposto sull'editor del forum  e solo un pezzo. il resto lo trovi sul tasto "Archivia" della Userform del file che ho allegato.  magari prova a lanciare la Userform, compila tuyye le TextBox e combobox presenti e poi clicca sul tasto Archia e vedi quello che fa e quello che mi occorre. 

                In effetti lo riconosco anche io che è un metodo poco elegante,  poco veloce come procedimento e anche lento nell'archiviare i dati sul foglio Excel; per quello mi ero rivolto a voi esperti. 

                 

                intanto ringrazio anche Marius per la sua soluzione che provo tra un pò a mettere in atto e cerco di vedere se e più funzionale e veloce. Sperando di riuscire a capire la sua procedura Proposta. 

                 

                Ma se hai da proporre qualcosa ben venga, e te ne sarei grato. 

                 

                saluti.  

                 

                 

                #26560 Score: 0 | Risposta

                dodi

                  Marius Buon Giorno

                  in pratica le righe che te hai segnato con 10  si devono ripetere tutte le volte, 

                  perchè sono dei dati ripetitivi per ogni operaio. 

                  in pratica corrispondono :

                  10   .Offset(RowCount, 1).Value = CDate(DataContr.Value)   'alla data 

                  10   .Offset(RowCount, 2).Value = ComboBox7.Value  'alle condizioni meteo

                  10   .Offset(RowCount, 3).Value = Cantiere.Value 'al cantiere
                  10   .Offset(RowCount, 4).Value = ComboBox5.Value 'al codice Cantiere 

                  10   .Offset(RowCount, 5).Value = ComboBox6.Value     'al tipo di registrazione
                  10   .Offset(RowCount, 6).Value = Manodopera.Caption   'al numero  d'ordine in progrressivo 
                  10   .Offset(RowCount, 9).Value = ComboBox99.Value   'all'impresa di appertenenza 
                  10   .Offset(RowCount, 11).Value = Opera.Value      'all'opera 
                  10   .Offset(RowCount, 12).Value = Wbs.Valuealla    'WBS
                  10   .Offset(RowCount, 13).Value = Task_Lavorazione.Value  'all'attività Lavorativa

                   

                  perchè questo ripetere?

                  perchè ogni operaio che registro ,lavorano nello stesso giorno, riscontrano le stesse condizioni meteo, lavorano nello stesso cantiere e lavorano alla stessa Opera, WBS e Task_Lavorazione, e questi a loro volta sono individauti come tipo di registrazione, 

                   

                  quindi ho strutturato il gestionale per gestire squadre di persone e nel foglio Giornale di lavori devo avere per ogni riga i seguenti dati per analizzare a fine mese i singoli costi sostenuti per eseguire determinate attività nei cantieri e capire cosa possa aver influito di positivo o negativo per la produzione o mancata produzione, per quello registro anche il meteo, fattore importante per le lavorazioni. 

                   

                  spero di aver chiarito il tuo dubbio e del perchè si ripetono le voci che te hai segnato con 10. 

                  sto provando a completare il tuo codice ma non ho capito cosa intendi per 

                  (Ho messo un stop per farti notare che tutte le TextBox avranno il valore True man mano che avanzi)

                  potresti gentilmente darmi uno spunto in più. 

                  ti ringrazio per la collaborazione. e risaluto Giuseppe che ha visto il mio grido di aiuto. ahahahahh          

                   

                  saluti

                  #26561 Score: 0 | Risposta

                  dodi

                    errata corrige. 

                    questa stringa corrisponde al Centro di Costo

                    10   .Offset(RowCount, 6).Value = Manodopera.Caption  

                     

                    saluti e scusa

                    #26562 Score: 0 | Risposta

                    Marius44
                    Moderatore
                      58 pts

                      Ciao

                      Torno adesso dal dentista     e non sono in grado di concentrarmi. Scusami.

                      Aggiungo solo una cosa: potresti ciclare i Controlli in base al loro numero, per esempio (in questo caso rinomina il pulsante, ma si può fare anche con le TextBox):

                      For i = 1 To 20
                          Controls("CommandButton" & i).Caption = "Bouton "& i
                      Next i

                       

                      Ora prendo un antidolorifico e cerco di dormire un po'.

                      Ciao,

                      Mario

                      #26563 Score: 0 | Risposta

                      Dodi

                        Ciao Marius tranquillo e pensa alla salute.

                        Intanto provo con l'esempio del ciclo che mi hai suggerito, spero di risolvere, Cmq ti aggiorno, e quando stai bene e sei nel pieno delle tue forze fisiche e mentali mi darai una mano eventualmente non risolvo. 

                         

                        Saluti e in bocca al lupo per i tuoi denti. Ti auguro di cuore buona salute 

                        #26568 Score: 0 | Risposta

                        Dodi

                           

                          Marius 

                          Buon giorno,

                          Non so proprio come mettere in funzione il ciclo che mi hai suggerito, 

                          Te lo chiedo per gentilezza e cortesia, se potresti rimandarmi il file con il codice rivisto? Forse facciamo prima e poi vedo di capirlo per bene, perché sto provando ma non so come far capire al codice che determinate textbox , combobox e label se sono piene devono inserire nel foglio i valori presenti in essi. 

                          Te ne sarei grato. 

                          Grazie 

                          #26569 Score: 0 | Risposta

                          Dodi

                            Ciao Marius

                            spero che stai meglio oggi. 

                            cmq come ti avevo accennato stamani sbatto la testa al muro perchè non riesco a comporre in modo corretto e a mettere insieme i tuoi suggerimenti. 

                            anche perchè mi va in errore. 

                             

                            sicuramente sbaglio qualcosa, ma come detto ho grosse difficoltà a scrivere il codice in modo corretto e far capire come archiviare i dati sul foglio, 

                            allego quello che son riuscito a mettere insieme ma come vedi ho capito molto poco, 

                            Private Sub CommandButton35_Click()

                            Dim obj As Controls
                            For Each obj In UserForm1.Frame2.Controls
                            If TypeOf obj Is MSForms.TextBox Then
                            obj.Value = True
                            For i = 1 To 10

                            ' Controls("CommandButton" & i).Caption = "Bouton " & i

                            Controls("DataContr" & i).Text = "DataContr" & i
                            Controls("ComboBox7" & i).Text = "ComboBox7" & i
                            Controls("Cantiere" & i).Text = "Cantiere" & i
                            Controls("ComboBox5" & i).Text = "ComboBox5" & i
                            Controls("ComboBox6" & i).Text = "ComboBox6" & i

                             

                            If OPERAIO1.Text <> "" Then

                            Controls("DataContr" & i).Text = "DataContr" & i
                            Controls("ComboBox7" & i).Text = "ComboBox7" & i
                            Controls("Cantiere" & i).Text = "Cantiere" & i
                            Controls("ComboBox5" & i).Text = "ComboBox5" & i
                            Controls("ComboBox6" & i).Text = "ComboBox6" & i
                            'Controls("CommandButton35" & i).Caption = " Archivia" & i

                            End If

                            Next i

                             

                            'Stop
                            End If
                            Next
                            End Sub

                            anche perchè essendo autodidatta mi mancano molte basi, e avvolte scrivo codici più semplici e li ripeto per avere il risultato che cercavo. (vedere file allegato ad inizio discussione) ma come scritto sin dall'inizio avevo chiesto aiuto a voi esperti per avere una mano per un codice sintetico, funzionale e che facesse al mio caso, ma sopratutto era più veloce nel registrare i dati nel foglio GiornaleLavori, trovando la prima riga libera facendo il controllo dal Basso, o un controllo più veloce. 

                             

                            Ti faccio un caro saluto con l'augurio che oggi stai meglio. 

                             

                            resto in attesa di riscontro e tuo prezioso aiuto

                             

                             

                             

                            #26572 Score: 0 | Risposta

                            albatros54
                            Moderatore
                              89 pts

                              Ho cercato di rendere il codice piu leggibile e forse piu veloce.

                              Ho eliminato dalla routine "Sub CommandButton10_Click()" tutto il codice che veniva ripetuto, e ho inserito il codice in una routine"scrivi" che riceve in entrata un paramentro"RowCount" e quindi questa routine entra in gioco quando viene richiamata.

                              Private Sub CommandButton10_Click()
                                  Dim RowCount As Long
                                 '---Codice Archivia su Gestionale--------
                                  If OPERAIO1.Text <> "" Then
                              
                                      RowCount = Worksheets("Giornalelavori").Range("B" & Rows.Count).End(xlUp).Row
                                      With Worksheets("Giornalelavori").Range("B1")
                                          scrivi (RowCount) '<<<<<-----------Chiamata routine
                                          .Offset(RowCount, 0).Value = ordine1.Caption
                                          .Offset(RowCount, 7).Value = Costo1.Value
                                          .Offset(RowCount, 14).Value = attivita1.Value
                                          .Offset(RowCount, 16).Value = UM1.Caption
                                          .Offset(RowCount, 17).Value = ora1.Value
                                          .Offset(RowCount, 21).Value = OPERAIO1.Value
                                          .Offset(RowCount, 20).Value = Qualifica1.Value
                                          .Offset(RowCount, 22).Value = Prezzo1.Value
                                          scrivi (RowCount)
                                      End With
                                  Else
                                  End If
                              
                                  If OPERAIO2.Text <> "" Then
                                      scrivi (RowCount)
                                      RowCount = Worksheets("Giornalelavori").Range("B" & Rows.Count).End(xlUp).Row
                                      With Worksheets("Giornalelavori").Range("B1")
                                          scrivi (RowCount) '<<<<<-----------Chiamata routine
                                          .Offset(RowCount, 0).Value = Label_OP_2.Caption
                                          .Offset(RowCount, 7).Value = Costo2.Value
                                          .Offset(RowCount, 14).Value = attivita2.Value
                                          .Offset(RowCount, 16).Value = UM2.Caption
                                          .Offset(RowCount, 17).Value = ora2.Value
                                          .Offset(RowCount, 21).Value = OPERAIO2.Value
                                          .Offset(RowCount, 20).Value = Qualifica2.Value
                                          .Offset(RowCount, 22).Value = Prezzo2.Value
                              'continua col codice
                              

                              poi ho modificato il codice che riquarda la cancellazione  dei vari oggetti della tua userform1 cosi

                               
                              ' codice continua
                              
                              For Each obj In UserForm1.Controls
                                      If (TypeOf obj Is MSForms.TextBox) Or (TypeOf obj Is MSForms.ComboBox) Then
                                          obj.Text = ""
                                          UM1.Caption = ""
                                          UM2.Caption = ""
                                          UM3.Caption = ""
                                          UM4.Caption = ""
                                          UM5.Caption = ""
                                          UM6.Caption = ""
                                          UM7.Caption = ""
                                          UM8.Caption = ""
                                          UM9.Caption = ""
                                          UM10.Caption = ""
                                          Label_OP_2.Caption = ""
                                          Label_OP_3.Caption = ""
                                          Label_OP_4.Caption = ""
                                          Label_OP_5.Caption = ""
                                          Label_OP_6.Caption = ""
                                          Label_OP_7.Caption = ""
                                          Label_OP_8.Caption = ""
                                          Label_OP_9.Caption = ""
                                          Label_OP_10.Caption = ""
                                      End If
                                  Next

                              comunque , ti allego il file.

                               


                              Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
                              Sempre il mare, uomo libero, amerai!
                              ( Charles Baudelaire )
                              Allegati:
                              You must be logged in to view attached files.
                              #26574 Score: 0 | Risposta

                              Dodi

                                Buon giorno 

                                Albatros.

                                Non appena ho modo di vedere il file ti aggiorno.

                                E cerco di capire quello che mi hai suggerito e modificato, intanto grazie mille, 

                                 

                                 

                                #26575 Score: 0 | Risposta

                                Dodi
                                Partecipante
                                  2 pts

                                  Ciao Albatros 

                                  ho avuto modo di vedere come hai composto il codice, 

                                  in pratica hai creato una Routine che la richiami la sub  "scrivi"

                                  e poi hai alleggerito il codice per la pulizia delle textBox e ComboBox. 

                                  ma probabilmente creare una Routine che richiama la sub scrivi, rallenta ancor di più rispetto al codice iniziale, 

                                  almeno a mia impressione vedo che ci mette più tempo, 

                                  comunque grazie per avermi suggerito una cosa nuova come creare una Routine con una nuova sub e richiamarla  all'occorrenza. 

                                  ma ti chiedevo anche per imparare , capire se e fattibile o meno creare un codice con i cicli "for  i"  E possibile? 

                                  e se si riesce sopratutto a  ridurre l'inserimeno dei dati sul foglio, anche perchè come detto dall'inizio ora i dati inseriti son pochi, ed e lento, 

                                  figuriamoci quando ho inserito un migliaio di righe e più, sicuramente sarà ancor più lento, 

                                  magari con un codice a ciclo e con controllo dal basso per la prima riga vuota (forse e più veloce?) 

                                   

                                  avevo provato con i suggerimenti di Marius che saluto, ma non son riuscito a tirar fuori un ragno dal Buco.    "potrei rompermi la testa al muro" ma essendo autodidatta trovo difficile comporre nell'interezza il codice con le sue funzionalità. 

                                  devo dire che dedico il tempo libero a capire a sperimentare, insomma sono volenteroso,  

                                  e voi maestri mi avete dato una mano. 

                                  grazie. 

                                  poi se hai un modo con un ciclo "for i" sarei curioso di capire se migliora o meno il tempo di registrazione dati. 

                                  e se te o Marius potete rimandarmi il file con il codice completo, che a sua volta cercherò di capire, studiare e sperimentare per situazioni future. 

                                   

                                  saluti e ancora grazie.  

                                  #26581 Score: 0 | Risposta

                                  albatros54
                                  Moderatore
                                    89 pts

                                    allora, prova a sostituire il codice del pulsante "Archivia", con quello che ti posto.

                                    Il codice funziona, pero è rallentato dal fatto che lui deve ricalcolare il numero della label"Ordine1", ogni volta che inserisci un nuovo record.

                                    Private Sub CommandButton10_Click()
                                    ' Dim RowCount As Range
                                    '---Codice Archivia su Gestionale--------
                                    
                                    
                                        Set clsheet = Application.ThisWorkbook.Worksheets("Giornalelavori")
                                        RowCount = clsheet.Range("B" & Rows.Count).End(xlUp).Row + 1
                                        With clsheet
                                            For i = 1 To 10
                                                Range("B" & RowCount).Offset(0, 0).Value = Me.Controls("ordine" & 1).Caption
                                                Range("B" & RowCount).Offset(0, 7).Value = UserForm1.Controls("Costo" & i).Value
                                                Range("B" & RowCount).Offset(0, 14).Value = UserForm1.Controls("attivita" & i).Value
                                                Range("B" & RowCount).Offset(0, 16).Value = UserForm1.Controls("UM" & i).Caption
                                                Range("B" & RowCount).Offset(0, 17).Value = UserForm1.Controls("ora" & i).Value
                                                Range("B" & RowCount).Offset(0, 21).Value = UserForm1.Controls("OPERAIO" & i).Value
                                                Range("B" & RowCount).Offset(0, 20).Value = UserForm1.Controls("Qualifica" & i).Value
                                                Range("B" & RowCount).Offset(0, 22).Value = UserForm1.Controls("Prezzo" & i).Value
                                                Range("B" & RowCount).Offset(0, 1).Value = CDate(DataContr.Value)
                                                Range("B" & RowCount).Offset(0, 2).Value = ComboBox7.Value
                                                Range("B" & RowCount).Offset(0, 3).Value = Cantiere.Value
                                                Range("B" & RowCount).Offset(0, 4).Value = ComboBox5.Value
                                                Range("B" & RowCount).Offset(0, 5).Value = ComboBox6.Value
                                                .Range("B" & RowCount).Offset(0, 6).Value = Manodopera.Caption
                                                Range("B" & RowCount).Offset(0, 9).Value = ComboBox99.Value
                                                Range("B" & RowCount).Offset(0, 11).Value = Opera.Value
                                                Range("B" & RowCount).Offset(0, 12).Value = Wbs.Value
                                                Range("B" & RowCount).Offset(0, 13).Value = Task_Lavorazione.Value
                                                Range("b29").Select
                                                While ActiveCell <> ""
                                                    If ActiveCell <> "N° O." Then
                                                        ordine1.Caption = ActiveCell.Offset(0, 0).Value + 1
                                                    Else
                                    
                                                    End If
                                                    ActiveCell.Offset(1, 0).Activate
                                                Wend
                                                RowCount = RowCount + 1
                                            Next i
                                    
                                        End With
                                        For Each obj In UserForm1.Controls
                                            If (TypeOf obj Is MSForms.TextBox) Or (TypeOf obj Is MSForms.ComboBox) Then
                                                obj.Text = ""
                                                UM1.Caption = ""
                                                UM2.Caption = ""
                                                UM3.Caption = ""
                                                UM4.Caption = ""
                                                UM5.Caption = ""
                                                UM6.Caption = ""
                                                UM7.Caption = ""
                                                UM8.Caption = ""
                                                UM9.Caption = ""
                                                UM10.Caption = ""
                                                Label_OP_2.Caption = ""
                                                Label_OP_3.Caption = ""
                                                Label_OP_4.Caption = ""
                                                Label_OP_5.Caption = ""
                                                Label_OP_6.Caption = ""
                                                Label_OP_7.Caption = ""
                                                Label_OP_8.Caption = ""
                                                Label_OP_9.Caption = ""
                                                Label_OP_10.Caption = ""
                                            End If
                                        Next
                                        CaricaDati
                                        MsgBox ("Inserimento eseguito correttamente")
                                    
                                    
                                    End Sub

                                     


                                    Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
                                    Sempre il mare, uomo libero, amerai!
                                    ( Charles Baudelaire )
                                    #26582 Score: 0 | Risposta

                                    Dodi

                                      Ciao Albatros, 

                                      grazie per la soluzione (va molto più veloce come inserimento. 

                                      ma ho riscontrato un problema e cioè ; 

                                      se alcune combobox dei dipendenti non  sono piene il ciclo vedo che continua a lavorare e inserisce le 10 righe. 

                                      (fai una prova) magari fai una prova  

                                      inserisci solo 4 operai e vedi che la funzione continua a registare, ma si dovrebbe invece fermare se non trova la combobox piena. 

                                      anche perchè non sempre tutte le combobox  "Nome/Cognome Dipendente" sono piene, ma magari ho da registrare solo 4-5-6 dipendenti, 

                                      ma leggendo il codice presumo che con il ciclo e una funzione che si ripete per N° di 10 volte e non si può interrompere con un controllo if . 

                                      saluti

                                      #26597 Score: 0 | Risposta

                                      albatros54
                                      Moderatore
                                        89 pts

                                        Dodi ha scritto:

                                        ma leggendo il codice presumo che con il ciclo e una funzione che si ripete per N° di 10 volte e non si può interrompere con un controllo if .

                                        With clsheet
                                                For i = 1 To 10
                                                If UserForm1.Controls("OPERAIO" & i).Value <> "" Then
                                                    Range("B" & RowCount).Offset(0, 0).Value = Me.Controls("ordine" & 1).Caption
                                                    Range("B" & RowCount).Offset(0, 7).Value = UserForm1.Controls("Costo" & i).Value
                                        
                                        
                                        '---Continua codice
                                        
                                         Wend
                                                    RowCount = RowCount + 1
                                                    End If
                                                Next i

                                         


                                        Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
                                        Sempre il mare, uomo libero, amerai!
                                        ( Charles Baudelaire )
                                        #26606 Score: 0 | Risposta

                                        Dodi

                                          Buon giorno 

                                          grazie mille risultato che cercavo.  (sei un grande) e ringrazio cmq anche Marius per i suoi suggerimenti. 

                                           

                                          Dal tuo codice con il ciclo ho eliminato questa stringa di codice, 

                                          Range("b29").Select

                                          così facendo non controlla sempre dal range B29 per trovare la prima riga vuota, ma controlla direttamente sull'ultima riga. 

                                          e va ancora più veloce. 

                                           

                                           

                                           

                                          grazie infinitamente. 

                                          buon fine settimana. 

                                           

                                        Login Registrati
                                        Stai vedendo 19 articoli - dal 1 a 19 (di 19 totali)
                                        Rispondi a: Comando Archia " Ciclo per registrare 10 righe di dati in Colonna"
                                        Gli allegati sono permessi solo ad utenti REGISTRATI
                                        Le tue informazioni: