Risolto Creare macro per rendiconto ore dipendenti

xcr84_

Utente junior
25 Luglio 2020
22
1
Campobasso
365
0
eccomi qua, di sotto la sintassi utilizzata:

ActiveCell.Offset(-40,0).Value

Come da te suggerito, ho impostato -40 perchè così va a cercare il valore che si trova esattamente nella stessa colonna ma 40 righe sotto.

ovviamente al momento ho inserito value ma poi dovrò inserire la condizione secondo cui, se quella determinataq cella è compilata, mi dovrà dare come risultato un avviso

il messaggio di errore è il seguente: errore di compilazione: non valido all'esterno di una routine"

magari per voi potrà essere banale, ma vba non lo uso da almeno 10 anni quindi non è arabo ma quasi MartelloTesta
 

alfrimpa

VBA Expert
Supermoderatore
Expert
18 Dicembre 2015
28.863
1.845
66
Napoli
2019 Pro Plus
789
Per fare quello che ti prefiggi mi pare un po’ pochino il codice che hai scritto a prescindere se sia funzionante o meno.

PS se scrivi -40 va a “cercare” nelle righe sopra non sotto.
 

xcr84_

Utente junior
25 Luglio 2020
22
1
Campobasso
365
0
Hai ragione, vero!
Dovrei dargli anche il riferimento della cella a partire Dalla quale desidero partire con il conteggio delle 40 righe ? Oppure dovrei inserire l’istruzione già dentro l’istruzione if then else?
 

alfrimpa

VBA Expert
Supermoderatore
Expert
18 Dicembre 2015
28.863
1.845
66
Napoli
2019 Pro Plus
789
Perdona la franchezza ma credo che con le tue devo dire reminiscenze più che conoscenze di VBA mi sembra al quanto improbabile che tu riesca a realizzare qualcosa di concreto.

Se non risponde qualcuno prima lunedì (quando avrò nuovamente un pc a disposizione) provo ad esaminare il problema.

Ci aggiorniamo.
 

xcr84_

Utente junior
25 Luglio 2020
22
1
Campobasso
365
0
Onestamente, credo ci voglia molta umiltà nella vita ed è Anche questo che mi ha spinto ad iscrivermi al forum... sicuramente non mi sono iscritta per essere giudicata
 

alfrimpa

VBA Expert
Supermoderatore
Expert
18 Dicembre 2015
28.863
1.845
66
Napoli
2019 Pro Plus
789
Onestamente, credo ci voglia molta umiltà nella vita ed è Anche questo che mi ha spinto ad iscrivermi al forum... sicuramente non mi sono iscritta per essere giudicata
Nessuno vuole giudicarti ci mancherebbe (e se ho dato questa impressione me ne scuso).

Ho solo detto che per fare quello che richiedi occorrono delle conoscenze di VBA non proprio banali.

Noi siamo disponibili ad aiutare tutti come hai visto.
 
  • Like
Reactions: xcr84_

xcr84_

Utente junior
25 Luglio 2020
22
1
Campobasso
365
0
Assolutamente, vedo molti quesiti risolti ogni giorno e so che aiutate tutti.
Dunque, io questo l’ho scritto nel modulo di Vba, però sicuramente non sono partita dal punto giusto.. mi sono semplicemente posizionata sulla cella c5 per intenderci .. la funzione dovrebbe tirare fuori il valore in corrispondenza di 40 righe sotto rispetto alla cella di partenza giusto ?
 

alfrimpa

VBA Expert
Supermoderatore
Expert
18 Dicembre 2015
28.863
1.845
66
Napoli
2019 Pro Plus
789
Io avevo immaginato una procedura Worksheet_Change che una macro “particolare” che viene eseguita automaticamente quando si modifica il contenuto di una cella.

Si può ipotizzare che quando inserisci qualcosa in una cella e dai Invio parta la macro che con un ciclo For vada ad esaminare una una serie di celle e verificare se si verificano determinate condizioni ed agire di conseguenza.

Non so se riesci a seguirmi ma finché non ho un pc sottomano non posso verificare la bontà di quella che, allo stato, è solo un’idea.
 
  • Like
Reactions: xcr84_

giulianovac

Access/VBA Expert
Expert
9 Giugno 2018
3.440
145
Italy
2019
261
X @xcr84_

Domani ti spiego come procedere
Purtroppo oggi è stata una giornata impossibile,
Ma eccomi qui.

Prima di tutto assicurati di aver attivato la dichiarazione di variabili obbligatoria, come indicato qui:

Seconda cosa (se non l'hai già fatto) devi salvare il tuo file in modo che accetti il codice VBA con le macro, quindi il formato dovrà essere XLSM (e non XLSX).
Una volta salvato, chiudilo e riapri l'XLSM.

Iniziamo col dire che il mio suggerimento iniziale ti indicava di utilizzare l'evento Change del foglio, ed è proprio così che occorre fare, dal momento che tu vuoi che il controllo sia in tempo reale, ovvero quando digiti un valore in un determinato giorno se questo giorno è già stato 'usato' per un altro progetto, deve risultare vuoto.

Quindi, per fare ciò devi aprire la finestra di codice del Foglio1 e dal combobox di sinistra selezioni Worksheet e dal combobox di destra devi selezionare l'evento Change.

Come detto sopra, nel momento che tu digiti qualcosa, devi controllare che il giorno non sia già occupato, per cui il codice deve utilizzare l'oggetto Target (che non è altro che la cella oggetto della modifica) per verificare con un controllo che scriverai così (nell'evento Change):

Visual Basic:
If Cells(Target.Row - 40, Target.Column) <> "" Then
    MsgBox "Errore" & vbCrLf & "Già impegnato in altro progetto.", vbExclamation
    Target = ""
