› Sviluppare funzionalita su Microsoft Office con VBA › Cerca valore Max tra più fogli partendo dal 4 foglio. Excel 2021
-
AutoreArticoli
-
Buongiorno a tutti,
sto cercando di risolvere un problema ed è questo.
Supponiamo che nel file ci sono 15 fogli con nomi diversi Es. Foglio1, Foglio2 e così via.
In un foglio inserisco in A1 questa formula: =MAX('AB0:AB999'!F20)
Poi creo due fogli chiamati AB0 e AB999 e li sistemo il primo all'inizio di tutti i fogli e l'altro come ultimo.
La formula funziona benissimo e restituisci il valore massimo trovato su tutti i fogli alla cella F20. Fin qui ok.
Pur aver letto su questo forum alcuni argomenti nel merito e cercato in rete, non riesco a risolvere il fatto che la ricerca del valore "MAX" deve partire dal 4 foglio e su tutti i fogli presenti nel file.
Ho provato nel spostare il foglio AB0 dalla prima alla quarta posizione, ma la formula mi restituisce 0.
Grazie
Sempre se ho capito la richiesta di aiuto....
Se crei i 15 fogli, poi il primo lo chiami AB0 e l'ultimo AB999 poi in cella A1 del foglio nominato AB0 ci scrivi =MAX('Foglio4:AB999'!F20) ti fa il calcolo dal Foglio 4 fino al foglio AB999.
Cmq volevo dirti una cosa (non c'entra nulla con l'argomento della tua richiesta). Facciamo un passo indietro al discorso delle camere...dovresti effettuare una piccola modifica al codice (come mi è stato suggerito da Vecchio_Frac):
Nella frmAssegnaCamera vai nell'evento CommandButton18_Click e ti porti al ciclo For che ti indico si seguito...
For i = 1 To giorniPernotto ReDim Preserve periodo(1 To giorniPernotto) '<-----------Portare il ReDim periodo() fuori dal ciclo periodo(i) = DateSerial(annoArrivo, meseArrivo, giornoArrivo) giornoArrivo = giornoArrivo + 1 Next iDevi portare il ReDim Preserve periodo fuori dal ciclo (cioè prima di For i = 1 To giorniPernotto)
Lo fai diventare così (senza il Preserve)
ReDim periodo(1 To giorniPernotto) For i = 1 To giorniPernotto periodo(i) = DateSerial(annoArrivo, meseArrivo, giornoArrivo) giornoArrivo = giornoArrivo + 1 Next iScusa se utilizzo questo Thread per dirti questa cosa ma mi sono ricordato adesso e per non dimenticarmi ne ho approfittato. Eventualmente, ulteriori indicazioni sull'argomento Assegna Camere ci rifacciamo sul Thread apposito
Ciao Alex, è un piacere sentirti. Come vedi sono qui per andare avanti nel progetto.
Allora: in primis ho cambiato con il tuo suggerimento la riga e la riporto,
giorniMeseArrivo = DateSerial(annoArrivo, meseArrivo + 1, 1) - DateSerial(annoArrivo, meseArrivo, 1) giorniMesePartenza = DateSerial(annoPartenza, mesePartenza + 1, 1) - DateSerial(annoPartenza, mesePartenza, 1) giorniPernotto = DateSerial(annoPartenza, mesePartenza, giornoPartenza) - DateSerial(annoArrivo, meseArrivo, giornoArrivo) ReDim periodo(1 To giorniPernotto) For i = 1 To giorniPernotto 'ReDim Preserve periodo(1 To giorniPernotto) 'disattivata periodo(i) = DateSerial(annoArrivo, meseArrivo, giornoArrivo) giornoArrivo = giornoArrivo + 1 Next icosì mi potrai dire se sta bene e poi se non ti chiedo troppo vorrei capire con termini "per noi piccoli umani"
la differenza. Almeno voglio provarci.Ti ringrazio tantissimo a te e al Vecchio frac per l'aiuto che mi state dando.
Invece ritornando al problema in questione non và. Ho provato anche io ma di il valore del foglio4 cella F20.
Ti spiego cosa mi serve.
Io ho creato con assemblaggi di codici diversi, un codice che mi crea una "Ricevuta" dove al suo interno tra i vari dati, c è anche il numero di ricevuta.
Quindi, interessa sapere iniziando dal 4 foglio in poi il valore massimo che si trova nella cella F20. dopodicè aggiungo +1 posso emettere una nuova ricevuta con il numero MAX trovato + 1. Non so se sono stato chiaro.
Grazie Alex
Se vuoi ti allego il codice per la creazione della ricevuta e magari mi dessi un'occhiata. Dimmi tu.
Io ho creato con assemblaggi di codici diversi, un codice che mi crea una "Ricevuta" dove al suo interno tra i vari dati, c è anche il numero di ricevuta.
Quindi, interessa sapere iniziando dal 4 foglio in poi il valore massimo che si trova nella cella F20. dopodicè aggiungo +1 posso emettere una nuova ricevuta con il numero MAX trovato + 1. Non so se sono stato chiaro.
Diciamo che lavorare su un tuo file di esempio è sempre preferibile. Cmq tieni presente che nella formula dovresti modificare Foglio4 con il nome del Foglio. Non so se si chiama Fattura4 allora dovrai scrivere =MAX('Fattura4:AB999'!F20)
Io ho provato e funziona. Mi posiziono in cella A1 del foglio AB0 messo al primo posto e se nelle celle F20 dei foglio 2 e 3 scrivo un qualsiasi valore numerico non avviene nulla. Se invece vado a scriverlo nel celle F20 che sono comprese dal foglio Fattura4 al foglio AB999 allora mi restituisce il valore più alto. Cmq se alleghi un file è meglio.
Per la questione dell frmAssegnaCamera, scrivo sul thread apposito, altrimenti diventa dispersivo.
Non va. Perchè la ricevuta non è una sola ma saranno 2,3,4, e così via.
Ti allego il codice che uso e appena posso ti inserisco in file.
Grazie
'Crea nuova Ricevuta cliente Dim Messaggio As String, Titolo As String, x As String, _ ws As Integer, wsc As Integer, wsX As String, wsOri As Worksheet, _ wsCopia As Worksheet, z As String, zz As String, wss As Integer, y As String Application.ScreenUpdating = False ' acceleriamo il processo disattivando lo schermo 'Application.Calculation = xlManual Messaggio = "La nuova Ricevuta prenderà il nome dal: Numero prenotazione composto, dal Codice cliente, anticipato da tre 000, + la Data di arrivo." y = txtNumPrenotazione.Text Titolo = "CREA NUOVA RICEVUTA!" x = InputBox(Messaggio, Titolo, y) '& txtNumPrenotazione.Text x = UCase(x) If x = "" Then Exit Sub wsc = Sheets.Count For ws = 1 To wsc Sheets(ws).Activate wsX = ActiveSheet.Name If wsX = x Then z = MsgBox("Esiste già la ricevuta " & y & ". Vuoi inserire una nuova ricevuta?" & Chr(13) & "" & Chr(13) & "", _ vbYesNo + vbCritical, "!!! ATTENZIONE !!!") If z = vbNo Then Exit Sub Else 10 zz = InputBox("Inserisci una nuova ricevuta!") x = UCase(zz) If zz = "" Then Exit Sub End If 'mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm 'NUOVO CICLO per la seconda verifica For wss = 1 To wsc Sheets(wss).Activate wsX = ActiveSheet.Name If wsX = x Then z = MsgBox("Secondo Avviso!" & Chr(13) & "Esiste già una ricevuta " & y & ". " & Chr(13) & "" & Chr(13) & "", vbCritical, "!!! ATTENZIONE !!!") GoTo 10 'RITORNA ALL'INPUTBOX End If Next wss 'mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm End If Exit For End If Next ws Set wsOri = Sheets("Matrice") ' Questo è il foglio che deve copiare con le varie impostazioni per la nuova ricevuta With wsOri .Visible = True .Activate .Copy before:=Sheets(1) End With Set wsCopia = Sheets("Matrice (2)") With wsCopia .Name = x ''All'interno del foglio appena creato inseriamo i vari dati. Non definitivo, in costruzione Range("A26").Value = (txtRicevutaTotaleOspiti.Value) Range("B26").Value = ("PAX. ") ' n. Persone + numero pernotti Range("A25").Value = (txtRicevutaPernotti.Value) ' numero pernotti Range("B25").Value = "Periodo" + " dal " + (txtRicevutaDataArrivo.Value) + " al " + (txtRicevutaDataPartenza.Value) Range("F20").Value = (txtRicevutaNumeroRicevuta.Value) ' numero ricevuta Range("H20").Value = Format(Now(), "dd-mm-yyyy") ' inserisci la data di emissione ricevuta Range("F11").Value = (txtRicevutaCognome.Value) + (" ") + (txtRicevutaNome.Value) ' Scrivi cognome e nome e/o Ragione sociale impresa Range("F13").Value = (txtRicevutaIndirizzo.Value) ' Indirizzo Impresa Range("F15").Value = "( " + (txtRicevutaProvincia.Value) + " )" ' Il risultato contenuto in txtbox deve essere tra le parentesi Range("I25").Value = ("€.") + (txtRicevutaCostoSoggiorno.Text) ' il costo totale soggiorno Range("I49").Value = (txtRicevutaCostoSoggiorno.Text & " EURO") ' il costo totale soggiorno Range("F49").Value = ("€.") + (txtRicevutaCostoSoggiorno.Text) ' il costo totale soggiorno Range("F14").Value = (txtRicevutaCap.Value) + (" - ") + (txtRicevutaLuogoDiRilascio.Value) ' inserisce Cap e luogo dell'impresa ' 1° condizione. Copia in ricevuta se trovi un valore If txtRicevutaAcconto <> "" Then Range("C49").Value = ("ACCONTO ") + ("€.") + (txtRicevutaAcconto.Value) + (" DATA ") + (txtRicevutaDataAcconto.Value) ' Scrivi Range("C52").Value = ("MODALITA': ") + (" ") + (txtRicevutaMetodoSaldo.Value) ' Scrivi End If ' 2° condizione. Copia in ricevuta se trovi un valore If txtRicevutaDataSaldo.Value <> "" Then Range("C51").Value = ("SALDO ") + ("€.") + (txtRicevutaSaldo.Value) + (" DATA ") + (txtRicevutaDataSaldo.Value) ' Scrivi Range("C50").Value = ("MODALITA': ") + (" ") + (txtRicevutaMetodoAcconto.Value) ' Scrivi End If MsgBox ("Una nuova Ricevuta cliente chiamata - " & x & " - è stato registrata con Successo!") & Chr(13) & "" & Chr(13) & "", vbInformation, ("INFO: Operazione riuscita!!!") End With Application.ScreenUpdating = True ActiveSheet.Tab.ColorIndex = 5 ' quando crei una nuova Fattura, colora di Blu la linguetta Sheets(x).Move after:=Sheets(Worksheets.Count - 1) ' sposta il foglio creato prima del foglio chiamato AB999 ActiveSheet.Protect Password:="" ' Mettiamo la proQuando riesci allega il file che non è facile capire il risultato da ottenere.
Ales ti allego il file.
All'interno del file ci sono tre ricevute la N°1 "0004-01-01-2024", la 2° "0007-09-01-2024", la 3° "00014-10-03-2024" .
All'interno di questi fogli nella cella F20 c è il Num. di Ricevuta.
Quello che vorrei ottenere è: deve trovare il valore massimo della cella F20 (in questo caso è 27) tra tutti i fogli presenti tra AB0 a AB999, e memorizzarlo nella Cella M2 del foglio Generale.
Questo perchè quando andrò ad emettere una nuova ricevuta, mi carico il valore della cella M2 in Textbox gli aggiungo +1 ed avrò ottenuto un nuovo numero per la nuova ricevuta.La cosa strana che ho notato è il fatto che se spostavo il foglio AB0 All'inizio, la formula in M2 del foglio Generali funzionava. Adesso non so cosa ho cancellato/modificato e la formula mi restituisce sempre 0 a prescindere AB0 dove lo posizioni. Mistero!
Allegati:
You must be logged in to view attached files.Ho risolto, il problema era nel foglio matrice la cella F20 era formattata in Testo. Mi è bastata formattarla in Generale che adesso funziona.
Grazie
Allora...non entro nel merito del perché si mette in moto così il meccanismo di assegnare un nuovo numero di ricevuta...se a te va bene così allora prosegui pure così. Ma tu crei tanti foglio per quante ricevute farai? Se è così avrai centinai di Fogli nel tempo. Non so quanto soffrirà il tuo gestionale a sopportare centinaia di Fogli. Io invece mi genererei la ricevuta in formato PDF e creerei una cartella dove conterrei tutte le ricevute. Magari farei una cartella generale "RICEVUTE" al suo interno tante altre cartelle: "RICEVUTE_2024" , "RICEVUTE_2025", ecc...magari anche suddivise per mesi. All'interno di ogni cartella andrebbe la ricevuta in formato PDF (o anche in formato xlsx, se per caso ci fosse bisogno di modificarla). Poi nel Foglio GENERELE nella cella M2 fare scrivere il numero dell'ultima ricevuta emessa...ma dopo che è stata generata in PDF. Alla prossima ricevuta verrà interpellato il valore contenuto in foglio "Generale!M2" incrementato di 1.
Cmq per risolvere il tuo problema devi modificare il FormatNumber nelle celle F20 di ogni Foglio relativo alle ricevute. Adesso ce l'hai formattato come TESTO per questo la Funzione MAX() non funziona. Vai in tutte le celle F20 ce ti interessano, tasto dx del mouse, Formato Celle..., scegli NUMERO. Ti allego immagine come indicazioni
Allegati:
You must be logged in to view attached files.Ho risolto, il problema era nel foglio matrice la cella F20 era formattata in Testo. Mi è bastata formattarla in Generale che adesso funziona.
Perfetto...lo avevo notato anche io ma hai risolto prima tu mentre scrivevo. Cmq pensa anche alla mia idea che ti ho scritto su
Ciao Alex,
non entro nel merito del perché si mette in moto così il meccanismo di assegnare un nuovo numero di ricevuta
Ogni anno dal 01/01 al 31/12 la ricevuta deve avere un numero progressivo. Si parte da 1 poi 2, 3 e così via per ogni cliente. Il numero di ricevuta è univoco e non possono esserci 2 ricevute con lo stesso numero. Ecco perchè una volta inserito il primo numero, senza andare a vedere tra i vari fogli (ricevute), l'ultimo numero inserito. Qui entra in funzione il numero massimo che riportandolo in una textbox, mi basterà prendere quel valore maggiorarlo di 1, ed avrò il nuovo numero.
Ma tu crei tanti foglio per quante ricevute farai? Se è così avrai centinai di Fogli nel tempo.
Esatto. Un foglio con pochi dati ma un file con tanti fogli.
Non so quanto soffrirà il tuo gestionale a sopportare centinaia di Fogli. Io invece mi genererei la ricevuta in formato PDF e creerei una cartella dove conterrei tutte le ricevute. Magari farei una cartella generale "RICEVUTE" al suo interno tante altre cartelle: "RICEVUTE_2024" , "RICEVUTE_2025", ecc...magari anche suddivise per mesi. All'interno di ogni cartella andrebbe la ricevuta in formato PDF (o anche in formato xlsx, se per caso ci fosse bisogno di modificarla). Poi nel Foglio GENERELE nella cella M2 fare scrivere il numero dell'ultima ricevuta emessa...ma dopo che è stata generata in PDF. Alla prossima ricevuta verrà interpellato il valore contenuto in foglio "Generale!M2" incrementato di 1.
Non ci avevo pensato a quanti fogli possa contenere e supportare excel. Invece per quanto riguarda il PDF, ci avevo pensato ed ho qualcosa a portata di mano che devo modificare.
Il fatto invece di salvare anche il foglio nel formato xlsx non ci avevo pensato.
Quindi tu consigli di creare una cartella esterna e credo sia un'ottima idea. Questo farà si che il file sia più leggero/veloce.
Se ho capito bene:
Creare una cartella: Ricevute Generali.
Al suo interno creare una cartella: Ricevute 2024, (Ricevute 2025) , al suo interno inserire sia i file PDF che i file xslx.
Se è così non ci avevo pensato. Ottimo direi.
P.s. Una mia curiosità, secondo te quanti fogli o quanto Mb può gestire un file Excel?
Se ho capito bene:
Creare una cartella: Ricevute Generali.
Al suo interno creare una cartella: Ricevute 2024, (Ricevute 2025) , al suo interno inserire sia i file PDF che i file xslx.
Se è così non ci avevo pensato. Ottimo direi.
Si esatto. Ora io non so esattamente la dinamica dell'emissione della ricevuta, ma ipotizzo che quanto visualizzi la scheda del cliente, premi un button CREA RICEVUTA e verrà generata una ricevuta prendendo tutti i dati necessari (Cognome, Nome, periodo, nr. di ricevuta, ecc...). Appena si genera, viene archiviata una copia in PDF in una cartella specifica (oppure ti verrà chiesto dove salvarla attraverso un finestra di dialogo). Stesso ragionamento per il file in xlsx. Però sul tuo gestionale sarà presente solo un Foglio di appoggio dedicato alla creazione della ricevuta.
Ora io non so esattamente la dinamica dell'emissione della ricevuta, ma ipotizzo che quanto visualizzi la scheda del cliente, premi un button CREA RICEVUTA e verrà generata una ricevuta prendendo tutti i dati necessari (Cognome, Nome, periodo, nr. di ricevuta, ecc..
Come hai potuto notare nel file allegato, ho creato un altra Userform apposito per le ricevute. Mi carica i dati che servono. Chiaramente devo finire e sistemare al meglio il tutto.
Appena si genera, viene archiviata una copia in PDF in una cartella specifica (oppure ti verrà chiesto dove salvarla attraverso un finestra di dialogo). Stesso ragionamento per il file in xlsx. Però sul tuo gestionale sarà presente solo un Foglio di appoggio dedicato alla creazione della ricevuta.
Esatto, ci sto arrivando. Il Foglio di Appoggio deve rimanere perchè quella è la base (impostazione) della ricevuta; foglio "Matrice".
Ciao @pixel ti voglio girare una mia proposta per quanto riguarda la faccenda delle Ricevute.
Lancia il gestionale, visualizza un cliente e crea la ricevuta, poi premi su STAMPA RICEVUTA. Dopo ti chiede se vuoi stampare la ricevuta, dopo accettato ti stampa la ricevuta in PDF. Poi vai nella cartella dove risiede questo gestionale che hai appena scaricato e vedi che ti ha creato una cartella RICEVUTE. Guarda bene all'interno cosa trovi.
Ovviamente vanno ancora sistemate altre cose e bisogna gestire gli altri buttone e checkbox (non ho capito a cosa servono...caso mai spiega pure se ti interessa portare avanti il gestionale in questo modo).
Allegati:
You must be logged in to view attached files.P.s. Una mia curiosità, secondo te quanti fogli o quanto Mb può gestire un file Excel?
I fogli sono virtualmente illimitati e dipendono dalla memoria disponibile. Stesso discorso per la dimensione del file che però è dipendente da fattori diversissimi e non si può essere precisi a priori. Tieni conto però che Excel ha dei limiti intrinseci che possono rallentarne le prestazioni o diminuirle drasticamente al crescere dei dati (e delle formule).
Qui il link alle informazioni Microsoft sulle specifiche e i limiti di Excel:
Buongiorno Vecchio Frac,
a titolo di curiosità/conoscenza nei limiti, ho letto in rete le cose che hai riportato tu in poche righe ma ricche di contenuti.
Grazie per il tuo intervento.
@pixel hai dato uno sguardo al mio post di ieri alle 17.32 #43092? Ti ho allegato un esempio di stampa ricevuta.
Ciao Alex,
hai dato uno sguardo al mio post di ieri alle 17.32 #43092? Ti ho allegato un esempio di stampa ricevuta.
Scusami per il notevole ritardo ma non lo avevo notato. Lo provo e ti faccio sapere.
'Format(Now(), "dd-mm-yyyy") Corretto riga Folder = "Ricevute\FormatoPDF\" & mese & "\"con questa Folder = "Ricevute\FormatoPDF\" & mese & Format(Now(), "yyyy") & "\" Gennaio 2024Vorrei ottenere una cosa del genere "Ricevuta 2024" . Sto provando, sicuramente starò sbagliando.
Potresti sfruttare gli oggetti che hai nella UserForm....
Folder = "Ricevute\FormatoPDF\" & mese & " " & Year(txtRicevutaDataEmissione) & "\"Ho notato che manca un mio post precedente. Lo cancellato convinto di averlo mandato in rete.
Alex, ho modificato come hai detto tu. Io mi sono avvicinato ma dava errore perchè io usavo:
Folder = "Ricevute\FormatoPDF\" & mese & " " & Year(Data)&(txtRicevutaDataEmissione) & "\"
Comunque come detto nel post precedente che erroneamente avrò cancellato, il tuo codice è molto più snello di quello che stavo elaborando io. Infatti, io stavo usando 1 codice era per il PDF e l'altro per salvare il foglio. Invece il tuo fa tutto in uno. Ingamba come sempre Alex.
Ti volevo chiedere una cosa. Secondo te è possibile che quando vado per salvare anzicchè creare la sottocartella "Ricevute" possa crearmi la sotto cartella con l'anno di riferimento in automatico ad es. Ricevute 2024. Questo perchè potrei avere il tutto in un unica cartella es. Ricevute 2024, Ricevute 2025 e cosi via. Secondo te si potrebbe realizzare?
Gazie
Ovviamente vanno ancora sistemate altre cose e bisogna gestire gli altri buttone e checkbox (non ho capito a cosa servono...caso mai spiega pure se ti interessa portare avanti il gestionale in questo modo).
P.s. Il fatto chkbox è il seguente.
Su indicazione del mio commercialista "Pignolo"
se emetto una ricevuta di un cliente ad es. Rossi Mario, questa va bene impostarla così.Se invece è un impresa :
Ditta Impiantistica Europea SPA
---- qui tutti i dati ....
'Si aggiunge in ricevuta
Vostri ospiti:
Rossi Mario
Bianco Vito
e tutti i nomi degli ospiti che hanno usufruito del servizio.
Naturalmente non l' ho finito, ma il motivo che selezionando la CHKBOX Azienda, il codice mi vada ad inserire la dicitura "Vostri ospiti:" e poi tutti i nominativi.
Questo è quanto.
Prova così, ma è da verificare il funzionamento.
Folder = "Ricevute" & " " & Year(txtRicevutaDataEmissione) & "\FormatoPDF\" & mese & " " & Year(txtRicevutaDataEmissione) & "\" '.... '.... '.... '.... Folder = "Ricevute" & " " & Year(txtRicevutaDataEmissione) & "\FormatoXLSX\" & mese & " " & Year(txtRicevutaDataEmissione) & "\" -
AutoreArticoli
