› Sviluppare funzionalita su Microsoft Office con VBA › Userfom che copia dati nel mensile secondo tre condizioni
-
AutoreArticoli
-
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.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.
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
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 )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?
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.
Posso semplicemente ripetere due condizioni For Each,if ed end if
Si
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.
"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 )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à.
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.
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.
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
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 )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
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 )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
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?
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
-
AutoreArticoli