End If
Il codice sopra esegue semplicemente il controllo se la cella nella stessa colonna, ma 40 righe sopra contiene un valore.
Se così, allora azzera la cella.

Questo codice contiene un tranello, però, e per tale motivo NON devi eseguirlo così com'è.
Andrà modificato e perfezionato, come ti spiegherò.

Per il momento fai tutto come indicato fino ad ora.

Ma se proprio vuoi vedere cosa accade, PRIMA di eseguire il codice, devi posizionare il mouse sull'istruzione:
Visual Basic:
    Target = ""
e premere il tasto funzione F9 (la riga diventerà rosso scuro)
Questo è un breakpoint che indica ad Excel di stoppare temporaneamente l'esecuzione del codice.

Modifica un valore in una cella, esempio in C46 digita 2, ti apparirà il messaggio di errore (perché C6 contiene già un valore) e quando arriverà all'istruzione sopra indicata Excel si fermerà e ti apre la finestra di codice.

Ora premi F8 e vedrai verrà ripetuto nuovamente il controllo appena fatto, questo andrà all'infinito perché ogni modifica scatena l'evento Change.
Premi F8 di nuovo su ogni istruzione fino al breakpoint.

L'unico modo per bloccare l'esecuzione del codice è fare clic su Ripristina (menu Esegui).

Una volta fatto tutto come ti ho indicato pubblica il file XLSM con le modifiche indicate, procederemo alla seconda parte, la più interessante.
Caffe_rido
 

alfrimpa

VBA Expert
Supermoderatore
Expert
18 Dicembre 2015
28.863
1.845
66
Napoli
2019 Pro Plus
789
X @xcr84_

Ti sarà sicuramente utile leggere questa discussione


PS Con giulianovac @giulianovac sei in ottime mani PollicioneInSu
 
  • Like
Reactions: Robyprog and xcr84_

xcr84_

Utente junior
25 Luglio 2020
22
1
Campobasso
365
0
Buonasera e scusatemi il ritardo !!
ho letto ora e vi ringrazio per il preziosissimo aiuto che mi state dando e per il tempo che avete speso... davvero grazie!!
Domani appena accendo il Pc faccio tutto e ci faccio sapere come gira !!
Ps misa che entrambi Siete due campioni di vba 😁
Vi aggiorno e vi ringrazio ancora 😁
 

xcr84_

Utente junior
25 Luglio 2020
22
1
Campobasso
365
0
Ciao a tutti !!
giulianovac @giulianovac , ho provato a fare come mi hai indicato e dovrebbe essere andato tutto bene, il messaggio mi è uscito correttamente 👍👍
Grazie ancora !!
 

giulianovac

Access/VBA Expert
Expert
9 Giugno 2018
3.440
145
Italy
2019
261
X @xcr84_
Bene, adesso passiamo alla seconda parte.

Occorre fare in modo che il messaggio non continui ad apparire all'infinito.
Per fare questo si deve utilizzare un 'semaforo'.
Sempre nell'evento Change e sopra al codice che hai scritto prima devi aggiungere la gestione del semaforo, inserendo questo codice:

Visual Basic:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim C As Long
    
    ' la modifica di un valore scatena un secondo evento Change
    ' che invece va evitato, usando un 'semaforo'
    Static bEdit As Boolean
    If bEdit Then
        bEdit = False
        Exit Sub
    End If
Poi, dato che NON tutte le colonne vanno controllate, ma solo quelle dei valori (che sono la 3, 6, 9, e così via), abbiamo bisogno di una funzione che ci dica se la colonna in cui stiamo digitando un valore è quella da controllare.
La funzione è questa e va scritta sotto, esternamente all'evento Worksheet_Change():

Visual Basic:
Private Function ColonnaDaControllare(ByRef Target As Range) As Long
    Dim C As Long
    C = Target.Column
    Select Case C
    Case 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36
        ColonnaDaControllare = C
    Case Else
        ColonnaDaControllare = 0
    End Select
End Function
A questo punto, utilizziamo tale funzione per sapere se la colonna deve essere controllata:
Visual Basic:
    C = ColonnaDaControllare(Target)
E verifichiamo il valore restituito dalla funzione:
se è maggiore di 0 (zero) significa che la colonna è tra quelle che DEVE essere controllata, o per meglio dire che occorre controllare che, 40 righe sopra, non sia già presente un valore.

Per concludere, ecco il codice completo del Foglio1:
Visual Basic:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim C As Long
    
    ' la modifica di un valore scatena un secondo evento Change
    ' che invece va evitato (perché entrerebbe in un loop infinito) usando un 'semaforo'
    Static bEdit As Boolean
    If bEdit Then
        bEdit = False
        Exit Sub
    End If

    ' Verifico se la colonna che sto modificando è fra quelle che voglio tenere sotto controllo:
    C = ColonnaDaControllare(Target)
    
    If C > 0 Then    ' sì, è da controllare
        If Cells(Target.Row - 40, C) <> "" Then
            MsgBox "Errore" & vbCrLf & "Già impegnato in altro progetto.", vbExclamation
            bEdit = True ' attivo il semaforo che bloccherà il loop
            Target = ""
        End If
    End If
End Sub

Private Function ColonnaDaControllare(ByRef Target As Range) As Long
    Dim C As Long
    C = Target.Column
    Select Case C
    Case 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36
        ColonnaDaControllare = C
    Case Else
        ColonnaDaControllare = 0
    End Select
End Function
Concludendo, il controllo viene sempre e solo effettuate con le righe (-40) che stanno SOPRA al progetto che stai modificando, ma con quelle che stanno SOTTO (cose che non avrebbe senso). Ma è giusto tenerlo presente.
 

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!