faretesto > microsoft.* > microsoft.office.excel

maurizio.rota (13.08.2019, 09:44)
Salve a tutti,

un carico effettuato dal lun al ven viene sempre scaricato il giorno lavorativo successivo; il problema è che quando lo scarico questo "scivola" il mese successivo devo "slittare" anche la fatturazione.
Quale funzione vba mi suggerite x discriminare (eliminare) gli scarichi cheslittano al mese dopo?

i.e.:

data carico data scarico
31/01/19 - gio 01/02/19 - ven
28/02/19 - gio 01/03/19 - ven
29/03/19 - ven 01/04/19 - lun
30/04/19 - mar 01/05/19 - mer
31/05/19 - ven 01/06/19 - sab
28/06/19 - ven 01/07/19 - lun
31/07/19 - mer 01/08/19 - gio
30/08/19 - ven 02/09/19 - lun
30/09/19 - lun 01/10/19 - mar
31/10/19 - gio 01/11/19 - ven
29/11/19 - ven 02/12/19 - lun
31/12/19 - mar 01/01/20 - mer

Grazie
casanmaner (13.08.2019, 15:32)
Il giorno martedì 13 agosto 2019 09:44:27 UTC+2, mauriz...@infinito.itha scritto:
[..]
> 29/11/19 - ven 02/12/19 - lun
> 31/12/19 - mar 01/01/20 - mer
> Grazie


Non è chiaro se il sabato sia festivo o meno.
Qui sembrerebbe di no:
31/05/19 - ven 01/06/19 - sab

qui e in altri esempi invece sì:
28/06/19 - ven 01/07/19 - lun

non si comprende se vuoi che vengano eliminati definitavamente o solo riportati da altra parte solo quelli che rientrano nel mese stesso della data dicarico.
Inoltre non spieghi se nel tuo database le date di carico siano consecutiveo meno. Nel tuo database vengono già calcolate in automatico le date di scarico o invece dovono essere dedotte dalle sole date di carico?
Le soluzioni possono essere varie ma senza avere idea del "quadro generale"una soluzione potrebbe risultare difficilemente applicabile se non applicabile del tutto.
Ad es. mi verrebbe in mente la possibilità di utilizzare un filtro automatico con riporto dei dati in un'altra posizione (tramite vba anche in unfoglio differente) per poi utilizzare i dati filtrati.
Il filtro basato su criteri da impostare in base alla data iniziale e finale del mese di fatturazione per le sole date di scarico che siano comprese nello stesso mese (immagino però che le date di carico il cui scarico finisca nel mese successivo poi in tale mese dovranno essere fatturate).
maurizio.rota (13.08.2019, 15:53)
Il giorno martedì 13 agosto 2019 15:32:45 UTC+2, casanmaner ha scritto:
[..]
> Le soluzioni possono essere varie ma senza avere idea del "quadro generale" una soluzione potrebbe risultare difficilemente applicabile se non applicabile del tutto.
> Ad es. mi verrebbe in mente la possibilità di utilizzare un filtro automatico con riporto dei dati in un'altra posizione (tramite vba anche in un foglio differente) per poi utilizzare i dati filtrati.
> Il filtro basato su criteri da impostare in base alla data iniziale e finale del mese di fatturazione per le sole date di scarico che siano compresenello stesso mese (immagino però che le date di carico il cui scaricofinisca nel mese successivo poi in tale mese dovranno essere fatturate).


il sabato e domenica NON si scarica mai

--> i dati vengano eliminati definitivamente
--> le date di carico NON sono consecutive
--> le date di scarico SONO dedotte dalle date di carico

bye
maurizio.rota (13.08.2019, 15:54)
Il giorno martedì 13 agosto 2019 15:32:45 UTC+2, casanmaner ha scritto:
[..]
> Le soluzioni possono essere varie ma senza avere idea del "quadro generale" una soluzione potrebbe risultare difficilemente applicabile se non applicabile del tutto.
> Ad es. mi verrebbe in mente la possibilità di utilizzare un filtro automatico con riporto dei dati in un'altra posizione (tramite vba anche in un foglio differente) per poi utilizzare i dati filtrati.
> Il filtro basato su criteri da impostare in base alla data iniziale e finale del mese di fatturazione per le sole date di scarico che siano compresenello stesso mese (immagino però che le date di carico il cui scaricofinisca nel mese successivo poi in tale mese dovranno essere fatturate).


corrige:

31/05/19 - ven 03/06/19 - lun
casanmaner (13.08.2019, 17:13)
Questo un possibile esempio di estrazione dei dati presenti in un "database":


Nel foglio Database ho dei dati dove sono presenti la colonna "data carico"e soprattutto "data scarico" dove viene calcolata la data di scarico (ho usato la funzione "GIORNO.LAVORATIVO" in questo esempio).

Nel foglio estrazione ho inserito una cella dove indicare l'anno e il mese di scarico (celle B1 e B2 caratterizzate dallo sfondo azzurro).
Nell'intervallo C1:D2 ho inserito i criteri del filtro avanzato.
In particolare in C1 e D1 vanno riportate le intestazioni corrispondenti all'intestazione nel database dove sono presenti le date di scarico.
Se ad es. l'intestazione fosse "data scarico" anche in quelle due celle va indicato "data scarico". Se fosse l'intestazione fosse "data di scarico" allora anche in quelle celle andrebbe indicata "data di scarico".
Nelle celle C2 e D2 ho inserito le formule per determinare gli intervalli di date comprese nel mese (e in base all'anno indicato).
Nota che le date sono formattate nel formato americano mm/gg/aaaa perché il VBA le riconosca come date "corrette".
Inserendo l'anno e il mese nelle rispettive celle la procedura VBA estrai dal database i dati che rispettano i criteri di date comprese tra il primo giorno e l'ultimo giorno del mese.
Per fare ciò nel VBA ho inserito nel modulo di classe del foglio "Estrazione" il seguente codice evento:
'---
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Const CellaAnno As String = "B1"
Const CellaMeseScarico As String = "B2"
If Not Intersect(Target(1), Me.Range(CellaAnno)) Is Nothing Or _
Not Intersect(Target(1), Me.Range(CellaMeseScarico)) Is Nothing Then
Call EstraiDati
End If
End Sub
'---

Nel Modulo1 del progetto VBA ho invece inserito questo codice:
Option Explicit

Sub EstraiDati()

Const sFoglioDataBase As String = "Database"
Const sFoglioEstrazione As String = "Estrazione"
Const sCriteriaRange As String = "C1:D2"
Const sPrimaCellaEstrazione As String = "A5"
Dim wsDataBase As Worksheet
Dim wsEstrazione As Worksheet
Dim rCopyToRange As Range
Dim oLo As ListObject
Dim rCriteriaRange As Range
On Error GoTo GestioneErrori
With ThisWorkbook
Set wsDataBase = .Worksheets(sFoglioDataBase)
Set wsEstrazione = .Worksheets(sFoglioEstrazione)
End With
Set oLo = wsDataBase.ListObjects(1)
With wsEstrazione
Set rCriteriaRange = .Range(sCriteriaRange)
Set rCopyToRange = .Range(sPrimaCellaEstrazione).Resize(1, oLo.ListColumns.Count)
End With
Call Disabilita
oLo.Range.AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=rCriteriaRange, _
CopyToRange:=rCopyToRange, _
Unique:=False
RiprendiErrori:
Call Riabilita
Exit Sub
GestioneErrori:
MsgBox "Si è verificato l'errore n. " & Err.Number & vbNewLine & _
Err.Description, vbCritical, "Errore VBA"
Resume RiprendiErrori
End Sub

Sub Disabilita()
With Application
.Calculation = xlCalculationManual
.EnableEvents = False
.ScreenUpdating = False
End With
End Sub

Sub Riabilita()
With Application
.Calculation = xlCalculationAutomatic
.EnableEvents = True
.ScreenUpdating = True
End With
End Sub

Vedi se, soprattutto rispetto all'intercettazione dell'intervallo del tuo database, riesci ad adattare il codice alla tua situazione reale.
buonocoreelio (14.08.2019, 00:42)
Il giorno martedì 13 agosto 2019 17:13:45 UTC+2, casanmaner ha scritto:
[..]
> End With
> End Sub
> Vedi se, soprattutto rispetto all'intercettazione dell'intervallo del tuodatabase, riesci ad adattare il codice alla tua situazione reale.


Non sembra necessario creare un'area criteri con le date in formato mm/gg/aaaa. Si può anche creare un'area criteri di sole 2 celle con campo calcolato.
Svilupperei inoltre la parte relativa ai festivi italiani dinamizzati con calendario 'perpetuo', estendendo la formula in colonna B del database.
Ho provato a riadattare il tuo file con codice VBA invariato a parte la riga
Const sCriteriaRange As String = "P1:P2"

Link del file di esempio:


Ciao
Elio
casanmaner (14.08.2019, 08:48)
Il giorno mercoledì 14 agosto 2019 00:42:11 UTC+2, buonoc...@gmail.comha scritto:
> Il giorno martedì 13 agosto 2019 17:13:45 UTC+2, casanmaner ha scritto:
> Non sembra necessario creare un'area criteri con le date in formato mm/gg/aaaa. Si può anche creare un'area criteri di sole 2 celle con campo calcolato.
> Svilupperei inoltre la parte relativa ai festivi italiani dinamizzati concalendario 'perpetuo', estendendo la formula in colonna B del database.
> Ho provato a riadattare il tuo file con codice VBA invariato a parte la riga
> Const sCriteriaRange As String = "P1:P2"
> Link del file di esempio:
>
> Ciao
> Elio


Ciao Elio,
per quanto riguarda le date con Excel 2007 se non inserisco nella formula dei due criteri il formato USA il vba non riconosce i record e non riporta mai quelli che corrispondono alle date di scarico comprese nell'intervallo di date.
Non so in versioni successive se il comportamento sia differente.

Per quanto riguarda il campo calcolato non credo che vada bene così impostato.
Prova ad inserire il mese di febbraio (2).
Benche ci sia una riga il cui scarico è in febbraio non viene riportato perché la data di carico è gennaio (1) e quindi non rispettandola doppia condizione non viene riportata la riga che però dovrebbe essere riportata perché se si stanno cercando gli scarichi da fatturare in febbraio anche questo dovrebbe finire in tale mese.
In pratica vengono riportati per un determinato mese quelli che sono stati caricati nel mese e scaricati nello stesso mese.
Ma maurizio dice che quelli il cui scarico viene fatto nel mese successivo,rispetto al mese di carico devono essere "splittati" al mese successivo.
Penso che con questa formula si dovrebbe risolvere il riporto dei record inbase all'anno e al mese di scarico:
=E(ANNO(DataBase!C3)=$B$1;MESE(DataBase!C3)=$B$2)

ciao
maurizio.rota (14.08.2019, 09:45)
Il giorno mercoledì 14 agosto 2019 08:48:26 UTC+2, casanmaner ha scritto:
[..]
> Penso che con questa formula si dovrebbe risolvere il riporto dei record in base all'anno e al mese di scarico:
> =E(ANNO(DataBase!C3)=$B;MESE(DataBase!C3)=$B)
> ciao


Grazie dei preziosi consigli... ora me li studierò e adatterò.
buonocoreelio (14.08.2019, 10:39)
per Ermanno
Tenuto conto che nell'applicativo l'area criteri è fatta da formule dipendenti dalle celle B1 e B2, che sono già sufficientemente esplicative del mese e anno criterio di estrazione, si può passare al VBA il semplice numero seriale:
=">=" & DATA(B1;B2;1) restituisce
>= 43466


e

="<=" & DATA(B1;B2;31)
<=43496

dove le formule e l'area criterio si possono mettere dove si vuole

Per la variante con criterio colonna calcolata ammetto che non avevo ben capito cosa servisse e avevo inteso che il criterio fosse quello che entrambele date fossero nello stesso mese; comunque volevo proporre l'alternativa che con la tua formula funziona.
Nel contempo ho voluto segnalare che nella versione originaria le formule in colonna B del database non tenevano conto dei festivi italiani, compresa l'ostica pasquetta.
Ciao
Elio
Discussioni simili