Stellar Blade Un'esclusiva PS5 che sta facendo discutere per l'eccessiva bellezza della protagonista. Vieni a parlarne su Award & Oscar!
 
Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

compilazione turno

Ultimo Aggiornamento: 09/05/2023 09:48
Post: 82
Registrato il: 25/05/2015
Età: 53
Utente Junior
2007
ONLINE
24/03/2023 06:39

Salve vorrei sapere se è possibile creare una macro che può fare quanto segue.
Nel foglio che allego è presente una griglia con un turno rappresentato da lettere e sigle, nella prima colonna per motivi di privacy i nomi del personale sono sostituiti da numeri progressivi. Nel suddetto turno sono presenti molte lettere "D" , io vorrei che :
-la macro prendesse in esame ogni colonna singolarmente da sinistra a destra, sostituendo la prima "D" che trova con"D1" dovranno essere presenti alla fine dell'esecuzione di questo passaggio non più una "D1" per ogni riga e per ogni colonna che ovviamente contenga delle "D".
-un secondo passaggio che attribuisca casualmente alle colonne che non contengano "D1" ma solo "D" almeno un a "D1".

Arrivando alla fine ad avere una "D1" per colonna che contenga delle "D".

L'idea è nella mia testa ma la pratica è al di fuori della mia portata.
grazie dell'aiuto
Post: 3.410
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
25/03/2023 13:19

Ciao
solo la prima parte per controllare se va bene.

Per la seconda parte devi precisare se il controllo per colonna non contenente D1 va effettuato anche per riga e, soprattutto, se si deve cercare una cella vuota o no (dò per scontato di si ,ma......)
Per esempio:
la colonna 5 non contiene D1 e trovo una cella vuota in riga 8....devi controllare anche che tale riga non contenga D1 ??

saluti

Sub PrimaParte()
Dim colStart As Integer, colEnd As Integer, rigaStart As Integer, rigaEnd As Long, i As Integer
colStart = 2
colEnd = 32
rigaStart = 3
rigaEnd = 66
For c = colStart To colEnd
    For r = rigaStart To rigaEnd
        If Cells(r, c) = "D" Then
            If c > 2 Then
                k = 0
                For i = 2 To c - 1
                    If Cells(r, i) = "D1" Then
                        k = 1
                        Exit For
                    End If
                Next i
                If k = 0 Then
                    Cells(r, c) = "D1"
                    GoTo salto
                End If
            Else
                Cells(r, c) = "D1"
                Exit For
            End If
        End If
    Next r
salto:
Next c
End Sub
Domenico
Win 10 - Excel 2016
Post: 3.413
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
26/03/2023 10:39

ciao
..................... inoltre, sempre che quanto detto nel precedente post sia corretto, devi precisare se per cella vuota intendi anche quelle col trattino (-)


Ti ricordo, infine, che così facendo resteranno righe prive di D1, mentre tutte le colonne conterrano un D1......è quello che vuoi??


saluti




[Modificato da dodo47 26/03/2023 10:48]
Domenico
Win 10 - Excel 2016
Post: 3.424
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
28/03/2023 12:33

...per ultimo:

nella fase 1 credo sia necessario controllare "prima" se già ci sono D1 nella colonna, e immagino che se ci sono, non bisogna aggiungerne altre. Dico questo perchè se rilanci la fase1, con il codice prima postato, te ne aggiungerebbe altre.

Chiarisci tutto quanto richiesto anche nei post precedenti

saluti



[Modificato da dodo47 28/03/2023 12:34]
Domenico
Win 10 - Excel 2016
Post: 82
Registrato il: 25/05/2015
Età: 53
Utente Junior
2007
ONLINE
30/03/2023 05:17

Re:
dodo47, 28/03/2023 12:33:

...per ultimo:

nella fase 1 credo sia necessario controllare "prima" se già ci sono D1 nella colonna, e immagino che se ci sono, non bisogna aggiungerne altre. Dico questo perchè se rilanci la fase1, con il codice prima postato, te ne aggiungerebbe altre.

