Sviluppare funzionalita su Microsoft Office con VBA Userfom che copia dati nel mensile secondo tre condizioni

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

    tricks9999
    Partecipante

      Ciao a tutti, ho il seguente problema. Sto creando una gestione del personale, con il calendario ore annuali previste, i dati dei dipendenti e le ore mensili. Non mi dilungo, perchè l'obiettivo è più ampio. Ho creato una Userfom per l'inserimento delle ore, distinte in diverse voci, ore pioggia, malattia ecc ecc. In alto ho i mesi in menu a tendina, così i giorni da 1 a 31. Per gli operai idem, un elenco a discesa. Sotto l'elenco delle ore da inserire. Una box che mi somma le ore solo per dare un'idea (non dev'essere riportata).In fondo i bottoni registra, nuovo (che pulisce tutto) e l'interruttore "esci" (per comodità). La somma funziona, il pulisci funziona e "nuovo" pure. Mi sono invece bloccato su registra. Mi spiego: vorrei che le ore delle varie voci vengano copiate nei fogli mensili excel delle ore, secondo le tre condizioni. Trova il mese, il giorno e l'operaio corrispondenti e quindi incolla i dati. Quindi deve cercare il foglio del mese giusto su i 12 che creo, il giorno nel mese trovato e l'operaio. Quindi copiare i dati delle voci ore fatte, malattia, infortunio ecc ecc. Il tutto che avevo creato con delle macro direttamente sui fogli (semplici bottoni), tempo fa, funziona. Usando indice e confronta. Ora però mi piacerebbe far partire questa Userform, che ovviamente è più interessante. Ma mi blocco sul bottone registra. Allego un file che considero ancora spartano ma serve per rendere l'idea. Cliccando su Visual o con alt+F11 si apre la form in questione. Se qualcuno mi volesse aiutare vi sarei grato. Almeno imparo e mi acculturo. Grazie in anticipo. Ho usato anche Kutools quindi è possibile che alcune funzioni non vi funzionano ma solo per il "Calendario ore annuali" che trovate nel primo foglio. PS: trovate solo gennaio e febbraio per vedere se funzia la form e un foglio definizioni usato per la gestione "nomi"

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

      MatteoMaz
      Partecipante
        1 pt

        Ciao tricks9999,

        premetto che sto studiando ancora i "fondamentali" di VBA...se ho capito il tuo scopo e quello su cui sei bloccato, io farei dapprima un abbinamento del foglio di destinazione con il valore del mese selezionato con un ciclo dei fogli nella cartella. impostato il foglio, selezionerei la colonna magari da ricerca su precedente collection dei dipendenti e con un find o un intersect (che mi piace tanto  )andrei a scrivere i valori sulla cella intersezione tra la riga del valore e quella del dipendente selezionato.

        Ribadisco il basso livello del mio VBA e seguirò l'evoluzione.

        #15921 Score: 0 | Risposta

        tricks9999
        Partecipante

          Ciao Matteo, io ho provato ad usare lo stile del classico linguaggio per fare le macro con indice e confronta, cioè tradotto con Index e Match ma proprio non riesco. Premetto che pure il sottoscritto è agli inizi con le Userfom e decisamente mi mancano le conoscenze approfondite in merito. Con access o visual hai dei grandi aiuti nella compilazione, ma non sono in grado nemmeno lì di completare le sintassi. Poi vorrei proprio usare quanto ho già creato in excel. Tutti gli aiuti e consigli sono ben accetti e sicuramente cerco di sviluppare la tua idea, ma torno a sottolineare che forse per me il problema che si pone è un po' troppo difficile da risolvere perchè so fare le cose semplici ma vorrei imparare di più. Non so proprio come impostare le cose. Ho pensato di far individuare prima il mese tra i fogli di calcolo (comunque raggruppati in solo un file), poi nell'ordine il giorno e l'operaio. Il fatto poi di incollare i dati potrebbe essere la cosa meno complicata ma credo di incontrare difficoltà anche lì. Per questo ho allegato il file sperando che qualcuno riesca a risolvermi il problema. Seguo da tempo questo forum e vedo che ci sono persone davvero brave. Io sono un principiante assoluto

          #15927 Score: 1 | Risposta

          albatros54
          Moderatore
            81 pts

            Ciao, come primo passo ti passo questa semplice routine che puoi associare al tasto "registra", che non fa altro che ciclare tutti i fogli del tuo file e se trova il "foglio" con il nome della Combobox"meseanno" lo selezione, questo è il primo passo.

            Private Sub Registra_Click()
                Dim fogli As Worksheet
            
                For Each fogli In Worksheets
                    If fogli.Name = MesiAnno.Text Then
                        fogli.Select
                    End If
                Next
            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 )
            #15940 Score: 0 | Risposta

            tricks9999
            Partecipante

              Ciao Albatros,

              bellissima, funziona alla grande. Grazie mille, passo passo almeno riesco a imparare ed usare i comandi di compilazione.

              Tradotto vorrebbe dire definisci fogli con foglio di lavoro e quindi gli hai detto di cercare il foglio secondo ciò che c'è in "mesianno". Infine di selezionare il foglio.

              Poi immagino che sarà un testo simile per il giorno e l'operaio ma bisognerà metterli in relazione tra di loro o forse no. Posso semplicemente ripetere due condizioni For Each,if ed end if cambiando le definizioni combobox.text ? cioè definisco con Dim giorno as (gestione nomi creato in definizioni) "giorni" e idem operaio as (gestione nomi) "Nomi_operai", sotto alla Dim già fatta per i fogli? Se ho capito giusto dovrebbe andare a cercare il giorno nell'area definita in gestione nomi e medesima cosa per l'operaio. NB: "For" vuole sempre "next" vero? significa che ripeti il ciclo?

              #15941 Score: 1 | Risposta

              albatros54
              Moderatore
                81 pts

                tricks9999 ha scritto:

                Tradotto vorrebbe dire definisci fogli con foglio di lavoro e quindi gli hai detto di cercare il foglio secondo ciò che c'è in "mesianno". Infine di selezionare il foglio

                Si.

                tricks9999 ha scritto:

                Posso semplicemente ripetere due condizioni For Each,if ed end if

                Si

                tricks9999 ha scritto:

                Se ho capito giusto dovrebbe andare a cercare il giorno nell'area definita in gestione nomi e medesima cosa per l'operaio

                si, pero prima devi settare l'area dove andare a cercare, il comando è:

                Set areadovecercare=Nomefoglio.range()

                dove Nomefoglio è il nome del foglio,e range il campo dove cercare.

                tricks9999 ha scritto:

                "For" vuole sempre "next"

                certamente, perche altrimenti la variabile associata al ciclo For non viene incrementata, , il costrutto giusto è

                For a= 1 to n

                'quello che deve fare il codice

                next a

                 

                 

                 

                 

                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 )
                #15953 Score: 0 | Risposta

                tricks9999
                Partecipante

                  Albatros, sei preziosissimo.

                  Provo a scrivere tutto in sequenza la parziale. Forse non ho ben capito il passaggio dove si fa il settaggio, non è sufficiente che sfrutto gli elenchi che ho creato in gestione nomi ? (anche se non saprei come inserire)...ho provato così ma mi blocca già nel secondo "For"

                  Private Sub Registra_Click()
                  
                    Dim fogli As Worksheet
                    Dim giorno As Range
                    Dim Operaio As Range
                    Set giorno = Range("B2:AF31")
                    Set Operaio = Range("A3:A131")
                  
                    For Each fogli In Worksheets
                       If fogli.Name = MesiAnno.Text Then
                          fogli.Select
                       End If
                      Next
                    For Each giorno In Worksheet
                       If giorno.Name = GiorniMese.Text Then
                          giorno.Select
                       End If
                     Next
                     For Each Operaio In Worksheet
                       If Operaio.Name = Operai.Text Then
                          Operaio.Select
                       End If
                    Next

                  E non riesco nemmeno a sfruttare il fatto che ho già definito le Range in Gestione Nomi di excel, mentre quando creo le combo glielo metto nelle proprietà.

                  #15956 Score: 1 | Risposta

                  vecchio frac
                  Senior Moderator
                    238 pts
                    If fogli.Name = MesiAnno.Text Then

                    Mi intrometto solo su questo passaggio, per ricordare di prestare attenzione all'operatore di uguaglianza ("="), il quale è sensibile a maiuscole/minuscole. Se il nome del foglio è "Pippo" e la casella MesiAnno contiene "pippo", la condizione non verrà mai soddisfatta e il codice dentro If ... End If non verrà eseguito. Per ovviare userei il costrutto classico cioè il test su due stringhe maiuscole (o minuscole):

                    If LCase(fogli.Name) = LCase(MesiAnno.Text) Then

                    oppure in modo più sofisticato con StrComp:

                    If StrComp(foglio1.Name, MeseAnno.Text, vbTextCompare) = 0 Then

                    dove "zero" significa che le due stringhe sono uguali.

                    #15957 Score: 1 | Risposta

                    Marius44
                    Moderatore
                      51 pts

                      Buonasera a tutti

                      Mi permetto aggiungere all'ottimo, essenziale suggerimento di Vecchio frac (un caro saluto) un'altra possibilità:

                      inserisci in testa al Modulo Option Compare Text ed il confronto non terrà più conto delle maiuscole/minuscole.

                      Ciao,

                      Mario

                      #15964 Score: 0 | Risposta

                      tricks9999
                      Partecipante

                        Vecchio frac, Marius, grazie mille

                        È una fossa dei leoni questo linguaggio, considerando che ci sono più possibilità per definire un'operazione. Comunque sono ottime tutte e tre e vi quoto. Chiaramente senza offesa per nessuno uso la più comoda e facile, che per un principiante come me è logica. Quindi detto questo, non mancherò praticamente di sempre usare questa funzione, così almeno risolvo tutti i problemi di inserimento maiuscole/minuscole se non che in casi eccezionali dove lo scopo non sia quello.

                        #15965 Score: 0 | Risposta

                        tricks9999
                        Partecipante

                          Grazie,

                          quindi per ovviare al problema non faccio altro che scrivere sia i nomi dei fogli sia l'elenco a discesa, tutto maiuscolo o minuscolo. 

                          D'ora in poi presterò sempre attenzione a questo particolare. Siete forti, grazie

                          #15969 Score: 1 | Risposta

                          albatros54
                          Moderatore
                            81 pts

                            condividendo a pieno quanto postato da VF e Marius, ritornando al tuo codice postato, vedo che sei sulla buona strada , pero ci sono degli errori di fondo.

                            Quando tu setti le zone dove andare a fare la ricerca con l'istruzione SET, le zone settate di quale foglio fanno parte?quindi  dovresti(parlando sempre del codice postato da te) settare le zone  del foglio che hai selezionato, perchè è in quel foglio che dobbiamo scrivere.A questo punto le istruzioni

                            Set giorno = Range("B2:AF31")
                            Set Operaio = Range("A3:A131")

                            li dobbiamo inserire dopo aver selezionato il foglio, in questo modo

                            For Each fogli In Worksheets
                                 If fogli.Name = MesiAnno.Text Then
                                    fogli.Select
                                 End If
                                Next
                            Set lavoratori = nomefoglioattivo.Range("a3:a31")
                            Set mese = nomefoglioattivo.Range("b2:af2")

                            pero c'è un costrutto in VBA, che ci evita di scrivere , ogni volta,il Nomefoglioattivo che è

                            with nomefoglioattivo

                            'fai qualcosa

                            end with

                            che si legge"fintanto che è attivo il "nomefoglioattivo" tutto quello che è compreso tra With e End with si riferisce al  "nomefoglioattivo"  

                             

                             

                             

                            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 )
                            #15975 Score: 0 | Risposta

                            tricks9999
                            Partecipante

                              aaah ho capito, quindi una cosa da fare sarebbe comunque rispettare gli ordini in sequenza, cioè prima cerca il foglio del mese e da qui il codice con For, if, next poi vado a settare l'area sia del numero giorno e del nome operaio dicendogli però che si tratta di quel foglio. In pratica:

                              Option Compare Text 'questa la metterei però all’inizio di tutto il form
                              Private Sub Registra_Click()
                                Dim fogli As Worksheet
                                Dim giorno As Range
                                Dim operaio As Range
                              
                                For Each fogli In Worksheets
                                   If fogli.Name = MesiAnno.Text Then
                                      fogli.Select 
                                   End If
                                  Next
                               With Activesheet
                                Set giorno = Range(“B2:AF31”) 'qui se ho definito Giorni in definisci nomi lo posso mettere?
                                Set operaio = Range(“A3:A131”) 'Idem sopra
                              
                               End With
                                For Each giorno In Activesheet
                                   If giorno.Name = GiorniMese.Text Then
                                      giorno.Select 
                                   End If
                                 Next 
                                 For Each operaio In Activesheet
                                   If operaio.Name = Operai.Text Then
                                      operaio.Select 
                                   End If 
                                Next 
                              End Sub
                              

                               

                              #15976 Score: 1 | Risposta

                              albatros54
                              Moderatore
                                81 pts

                                Vedo che ti stai impegnando atrovare da solo la soluzione, a questo punto ti posto questo codice, associalo al pulsante e vedi se va bene , il codice è  da implementare per la gestione  degli errori.

                                Option Explicit
                                Option Compare Text
                                
                                
                                Private Sub Registra_Click()
                                    Dim fogli As Worksheet
                                    Dim lavoratori As Object, mese As Object
                                    Dim cl As Range, ml As Range
                                    Dim riga As Integer, colonna As Integer
                                    For Each fogli In Worksheets
                                        If fogli.Name = MesiAnno.Text Then
                                            fogli.Activate
                                        End If
                                    Next
                                    With ActiveSheet
                                        Set lavoratori = .Range("a3:a31")
                                        Set mese = .Range("b2:af2")
                                        For Each cl In lavoratori
                                            If cl = Operai.Text Then
                                                riga = cl.Row
                                            End If
                                        Next
                                        For Each ml In mese
                                            If ml = GiorniMese.Text Then
                                                colonna = ml.Column
                                            End If
                                        Next
                                        Cells(riga, colonna).Activate
                                        ActiveCell.Offset(1, 0) = OreFatte.Text
                                        ActiveCell.Offset(2, 0) = OreFatte.Text
                                        ActiveCell.Offset(3, 0) = OreFatte.Text
                                
                                    End With
                                
                                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 )
                                #15977 Score: 0 | Risposta

                                tricks9999
                                Partecipante

                                  Albatros sei un mostro (in senso buono ovviamente)

                                  sì certamente mi voglio impegnare in tutto questo, lo voglio capire e riuscire da solo a sviluppare in seguito anche gli altri User che voglio fare (inserimento nuovi dipendenti, foglio paga, riassunto ore per operaio, ecc) Perciò mi studio tutto il codice che hai scritto e assolutamente lo voglio comprendere. Lo so per un principiante non è assolutamente facile, ci vogliono anni.

                                  È vero potrei acquistare un programma già fatto, ma che gusto ci sarebbe? io voglio capire come si fa ad arrivare lì o là

                                  Ho notato che si usano parecchio delle Dim ricorrenti come ws,cl,rng ecc e questo non capisco se è dottrina o da dove arriva.

                                  Poi il codice lo provavo e riprovavo ma appunto mi si bloccava negli oggetti mancanti, presumo gli object che hai definito.

                                  Stavo arrivando a capire di mettere with e for insieme preceduti dal set e non separarli tutti, questo non è male per me, anche se poi mi perdo nell'inserimento delle definizioni tipo Thisworkbook, worksheet ecc Lo so farà sorridere sicuramente coloro che sono più esperti.

                                  Non credo ci sarei mai arrivato da solo comunque, ma ora passo passo devo imparare quanto hai fatto e aggiungere tutti i dati che deve copiare nelle activeCell. Ora ci lavoro poi metterò il risolto e condivido il file appena l'ho finito per chi l'avesse bisogno.

                                  Albatros grazie a te,voi mi sto veramente appassionando a questo mondo e prevedo nottate e "litigi" con la moglie    per la mia futura assenza dal mondo reale   

                                   

                                  #16011 Score: 0 | Risposta

                                  vecchio frac
                                  Senior Moderator
                                    238 pts

                                    tricks9999 ha scritto:

                                    Ho notato che si usano parecchio delle Dim ricorrenti come ws,cl,rng ecc e questo non capisco se è dottrina o da dove arriva.

                                    Cosa intendi dire? che concetto hai delle variabili? ti mancano delle info di base?

                                    #16419 Score: 0 | Risposta

                                    tricks9999
                                    Partecipante

                                      Sì Vecchio Frac, l'ho scritto che non sono un esperto ma un principiante. Mi sto leggendo il mattone di Alexsandra, il resto l'ho imparato da solo. Dalla mia ho solo che sono caparbio, scrivo e provo codici appena ho tempo libero; e tanti. Non me ne volere quindi se faccio domande diciamo stupide. Comunque mi applico molto e lo so che ci vogliono anni di studio per diventare competente. Sulla base di quanto già fatto sto comunque continuando, se riesco da solo, a sviluppare il seguito del progettino che hai visionato. Non ho fretta, perchè con le macro, quindi più spartano, ce l'ho già funzionante. Ci ho messo del tempo anche con le macro ma l'ho fatto. Poi comunque imparo in fretta i termini, anche se arrivo dal vecchio Simon Basic ehehe

                                    Login Registrati
                                    Stai vedendo 17 articoli - dal 1 a 17 (di 17 totali)
                                    Rispondi a: Userfom che copia dati nel mensile secondo tre condizioni
                                    Gli allegati sono permessi solo ad utenti REGISTRATI
                                    Le tue informazioni: