› Sviluppare funzionalita su Microsoft Office con VBA › Filtrare dei in base ad una condizione
-
AutoreArticoli
-
Ciao.
Io ho la versione di Excel 2019 MSO (versione 2401) a 64 bit di Office 365 Business 2019
Allora nel file in allegato io ho dei dati chimico-fisici acquisiti in mare mediante una sonda. Per ogni stazione di campionamento (NationalStationID), caratterizzata dall'appartenenza ad una regione (Region) e ad un area (MRU) e dalla profondità del fondale (SeaDepth) sono stati fatti nel 2021 diverse campagne di acquisizione definite dai campi (Year, Month, Day, Time). Per ogni profilo effettuato dalla sonda in un giorno (es.: Stazione: ITA06SMLG1, SeaDepth=15, 12/1/2021, i dati iniziano ad essere acquisiti per vari parametri presenti nel campo Determin_Nutrients, a differenti profondità indicate nel campo SampleDepth; per questo profilo i dati sono stati acquisiti fino alla profondità di 15 m, cioè fino al fondo.
Tuttavia in alcune stazioni la sonda non scende fino al fondo, specialmente nelle stazioni profonde, per cui i dati si arrestano ad una certa profondità. Nel primo caso che vi ho descritto invece la sonda è scesa fino al fondo.
Andiamo al dunque.
Io devo selezionare del profilo di quelle stazioni, selezionando tutti i campi identificativi (MRU, Region, NationalStationID, Year, Month, Day, Time) in cui la sonda raggiunge il fondo, cioè in cui ASS(SeaDepth - SampleDepth(massima profondità del profilo) sia al massimo 1, e mi interessa anche il dato di "Dissolved oxygen" associato alla massima profondità presente nel campo "Concentration".
Riferendosi all'esempio di prima il record che mi interessa dell'intero profilo dovrebbe contenere solo i seguenti dati, rispetto all'intero profilo che inizia alla riga 2 e finisce alla riga 128
ID, IT, NAS, Friuli Venezia Giulia, ITA06SMLG1, 15, 2021, 1, 12, 10:53:48 (ora di quando la sonda raggiunge il fondo), Dissolved oxygen, µmol/l, 247,17 (valore di Concentration associato alla quota più profonda di SampleDepth), 15 (SampleDepth), ASS(SeaDepth- SampleDepth) [campo calcolato]
Va bene anche selezionare i dati di tutti i profili, pure di quelli dove ASS(SeaDepth- SampleDepth) > 1, poi mi ordino o filtro quelli che mi interessano.
Io sono riuscito con le PivotTable a selezionare per ciascun profilo di una stazione la profondità del fondale e la profondità massima raggiunta della sonda (messi nello stesso rigo), però putroppo non sono riuscito a ad avere il valore del Dissolved oxygen associato alla massima profondità della sonda.
Spero di essermi spiegato bene e chiaro. Se avete da chiedermi qualcosa non esitate a contattarmi.
Vi allego il file di prova che contiene solo una parte dei dati.
Aspetto con ansia un vostro aiuto, sperando che non sia necessario trasferire tutto in Access per fare questa select.
By Albatros54: per privacy rimosso contatto Telefonico
Allegati:
You must be logged in to view attached files.Basta applicare i filtri alle colonne in base alle tue esigenze.
in allegato il file con i filtri applicati, mancando la colonna ASS non e' corretto, ma il concetto funziona.
Allegati:
You must be logged in to view attached files.Grazie Aldo.
La cosa purtroppo è più complessa, sennò non avrei chiesto il vostro aiuto.
Il valore massimo di SampleDeath cambia per la stessa stazione da mese a mese (le indagini si svolgono ogni due mesi in un solo giorno per la maggioranza delle regioni; solo per EMR, Veneto e Marche tutti i mesi). Come puoi vedere per la stazione ITA06SMLG3 per 5 mesi è 20m e per un mese è 21m. Inoltre da stazione a stazione anche cambia la massima profondità di campionamento/misurazione.
Poi, immaginando di lavorare sul complesso dei dati (circa 500.000 record o righe in Excel), dovrei filtrare una stazione e poi filtrare le profondità massime (che possono variare nel corso dei mesi, quindi dovrei valutare quali sono quelle massime). A questo punto mi copio questi dati in un nuovo foglio. Poi rifaccio le operazioni fatte per una nuova stazione, e vado avanti così. Probabilmente dopo 1-2 giorni di estenuanti copia e incolla finirei.
Non è possibile con la TabellaPivot o PowerPivot riuscire ad automatizzare il tutto, magari inserendo una Select in linguaggio SQL ?
Oppure con una procedura in VB, magari inserendo sempre una Select in linguaggio SQL ?
Io purtroppo mi tocca analizzare questi dati ogni 5-6 anni e poi mi occupo di altro, per cui non ho mai approfondito l'uso di VB per Excel o le potenzialità delle PowerPivot o delle Query in Excel. Se dovessi occuparmi di gestire dati molto più frequentemente allora sicuramente avrei cercato di imparare il linguaggio di VB, o di R, o il linguaggio SQL per creare query complesse in ACCESS.
Fidando nel vostro supporto, attendo qualche soluzione al mio problema. Se devo smanettare un po' per adattarla alla mia situazione non c'è problema.
In base alla tua richiesta
"Riferendosi all'esempio di prima il record che mi interessa dell'intero profilo dovrebbe contenere solo i seguenti dati, rispetto all'intero profilo che inizia alla riga 2 e finisce alla riga 128
ID, IT, NAS, Friuli Venezia Giulia, ITA06SMLG1, 15, 2021, 1, 12, 10:53:48 (ora di quando la sonda raggiunge il fondo), Dissolved oxygen, µmol/l, 247,17 (valore di Concentration associato alla quota più profonda di SampleDepth), 15 (SampleDepth), ASS(SeaDepth- SampleDepth) [campo calcolato]"
e al file allegato la soluzione proposta soddisfava il quesito.
Per fare quello che vuoi devi allegare il file originale da dove prelevare i dati (Anche parziale, anzi parziale con due/tre stazioni) ,facciamo una macro che contiene una query con i parametri da te richiesti, scriviamo i record corrispondenti in un nuovo foglio/file.
E' quello che ti serve?
Grazie Aldo.
Il file allegato già contiene i dati di più stazioni.
Per esempio dalla riga 129 iniziano i dati della stazione ITA06SMLG2, campionata sempre a gennaio ma con fondale (colonna F) pari a 12m.
Seguono le stazioni, ITA06SMLG3, ITA06SMTS1, ...; cioè tutte le stazioni del FVG e Puglia campionate nel corso dei vari mesi del 2021. Io ho i dati di tutte le regioni bagnate dal mare, per il periodo 2016-2021.
Puoi verificarlo applicando il filtro sulle colonne dei dati.Puoi riallegare il file con, in Foglio2, il risultato che ti attendi per almeno un paio di stazioni (quindi con le colonne da estrarre ed i valori attesi) in modo da capire bene quello che vuoi ottenere.
Allora ho fatto una prima scremata.
Nel file allegato premendo il pulsante FILTRA scrive nel foglio DatiEstratii tutte le righe che hanno ASS <= 1 e "Dissolved oxygen" associato alla massima profondità presente nel campo "Concentration".
Pero' ci sono delle cose che non mi tornano.
Di massime profondita, nello stesso profilo ce ne sono piu' di una, e addirittura alcune ASS sono con segno negativo cioe la profondita' della sonda e maggiore della profondita del fondale, se non ho capito male.
Guardalo e dimmi le cose da cambiare nella selezione delle righe.
Allegati:
You must be logged in to view attached files.Devi cancellare il tuo numero di cellulare che hai inserito nel primo post.
In un forum pubblico non serve ed è un dato sensibile.
Ciao Aldo.
Scusa ma ieri pomeriggio sono stato impegnato.
Ho visto il risultato della macro nel foglio "DatiEstratti". Funziona, ma andrebbe fatta una piccola correzione per eliminare i record in più per ogni profilo giornaliero. Potrei farlo anche manualmente ma, trattandosi di migliaia di record, impiegherei molto tempo; inoltre, non credo che ad uno bravo come te costa molto tempo.
Nel file che ti rimando ho evidenziato in verde la riga da mantenere e in rosso quelle che non vanno estratte relative all'acquisizione di quella stazione per quella data. Per alcune stazioni è solo una riga da non estrarre (es: ITA06SMLG1) e per altre sono più di una (1CA03, 1CA04, 9PN02bis).
La riga da selezionare è quella con il valore del campo ASS più vicino a zero, perché a me interessa che venga estratta una sola riga e cioè un solo dato dell'ossigeno disciolto per ciascuna stazione campionata per quella data. Ci sono delle situazioni però da valutare.
Per esempio per la stazione 1CA03 ci sono due valori di ASS equidistanti dallo 0 (che manca), 0,5 e -0,5. In questo caso basta eliminare i valori negativi e risolviamo. Quindi basta nello script fare in modo di non estrarre i record con valori di ASS negativi.
Eliminando i valori negativi, per assurdo in una stazione potrebbero esserci acquisizioni di dati a breve distanza tra loro per cui ci potrebbero essere record con ASS uaguale a 0; 0,5; 0,75; 1,0; 1,20. In questo caso dovrebbe essere estratta solo quella con ASS pari a 0.
In una stazione con ASS pari a 0,75; 1,00; 1,30; andrebbe estratto quello con ASS = 0,75
Spero sia tutto chiaro
Allegati:
You must be logged in to view attached files.>>>perché a me interessa che venga estratta una sola riga e cioè un solo dato dell'ossigeno disciolto per ciascuna stazione campionata per quella data<<<
Io non sono bravo, vedendo l'allegato in DatiEstratti capisco il motivo perche la riga3 rimane e la Riga2 debba essere eliminata.
Domanda, mà allora pure le righe4,6,8 devono essere eliminate ecc ecc ecc? Perchè non sono colorate?
Ps. Quasi pronto, mà devo capire se il mio pensiero è giusto.
Edit. Se non sbaglio, desideri una riga sola con date differenti ed (ASS <= 1)
Le righe colorate erano solo un esempio. Certamente anche le righe 4,6 e 8 non vanno estratte, così come così come le righe 10, 12 e 14, ed altre ancora.
Le condizioni sono le seguenti.
Ad ogni stazione (NationalStationID) sono associate più date di campionamento nell'anno. Per ogni data di una determinata stazione sede essere selezionata una sola riga. Se il valore del campo ASS è positivo, allora va estratta quella riga con valore di ASS uguale a zero o più vicino allo zero. Se il valore del campo ASS è negativo, allora va estratta quella riga con il valore di ASS più negativo.
Scusatemi mi sono accorto adesso che nel precedente commento ho fatto un errore nel definire le condizioni. In quest'ultimo commento sono descritte le condizioni corrette per la selezione della riga da estrarre per ciascuna campagna di campionamento eseguita in ogni stazione per una determinata campagna.
Rimando l'allegato con le righe evidenziate da estrarre in verde e da non estrarre in rosso.
Grazie mille
Allegati:
You must be logged in to view attached files.Non hai allegato un foglio coi dati richiesti per almeno due o tre stazioni (tutte le righe che vorresti venissero estratte) ed ilfoglio DatiEstratti del file che hai allegato non chiarisce nulla.
Io con una query Access estrarrei questi 115 record (ho omesso le prime colonne per fare stare i dati più importanti nel post):
StationID Giorno Ora Nutrients Unit Conc. SampleDepth 1CA02bis 25-feb-21 12:19:38 Dissolved oxygen µmol/l 247,50 16,5 1CA02bis 30-mar-21 12:30:48 Dissolved oxygen µmol/l 288,40 15,5 1CA02bis 13-mag-21 12:27:21 Dissolved oxygen µmol/l 256,60 15,5 1CA02bis 15-set-21 14:25:39 Dissolved oxygen µmol/l 198,40 16,5 1CA03 25-feb-21 13:12:21 Dissolved oxygen µmol/l 249,40 26,5 1CA03 30-mar-21 13:18:00 Dissolved oxygen µmol/l 270,20 25,5 1CA03 13-mag-21 13:05:36 Dissolved oxygen µmol/l 262,20 35,5 1CA03 12-lug-21 15:11:05 Dissolved oxygen µmol/l 290,00 32,5 1CA03 15-set-21 13:47:36 Dissolved oxygen µmol/l 231,60 34,5 1CA04 25-feb-21 13:58:14 Dissolved oxygen µmol/l 263,80 90,5 1CA04 30-mar-21 14:28:56 Dissolved oxygen µmol/l 250,00 82,5 1CA04 13-mag-21 13:48:11 Dissolved oxygen µmol/l 247,50 45,5 1CA04 15-set-21 12:54:59 Dissolved oxygen µmol/l 246,60 82,5 8PC02bis 22-feb-21 12:30:56 Dissolved oxygen µmol/l 245,30 28,5 8PC02bis 26-mar-21 16:30:00 Dissolved oxygen µmol/l 252,81 31,5 8PC02bis 28-mag-21 12:38:43 Dissolved oxygen µmol/l 269,40 29,5 8PC02bis 29-lug-21 12:18:00 Dissolved oxygen µmol/l 258,40 29,5 8PC02bis 14-set-21 12:02:11 Dissolved oxygen µmol/l 224,40 32,5 8PC03 22-feb-21 11:44:57 Dissolved oxygen µmol/l 241,90 47,5 8PC03 26-mar-21 15:40:00 Dissolved oxygen µmol/l 248,80 45,5 8PC03 28-mag-21 11:51:38 Dissolved oxygen µmol/l 263,40 45,5 8PC03 29-lug-21 11:30:00 Dissolved oxygen µmol/l 238,40 48,5 8PC03 14-set-21 11:25:16 Dissolved oxygen µmol/l 212,80 48,5 8PC04 22-feb-21 10:36:00 Dissolved oxygen µmol/l 241,30 98,5 8PC04 26-mar-21 14:15:00 Dissolved oxygen µmol/l 239,10 97,5 8PC04 28-mag-21 10:33:32 Dissolved oxygen µmol/l 435,00 101,5 8PC04 14-set-21 10:17:03 Dissolved oxygen µmol/l 167,20 96,5 9PN02bis 23-feb-21 10:19:50 Dissolved oxygen µmol/l 242,20 42,5 9PN02bis 26-mar-21 13:25:00 Dissolved oxygen µmol/l 248,80 36,5 9PN02bis 28-mag-21 16:51:27 Dissolved oxygen µmol/l 349,40 45,5 9PN02bis 12-ago-21 12:40:00 Dissolved oxygen µmol/l 230,30 35,5 9PN02bis 15-set-21 12:39:04 Dissolved oxygen µmol/l 241,90 36,5 9PN03 23-feb-21 09:51:58 Dissolved oxygen µmol/l 240,30 99,5 9PN03 26-mar-21 12:40:00 Dissolved oxygen µmol/l 231,30 100,5 9PN03 28-mag-21 16:05:13 Dissolved oxygen µmol/l 260,90 91,5 9PN03 12-ago-21 11:56:02 Dissolved oxygen µmol/l 247,80 95,5 9PN03 15-set-21 12:01:27 Dissolved oxygen µmol/l 223,80 105,5 9PN04 23-feb-21 09:22:14 Dissolved oxygen µmol/l 230,30 86,5 9PN04 26-mar-21 11:05:00 Dissolved oxygen µmol/l 226,90 100,5 9PN04 28-mag-21 14:57:39 Dissolved oxygen µmol/l 231,30 99,5 9PN04 12-ago-21 11:07:31 Dissolved oxygen µmol/l 240,60 98,5 9PN04 15-set-21 10:52:04 Dissolved oxygen µmol/l 223,10 106,5 ITA06SMLG1 12-gen-21 10:53:48 Dissolved oxygen µmol/l 274,17 15 ITA06SMLG1 08-mar-21 11:58:31 Dissolved oxygen µmol/l 280,18 14 ITA06SMLG1 26-mag-21 10:45:08 Dissolved oxygen µmol/l 248,00 15 ITA06SMLG1 12-lug-21 11:05:14 Dissolved oxygen µmol/l 241,66 15 ITA06SMLG1 14-set-21 11:25:03 Dissolved oxygen µmol/l 177,48 15 ITA06SMLG2 12-gen-21 11:36:42 Dissolved oxygen µmol/l 268,13 12 ITA06SMLG2 08-mar-21 12:43:30 Dissolved oxygen µmol/l 279,29 11 ITA06SMLG2 26-mag-21 11:26:22 Dissolved oxygen µmol/l 259,27 12 ITA06SMLG2 12-lug-21 11:46:30 Dissolved oxygen µmol/l 267,69 12 ITA06SMLG2 14-set-21 12:06:14 Dissolved oxygen µmol/l 216,83 12 ITA06SMLG3 12-gen-21 12:26:17 Dissolved oxygen µmol/l 260,63 20 ITA06SMLG3 08-mar-21 13:47:55 Dissolved oxygen µmol/l 271,66 20 ITA06SMLG3 26-mag-21 12:23:27 Dissolved oxygen µmol/l 247,63 20 ITA06SMLG3 12-lug-21 11:36:22 Dissolved oxygen µmol/l 257,84 20 ITA06SMLG3 14-set-21 13:12:47 Dissolved oxygen µmol/l 215,28 21 ITA06SMTS1 13-gen-21 12:56:34 Dissolved oxygen µmol/l 263,75 22 ITA06SMTS1 11-mar-21 12:23:08 Dissolved oxygen µmol/l 289,21 22 ITA06SMTS1 18-mag-21 13:10:31 Dissolved oxygen µmol/l 225,19 22 ITA06SMTS1 13-lug-21 12:44:24 Dissolved oxygen µmol/l 191,99 23 ITA06SMTS1 15-set-21 12:23:19 Dissolved oxygen µmol/l 176,45 22 ITA06SMTS2 13-gen-21 12:11:59 Dissolved oxygen µmol/l 266,88 25 ITA06SMTS2 11-mar-21 11:48:34 Dissolved oxygen µmol/l 293,84 24 ITA06SMTS2 18-mag-21 12:19:12 Dissolved oxygen µmol/l 244,69 24 ITA06SMTS2 13-lug-21 12:45:39 Dissolved oxygen µmol/l 160,41 25 ITA06SMTS2 15-set-21 11:34:41 Dissolved oxygen µmol/l 197,66 24 ITA06SMTS3 13-gen-21 10:54:16 Dissolved oxygen µmol/l 267,19 23 ITA06SMTS3 11-mar-21 10:21:49 Dissolved oxygen µmol/l 292,35 22 ITA06SMTS3 18-mag-21 10:49:24 Dissolved oxygen µmol/l 241,25 22 ITA06SMTS3 13-lug-21 11:12:56 Dissolved oxygen µmol/l 177,64 23 ITA06SMTS3 15-set-21 10:19:58 Dissolved oxygen µmol/l 153,25 23 3FO02bis 23-feb-21 12:57:41 Dissolved oxygen µmol/l 259,10 18,5 3FO02bis 26-mar-21 14:45:00 Dissolved oxygen µmol/l 287,80 12,5 3FO02bis 11-mag-21 12:19:20 Dissolved oxygen µmol/l 258,13 18,5 3FO02bis 21-set-21 11:58:57 Dissolved oxygen µmol/l 193,80 16,5 3FO03 23-feb-21 12:39:44 Dissolved oxygen µmol/l 250,00 19,5 3FO03 26-mar-21 14:15:00 Dissolved oxygen µmol/l 269,10 19,5 3FO03 11-mag-21 11:43:46 Dissolved oxygen µmol/l 259,38 19,5 3FO03 27-lug-21 15:52:08 Dissolved oxygen µmol/l 210,00 22,5 3FO03 21-set-21 11:35:58 Dissolved oxygen µmol/l 199,40 21,5 3FO04 23-feb-21 11:50:57 Dissolved oxygen µmol/l 256,80 37,5 3FO04 26-mar-21 13:10:00 Dissolved oxygen µmol/l 259,40 33,5 3FO04 11-mag-21 10:43:12 Dissolved oxygen µmol/l 253,75 22,5 3FO04 27-lug-21 13:56:42 Dissolved oxygen µmol/l 275,30 34,5 3FO04 21-set-21 11:02:08 Dissolved oxygen µmol/l 252,50 36,5 4BA02bis 23-feb-21 08:34:12 Dissolved oxygen µmol/l 234,70 62,5 4BA02bis 26-mar-21 10:30:00 Dissolved oxygen µmol/l 246,30 75,5 4BA02bis 03-giu-21 11:58:32 Dissolved oxygen µmol/l 257,81 72,5 4BA02bis 21-set-21 15:18:27 Dissolved oxygen µmol/l 255,60 67,5 4BA03 23-feb-21 08:57:55 Dissolved oxygen µmol/l 245,00 52,5 4BA03 26-mar-21 11:00:00 Dissolved oxygen µmol/l 242,20 100,5 4BA03 03-giu-21 11:08:30 Dissolved oxygen µmol/l 237,50 100,5 4BA03 27-lug-21 10:00:00 Dissolved oxygen µmol/l 257,20 100,5 4BA03 21-set-21 14:53:47 Dissolved oxygen µmol/l 239,70 100,5 4BA04 23-feb-21 09:30:32 Dissolved oxygen µmol/l 226,40 75,5 4BA04 26-mar-21 11:45:00 Dissolved oxygen µmol/l 238,80 100,5 4BA04 03-giu-21 09:52:17 Dissolved oxygen µmol/l 227,80 100,5 4BA04 27-lug-21 11:21:55 Dissolved oxygen µmol/l 250,90 100,5 4BA04 21-set-21 14:16:35 Dissolved oxygen µmol/l 236,60 100,5 6CB02bis 26-feb-21 12:15:08 Dissolved oxygen µmol/l 240,00 73,5 6CB02bis 29-mar-21 12:46:00 Dissolved oxygen µmol/l 241,30 85,5 6CB02bis 17-giu-21 14:07:09 Dissolved oxygen µmol/l 242,50 82,5 6CB02bis 26-lug-21 12:50:00 Dissolved oxygen µmol/l 229,10 80,5 6CB02bis 10-set-21 11:52:17 Dissolved oxygen µmol/l 243,40 80,5 6CB03 26-feb-21 11:33:29 Dissolved oxygen µmol/l 255,00 88,5 6CB03 29-mar-21 11:51:00 Dissolved oxygen µmol/l 196,30 85,5 6CB03 17-giu-21 13:30:53 Dissolved oxygen µmol/l 231,60 100,5 6CB03 26-lug-21 11:55:00 Dissolved oxygen µmol/l 247,20 100,5 6CB03 10-set-21 11:21:26 Dissolved oxygen µmol/l 244,70 100,5 6CB04 26-feb-21 10:37:01 Dissolved oxygen µmol/l 245,90 89,5 6CB04 29-mar-21 10:00:00 Dissolved oxygen µmol/l 205,90 100,5 6CB04 17-giu-21 12:22:10 Dissolved oxygen µmol/l 231,60 100,5 6CB04 26-lug-21 10:50:00 Dissolved oxygen µmol/l 233,80 100,5 6CB04 10-set-21 10:32:40 Dissolved oxygen µmol/l 239,10 99,5Secondo me, serve ordinare gg-mm-aaaa + stazione + ASS ed estrare la prima riga (vedo se riesco domani)
Da provare (sempre che abbia ragione sul metodo), a me rimangono 115 righe.
Sul Tuo allegato aggiungi un foglio=Foglio2, In un MODULO inserisci questo codice ed avvialoPs.Sul mio PCm ci mette quasi due minuti
`Option Explicit Sub Estrai() Dim sh1 As Worksheet: Set sh1 = Worksheets("Foglio1") Dim sh2 As Worksheet: Set sh2 = Worksheets("Foglio2") Dim X As Long, Ur As Long, N As Long, dD As String Ur = sh1.Range("A" & Rows.Count).End(xlUp).Row Application.ScreenUpdating = False Application.Calculation = xlCalculationManual sh2.Cells.Clear sh1.Range("A1:Q1").Copy Destination:=sh2.Range("A1") sh2.Range("R1") = "DATA" sh2.Range("S1") = "N°Riga" N = 2 For X = 2 To Ur If sh1.Range("L" & X) = "Dissolved oxygen" Then sh1.Range("A" & X & ":Q" & X).Copy Destination:=sh2.Cells(N, 1) dD = sh2.Range("I" & N) & "/" & sh2.Range("H" & N) & "/" & sh2.Range("G" & N) sh2.Range("R" & N) = CDate(dD) sh2.Range("R" & N) = X N = N + 1 End If Next Ur = sh2.Range("A" & Rows.Count).End(xlUp).Row sh2.Sort.SortFields.Clear sh2.Sort.SortFields.Add Key:=Range("R2:R" & Ur), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal sh2.Sort.SortFields.Add Key:=Range("E2:E" & Ur), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With sh2.Sort .SetRange Range("A1:S" & Ur) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With For X = Ur To 2 Step -1 If sh2.Range("E" & X) = sh2.Range("E" & X - 1) And sh2.Range("R" & X) = sh2.Range("R" & X - 1) Then sh2.Rows(X & ":" & X).Delete Shift:=xlUp ElseIf sh2.Range("S" & X) > 1 Then sh2.Rows(X & ":" & X).Delete Shift:=xlUp End If Next Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Set sh1 = Nothing Set sh2 = Nothing MsgBox "Fatto" End Sub `Questa e' la mia versione, estrae 52 righe, a parita di ASS considera la prima trovata.
Se ci deve essere un'altra discriminante dimmi quale.
Allegati:
You must be logged in to view attached files.Ciao. Funziona benissimo, almeno da diversi controlli che ho fatto.
Grazie mille davvero !!!
Inserisco comunque questo che avevo preparato per illustrare un po' la natura dei dati e le condizioni che richiedevo per selezionare i dati che mi interessavano.
Breve descrizione dell’acquisizione dei dati.
Ad ogni stazione (NationalStationID) sono associate più date di campionamento nell'anno. Per ogni data di una determinata stazione (posizionata sempre nello stesso punto geografico) vengono acquisite mediante una sonda CTD alcuni parametri chimici e fisici dell’acqua di mare dalla superficie fino al fondo o fino ad una determinata profondità se il fondale in quel punto è troppo alto. Per questo motivo per una stazione (ITA06SMLG1), alla data (2021/1/12), esistono più record o righe corrispondenti alle diverse quote (SampleDepth) di misurazione; generalmente ogni 0,5 m. Nel campo ASS (campo calcolato) il valore è = SeaDepth (profondità del mare per quella stazione) – SampleDepth (profondità del mare nel punto di acquisizione).
Condizioni per l’estrazione delle righe.
Riferiamoci ad una stessa stazione campionata in quella stessa data. Nel caso che il valore ASS sia sempre positivo, va estratta una riga solo se 0≥ASS ≤1; nel caso non esista un valore di ASS che rispetti questa condizione allora non verrà selezionata nessuna riga per quella stazione e per quella data.
Nel caso che il valore ASS assume anche valori negativi, va estratta la riga con il valore di ASS più negativo.
Credo che l’algoritmo, per una stazione analizzata in una determinata data, debba cercare il valore minimo di ASS. Se questo valore è > 1 allora passa alla successiva campagna della stessa stazione oppure ad una nuova stazione, altrimenti estrae questa riga con il corrispondente valore di “Dissolved oxygen” associato alla SampleDepth.
Ciao. Funziona benissimo, almeno da diversi controlli che ho fatto.
Citare o dire a chi stai rispondendo pare brutto?
Ciao, quando ho ottenuto lo stesso risultato di scossa, ho allegato senza ricontrollare bene, ci sono due errori da correggere
1)sh2.Range("R" & N) = X ---->sh2.Range("S" & N) = X
2)ElseIf sh2.Range("S" & X) > 1 Then------>ElseIf sh2.Range("Q" & X) > 1 Then51 Record
va estratta una riga solo se 0≥ASS ≤1; nel caso non esista un valore di ASS che rispetti questa condizione allora non verrà selezionata nessuna riga per quella stazione e per quella data.
Scusa, ma che senso ha andare a fare i rilievi in un mare profondo 1.100 con una sonda lunga 106,5 se poi i dati non li prendi nemmeno in considerazione??
Questa e' la mia versione, estrae 52 righe, a parita di ASS considera la prima trovata.
Mi spieghi come fa ASS(SeaDepth - SampleDepth) a dare un numero negativo? E perché, tra le 52, ci sono righe che non rispettano la condizione 0≥ASS ≤1 ?
Mi spieghi come fa ASS(SeaDepth - SampleDepth) a dare un numero negativo?
Questo lo devi chiedere all'utente, ci sono dei casi, come ho fatto notare anche io, in cui la quota di misurazione "SEMBREREBBE" maggiore della profondita' del fondale, ma non e' il mio campo
perché, tra le 52, ci sono righe che non rispettano la condizione 0≥ASS ≤1 ?
Io ho seguito le istruzioni date dall'utente:
Condizioni per l’estrazione delle righe.
Riferiamoci ad una stessa stazione campionata in quella stessa data. Nel caso che il valore ASS sia sempre positivo, va estratta una riga solo se 0≥ASS ≤1; nel caso non esista un valore di ASS che rispetti questa condizione allora non verrà selezionata nessuna riga per quella stazione e per quella data.
Nel caso che il valore ASS assume anche valori negativi, va estratta la riga con il valore di ASS più negativo.
Ad ogni stazione (NationalStationID) sono associate più date di campionamento nell'anno. Per ogni data di una determinata stazione sede essere selezionata una sola riga. Se il valore del campo ASS è positivo, allora va estratta quella riga con valore di ASS uguale a zero o più vicino allo zero. Se il valore del campo ASS è negativo, allora va estratta quella riga con il valore di ASS più negativo.
Della serie idee poche ma ben confuse (intendo planera)! Vabbhè contento lui.
Ciao
Allora rispondo a Scossa e Aldo Ercolini.
In questo monitoraggio effettuato in mare le stazioni sono collocate a 3, 6 e 12 miglia dalla costa; può quindi capitare che una ad stazione il fondale è molto profondo (500 o 1000 m) e la sonda che acquisisce i dati termina le acquisizioni prima del fondo. Il motivo non lo so; potrebbe darsi che il cavo d'acciaio per calare la sonda non sia lungo abbastanza oppure che le misurazioni vengono fatte fino alla quota dove arriva la luce. Visto che a me interessa conoscere il valore dell'ossigeno disciolto in prossimità del fondale perché un valore molto basso (condizione di ipossia o anossia) può essere un problema per gli organismi marini che vivono sul fondo; in alcune circostanze può provocare la morte di pesci e invertrebati marini (molluschi e crostacei). Questo fenomeno è stato osservato in passato nelle acque costiere del nord Adriatico influenzate dagli scarichi del fiume Po. Ritornando ai miei dati, in questo caso il valore di ASS è >> 1 e quindi, questo indica che l'ultimo valore di ossigeno disciolto misurato dalla sonda è comunque molto distante dal fondo e quindi non mi interessa che venga selezionato o estratto.
I valori negati di ASS sono dovuti al fatto che le quote di campionamento sono superiori alla profondità del fondale registrata per quella stazione. In realtà non dovrebbe mai accadere; purtroppo succede perché chi va ad eseguire il monitoraggio utilizzano sistemi di posizionamento non precisi oppure sbagliano in qualche modo l'individuazione della stazione e fanno le misurazioni in un punto stazione più profondo. In questo caso avremo anche valori di ASS negativi e supporremo che quello più negativo sia quello in prossimità del fondo.
Comunque ALDO, ho provato ad eseguire la tua macro su altri dati e mi sono accorto che salta alcuni valori di alcune stazioni in il valore di 0=<Ass<=1, che dovevano essere estratti.
Ora ti allego il tuo file in cui ho inserito tutti i dati della regione Abbruzzi. Ho creato anche una Tabella Pivot in cui puoi vedere per ciascuna stazione e per ciascuna data il valore massimo di SampleDeath e il valore minimo di ASS così sai per quali stazioni e date devi aspettarti che venga estratto la riga con il valore di fondo dell'ossigeno disciolto. Nel foglio dati estratti troverai solo 11 record. Scusami per sbaglio ho eliminato il bottone per eseguire la macro, ma io lo eseguita lo stesso da "Visualizza macro". Per esempio per la stazione 1_ABR_GU04 sarebbero dovuti essere estratti i valori dell'ossigeno di fondo per tutte e sei le date di rilevamento, e invece la Macro ne ha estratti solo 4; per la stazione 1_ABR_GU06 sarebbe essere estratti 5 record, e invece ne è stato estratto solo uno.
Se non è possibile estrarre i dati perché qualche problema nella struttura dei dati, non ti preoccupare; fammi sapere qual'è il problema.
Allegati:
You must be logged in to view attached files.In questo caso avremo anche valori di ASS negativi e supporremo che quello più negativo sia quello in prossimità del fondo.
Matematicamente è impossibile:
In matematica, il valore assoluto o modulo di un numero reale x è una funzione che associa a x un numero reale non negativo secondo la seguente definizione: se x è non negativo, il suo valore assoluto è x stesso; se x è negativo, il suo valore assoluto è −x . Ad esempio, il valore assoluto sia di 3 che di −3 è 3 . Il valore assoluto di un numero x si indica con |x| .
>>>>>Per esempio per la stazione 1CA03 ci sono due valori di ASS equidistanti dallo 0 (che manca), 0,5 e -0,5. In questo caso basta eliminare i valori negativi e risolviamo.<<<<
Non desidero entrare nei Vostri ragionamenti, perchè non ci capisco un cavolo. Solo per dirVi che le 51 righe estrate sono errate (non ci possono essere valori ASS -10, -15 ecc ecc). Tutto oggi che ci riprovo senza esito, facendo una semplice estrazione dei valori Ass <1 and Ass > -1 escono 92 record, dovrebbero essere eliminati altri 39 record mà non riesco eliminare riga82.
Modulo2 - Sub Estrai222222()Allegati:
You must be logged in to view attached files. -
AutoreArticoli