Chiarisci tutto quanto richiesto anche nei post precedenti

saluti






Intanto, ti ringrazio moltissimo per l'aiuto che mi stai dando, io non so come funzionano molte sigle usate nelle macro a volte ne capisco il funzionamento o le dinamiche e allora riesco a concatenare e magari a modificare un po' le macro che mi fornite, ma da autodidatta è difficile e non ho più 15 anni.
Detto ciò, la macro fa perfettamente ciò che avevo in mente, e come hai intuito e scritto, la seconda fase di questa macro è proprio aggiungere una D1 la dove ci siano colonne che ne sono sprovviste facendo attenzione che sulle righe , con l'aggiunta di questa macro ,poi non ce ne siano più di due.

Spero si capisca tutto.
grazie

Post: 3.433
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
30/03/2023 09:35

ciao
mi ero quasi dimenticato di questa richiesta.....

ok, ma divi rispondere a quanto chiesto al post #4

Poi devi dire se nella seconda fase vanno eventualmente alimentate le celle vuote e/o quelle con trattino, lasciando ovviamente integre quelle con altre sigle.

Inoltre hai testato la prima parte??

Senza queste info non vado avanti

saluti

(tu non hai più 15 anni....io che dovrei dire??)



[Modificato da dodo47 30/03/2023 11:19]
Domenico
Win 10 - Excel 2016
Post: 83
Registrato il: 25/05/2015
Età: 53
Utente Junior
2007
ONLINE
01/04/2023 15:40

Re:
dodo47, 28/03/2023 12:33:

...per ultimo:

nella fase 1 credo sia necessario controllare "prima" se già ci sono D1 nella colonna, e immagino che se ci sono, non bisogna aggiungerne altre. Dico questo perchè se rilanci la fase1, con il codice prima postato, te ne aggiungerebbe altre.

Chiarisci tutto quanto richiesto anche nei post precedenti

saluti







Ciao, penso che il post a cui ti riferisci sia questo, al primo lancio della macro tutto ok , ovviamente restano delle righe e delle colonne senza D1 al termine dell'esecuzione della macro, nella seconda fase serve una macro un un altra parte della macro già creata che inserisca una D1 nelle colonne che ne sono prive e solo in quelle.
quindi al secondo passaggio non importa se sulle riga andranno ad esserci al termine 2 D1 (ma non di più) importante che in ogni colonna ce ne sia una e non di più.
Preciso sia nel primo passaggio che nel secondo, solo le celle contenenti le D devono essere coinvolte ,altre sigle simboli o celle vuote non devono essere modificate ,nemmeno quelle contenenti le D1.
grazie
Post: 3.438
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
01/04/2023 17:54

ciao
non sono sicuro di aver capito bene....fai le tue prove:

cerca di non fare passare molto tempo per rispondere in quanto mi dimentico le cose che faccio....non ci sei solo tu ;)

saluti

Sub SecondaParte()
'un secondo passaggio che attribuisca casualmente _
 alle colonne che non contengano "D1" ma solo "D" almeno un a "D1" _
 la seconda fase di questa macro è proprio aggiungere una D1 la dove _
 ci siano colonne che ne sono sprovviste facendo attenzione che _
 sulle righe , con l'aggiunta di questa macro ,poi non ce ne siano più di due.
 

Dim rng As Range, rng1 As Range
colStart = 2
colEnd = 32
rigaStart = 3
rigaEnd = 66
For c = colStart To colEnd
    Set rng = Range(Cells(rigaStart, c), Cells(rigaEnd, c))
    'controolo se colonna NON contiene D1 ma contiene D
    i = Application.WorksheetFunction.CountIf(rng, "D1")
    i1 = Application.WorksheetFunction.CountIf(rng, "D")
    If i = 0 And i1 > 0 Then
        For Each rg In rng
            If rg = "D" Then
                'controllo se riga dove mettere D1 contiene meno di 2 D1
                Set rng1 = Range(Cells(rg.Row, colStart), Cells(rg.Row, colEnd))
                i = Application.WorksheetFunction.CountIf(rng1, "D1")
                If i < 2 Then
                    rg.Value = "D1"
                    Exit For
                End If
            End If
        Next rg
    End If
Next
End Sub






Domenico
Win 10 - Excel 2016
Post: 84
Registrato il: 25/05/2015
Età: 53
Utente Junior
2007
ONLINE
04/04/2023 12:22

Re:
dodo47, 01/04/2023 17:54:

ciao
non sono sicuro di aver capito bene....fai le tue prove:

cerca di non fare passare molto tempo per rispondere in quanto mi dimentico le cose che faccio....non ci sei solo tu ;)

saluti

Sub SecondaParte()
'un secondo passaggio che attribuisca casualmente _
 alle colonne che non contengano "D1" ma solo "D" almeno un a "D1" _
 la seconda fase di questa macro è proprio aggiungere una D1 la dove _
 ci siano colonne che ne sono sprovviste facendo attenzione che _
 sulle righe , con l'aggiunta di questa macro ,poi non ce ne siano più di due.
 

Dim rng As Range, rng1 As Range
colStart = 2
colEnd = 32
rigaStart = 3
rigaEnd = 66
For c = colStart To colEnd
    Set rng = Range(Cells(rigaStart, c), Cells(rigaEnd, c))
    'controolo se colonna NON contiene D1 ma contiene D
    i = Application.WorksheetFunction.CountIf(rng, "D1")
    i1 = Application.WorksheetFunction.CountIf(rng, "D")
    If i = 0 And i1 > 0 Then
        For Each rg In rng
            If rg = "D" Then
                'controllo se riga dove mettere D1 contiene meno di 2 D1
                Set rng1 = Range(Cells(rg.Row, colStart), Cells(rg.Row, colEnd))
                i = Application.WorksheetFunction.CountIf(rng1, "D1")
                If i < 2 Then
                    rg.Value = "D1"
                    Exit For
                End If
            End If
        Next rg
    End If
Next
End Sub









Ottimo le due macro assieme fanno esattamente quello che chiedevo, ogni tanto c'è qualche anomalia del tipo due d1 su qualche colonna nonostante tutte le righe ne abbiano una ma non è un problema bloccante, devo fare ulteriori prove su altre stesure di turno per vedere.
apprezzo moltissimo le righe non eseguibili ch spiegano la funzione delle righe che le seguono.
ti chiedo , la seconda funzione può essere accodata alla prima nella stessa macro o ci sono conflitti per le variabili o altro?
per quanto riguarda la tempistica con cui rispondo , difficilmente riesco a riprendere in mano questo lavoro ad un intervallo inferiore il 3-5 giorni proprio per problemi lavorativi, me ne dispiace.
il lavoro che tu hai fatto fino ad ora è fenomenale e preciso, tra l'altro ho già adattato ricopiandola e modificandola la macro alla compilazione delle altre d con le sigle rimanenti, ed eseguendo le macro singolarmente funzionano correttamente.
grazie
Post: 3.442
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
04/04/2023 15:56

ciao
....ogni tanto c'è qualche anomalia del tipo due d1 su qualche colonna....


Mandami un esempio di originale che elaborato dopo la prima e seconda macro, crei due D1 nella stessa colonna.
Non dovrebbe accadere in quanto nella seconda macro, queste istruzioni lo impediscono:
i = Application.WorksheetFunction.CountIf(rng, "D1")
i1 = Application.WorksheetFunction.CountIf(rng, "D")
If i = 0 And i1 > 0 Then
elabora....

Puoi tranquillamente alla fine della prima fare una call alla seconda

saluti




Domenico
Win 10 - Excel 2016
Post: 85
Registrato il: 25/05/2015
Età: 53
Utente Junior
2007
ONLINE
06/04/2023 06:24

Re:
dodo47, 04/04/2023 15:56:

ciao
....ogni tanto c'è qualche anomalia del tipo due d1 su qualche colonna....


Mandami un esempio di originale che elaborato dopo la prima e seconda macro, crei due D1 nella stessa colonna.
Non dovrebbe accadere in quanto nella seconda macro, queste istruzioni lo impediscono:
i = Application.WorksheetFunction.CountIf(rng, "D1")
i1 = Application.WorksheetFunction.CountIf(rng, "D")
If i = 0 And i1 > 0 Then
elabora....

Puoi tranquillamente alla fine della prima fare una call alla seconda

saluti







Ciao,
ho fatto la prova su altre stesure del turo e fila tutto liscio , l'errore non si è verificato nemmeno nella stesura in cui lo avevo riscontrato all'inizio.
Ho notato che con questa logica di riempimento le ultime righe molte volte vengono analizzate per ultime , nel senso che io ho adattato la tua macro alle seguenti sigle, D1,D2,D3A,D3B,PL. le ultime righe non vengono per esempio popolate dalla PL, è possibile far eseguire la macro anche dal basso verso l'alto e contemporaneamente da destra a sinistra?
ciao
Post: 3.455
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
06/04/2023 09:52

ciao
nella prima parte:

questa istruzione:
For c = colStart To colEnd
controlla colonna per colonna a partire da colonna 2 (B) a col. 32 (AF)
per invertire l'ordine di controllo delle colonne, dovrai fare: For c = colEnd to colStart Step -1

quest'altra:
For r = rigaStart To rigaEnd
controlla riga per riga da 3 a 66
per invertire l'ordine di controllo delle righe, dovrai fare: For r = rigaEnd to rigaStart Step -1

---------------------------------------------------------------------------------------------------------------------

La seconda parte è stata sviluppata con una logica diversa, pertanto PRIMA devi sostituirla con questa ed accertarti che funzioni come prima:
Sub SecondaParte_2()
'un secondo passaggio che attribuisca casualmente _
 alle colonne che non contengano "D1" ma solo "D" almeno un a "D1" _
 la seconda fase di questa macro è proprio aggiungere una D1 la dove _
 ci siano colonne che ne sono sprovviste facendo attenzione che _
 sulle righe , con l'aggiunta di questa macro ,poi non ce ne siano più di due.
 

Dim rng As Range, rng1 As Range
colStart = 2
colEnd = 32
rigaStart = 3
rigaEnd = 66
For c = colStart To colEnd
    Set rng = Range(Cells(rigaStart, c), Cells(rigaEnd, c))
    'controolo se colonna NON contiene D1 ma contiene D
    i = Application.WorksheetFunction.CountIf(rng, "D1")
    i1 = Application.WorksheetFunction.CountIf(rng, "D")
    If i = 0 And i1 > 0 Then
        For r = rigaStart To rigaEnd
            If Cells(r, c) = "D" Then
                'controllo se riga dove mettere D1 contiene meno di 2 D1
                Set rng1 = Range(Cells(r, colStart), Cells(r, colEnd))
                i = Application.WorksheetFunction.CountIf(rng1, "D1")
                If i < 2 Then
                    Cells(r, c) = "D1"
                    Exit For
                End If
            End If
        Next r
    End If
Next
End Sub

poi, CON LO STESSO PRINCIPIO DELLA PRIMA PARTE, INVERTI SECONDO QUELLO CHE VUOI FARE, I DUE CICLI:
For c......
For r.......

saluti
[Modificato da dodo47 06/04/2023 09:53]
Domenico
Win 10 - Excel 2016
Post: 86
Registrato il: 25/05/2015
Età: 53
Utente Junior
2007
ONLINE
10/04/2023 09:04

Sub Nuova_fase_macro_prova_compila_inverso_parziale()

Sheets("D 123").Select
Dim colStart As Integer, colEnd As Integer, rigaStart As Integer, rigaEnd As Long, i As Integer
colStart = 2
colEnd = 32
rigaStart = 18
rigaEnd = 77
For c = colEnd To colStart
For r = rigaEnd To rigaStart
If Cells(r, c) = "D" Then
If c > 2 Then
k = 0
For i = 2 To c - 1
If Cells(r, i) = "D1" Then
k = 1
Exit For
End If
Next i
If k = 0 Then
Cells(r, c) = "D1"
GoTo salto
End If
Else
Cells(r, c) = "D1"
Exit For
End If
End If
Next r
salto:
Next c
End Sub


ho provato ad invertire in questa maniera ma non funziona , non sembra cui sia un errore nella scrittura ma non produce nessun cambiamento
Post: 3.461
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
10/04/2023 09:55

ciao
ti sembra uguale a quanto ti ho detto di fare nel post #12 ??

rileggilo con calma....

saluti




[Modificato da dodo47 10/04/2023 09:56]
Domenico
Win 10 - Excel 2016
Post: 87
Registrato il: 25/05/2015
Età: 53
Utente Junior
2007
ONLINE
10/04/2023 12:03

Questo problema è sorto adesso ma si verifica in una fase più avanzate della compilazione del turno, una volta inserite le d1, d2 ,d3a,d3b ed i pl , e per fare ciò ho adattato le macro che tu mi hai compilato, e funzionano anche se a causa dell'ordine le ultime righe restano di solito prive di D1.
Ma il problema che ora affronto è il seguente , nel turno sono presenti anche le lettere N e H , le H venivano convertite in H2 H3 a seconda che nelle due celle precedenti sia nelle due celle precedenti della riga sottostante sia contenuta la sigla M2 P2 M3 P3 ovviamente la H cambierà di conseguenza.
per fare ciò usavo questa macro:

Sub FOGLIO_centrali_uscite_cambia_H()

'FOGLIO centrali uscite cambia le H in H" o H3

1 Sheets("D 123").Select
2 For r = 18 To 77 Step 2
3 For c = 2 To 32
4 If Cells(r, c).Value = "H" Then
5 If (Cells(r, c - 2).Value = "M2" Or Cells(r, c - 2).Value = "P2" Or Cells(r + 1, c - 2).Value = "M2" Or Cells(r + 1, c - 2).Value = "P2") Then
6 Cells(r, c).Value = "H2"
7 ElseIf (Cells(r, c - 2).Value = "M3" Or Cells(r, c - 2).Value = "P3" Or Cells(r + 1, c - 2).Value = "M3" Or Cells(r + 1, c - 2).Value = "P3") Then
8 Cells(r, c).Value = "H3"
9 End If
10 c = c + 2
11 End If
12 Next c
13 Next r


13 End Sub
che però non funziona più mi da errore sulla riga n 5 (le righe le ho numerate io per cmodità in questo post.
Magari è unca cavolata ma non riesco a vederla.
Post: 88
Registrato il: 25/05/2015
Età: 53
Utente Junior
2007
ONLINE
10/04/2023 12:19

Re:
dodo47, 06/04/2023 09:52:

ciao
nella prima parte:

questa istruzione:
For c = colStart To colEnd
controlla colonna per colonna a partire da colonna 2 (B) a col. 32 (AF)
per invertire l'ordine di controllo delle colonne, dovrai fare: For c = colEnd to colStart Step -1

quest'altra:
For r = rigaStart To rigaEnd
controlla riga per riga da 3 a 66
per invertire l'ordine di controllo delle righe, dovrai fare: For r = rigaEnd to rigaStart Step -1

---------------------------------------------------------------------------------------------------------------------

La seconda parte è stata sviluppata con una logica diversa, pertanto PRIMA devi sostituirla con questa ed accertarti che funzioni come prima:
Sub SecondaParte_2()
'un secondo passaggio che attribuisca casualmente _
 alle colonne che non contengano "D1" ma solo "D" almeno un a "D1" _
 la seconda fase di questa macro è proprio aggiungere una D1 la dove _
 ci siano colonne che ne sono sprovviste facendo attenzione che _
 sulle righe , con l'aggiunta di questa macro ,poi non ce ne siano più di due.
 

Dim rng As Range, rng1 As Range
colStart = 2
colEnd = 32
rigaStart = 3
rigaEnd = 66
For c = colStart To colEnd
    Set rng = Range(Cells(rigaStart, c), Cells(rigaEnd, c))
    'controolo se colonna NON contiene D1 ma contiene D
    i = Application.WorksheetFunction.CountIf(rng, "D1")
    i1 = Application.WorksheetFunction.CountIf(rng, "D")
    If i = 0 And i1 > 0 Then
        For r = rigaStart To rigaEnd
            If Cells(r, c) = "D" Then
                'controllo se riga dove mettere D1 contiene meno di 2 D1
                Set rng1 = Range(Cells(r, colStart), Cells(r, colEnd))
                i = Application.WorksheetFunction.CountIf(rng1, "D1")
                If i < 2 Then
                    Cells(r, c) = "D1"
                    Exit For
                End If
            End If
        Next r
    End If
Next
End Sub

poi, CON LO STESSO PRINCIPIO DELLA PRIMA PARTE, INVERTI SECONDO QUELLO CHE VUOI FARE, I DUE CICLI:
For c......
For r.......

saluti



Che figura di m... avevo tralasciato lo step. scusami funziona perfettamente, ma si può anche fare in modo che il controllo lo faccia casualmente?
Post: 3.462
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
10/04/2023 19:22


....ma si può anche fare in modo che il controllo lo faccia casualmente?...



mi sembra che stai tirando troppo la corda.....accontentati o provaci tu.
Capisci bene che la cosa comporta una sostanziale modifica di quanto finora fatto, in quanto la scelta casuale comporta comunque il controllo della riga che, se non corrisponde ai parametri, va scartata per effettuarlo su un'altra....

Per quanto riguarda il post #15, questo è un problema completamente diverso da quello di questo 3D.

Se vuoi apri un nuovo post chiarendo bene ed allegando un esempio.

saluti


[Modificato da dodo47 10/04/2023 19:24]
Domenico
Win 10 - Excel 2016
Post: 89
Registrato il: 25/05/2015
Età: 53
Utente Junior
2007
ONLINE
09/05/2023 09:48

Re:
dodo47, 10/04/2023 19:22:


....ma si può anche fare in modo che il controllo lo faccia casualmente?...



mi sembra che stai tirando troppo la corda.....accontentati o provaci tu.
Capisci bene che la cosa comporta una sostanziale modifica di quanto finora fatto, in quanto la scelta casuale comporta comunque il controllo della riga che, se non corrisponde ai parametri, va scartata per effettuarlo su un'altra....

Per quanto riguarda il post #15, questo è un problema completamente diverso da quello di questo 3D.

Se vuoi apri un nuovo post chiarendo bene ed allegando un esempio.

saluti





Scusa se rispondo ora ma sono stato impegnato e ho sospeso il lavoro su questa cosa.
lungi da me fare polemica con chi mi aiuta , ma ti assicuro che prima di chiedere ci provo e se chiedo è perchè non trovo info altrove.
detto ciò ho provato a modificare le macro che mi hai fornito per modificare altre sigle , ma quando arrivo ad adattarla per sostituire le "P" con "PL" , funziona in maniera anomala.
quello che volevo fare inizialmente è che la macro controllasse se nella colonna ci sono due "P" una delle due la sostituisse con "PL" contando che non ce ne siano più di due sulla sigha.
con la macro "completa P" dovrebbe controllare le restanti righe con "P" ma sprovviste di "PL" e sostituire le"P" con "PL" affinché ne sia almeno una per colonna ma mai due per colonna.
le due macro presenti nel foglio che allegherò però al primo giro funziona correttamente al secondo giro lascia delle colonne con 0 "PL" e 2 "P", e colonne con 2 "PL" e 0 "P", non capisco perchè.


ma nel frattempo però i criteri sono cambiati.
avrei bisogno che la macro facesse quanto segue:
Nella tabella da "B10" a "AG73" sostituire una delle 2 "P" presenti nelle colonne con "PL" senza che mai ce ne siano più di una per colonna.
dando priorità alle "P" hanno la cella successiva vuota o contenente "P" ,"-", "H" ,"N".

grazie per l'aiuto
Vota: 15MediaObject5,00118 1
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 17:53. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com