ciao, potresti verificare se viene presa l'ultima provincia (Viterbo)?
@NickTheGeek6 жыл бұрын
Ciao, hai ragione, non viene presa perché bisogna modificare l'inizio del ciclo FOR principale così: for i = 3 to ultima_riga + 1 Questo perché altrimenti per la provincia di Viterbo non viene mai verificato che la provincia nella riga del ciclo sia diversa dalla provincia nella riga superiore. Grazie per la segnalazione, metto il tuo commento stickato sperando che venga letto
@ft68706 жыл бұрын
Grazie mille, ora l'esercizio è corretto. Il numero degli abitanti e dei comuni coincide con quelli di partenza.
@riccardoricky13353 жыл бұрын
Continuo ad essere convinto che questo sia il corso migliore in circolazione per iniziare a lavorare in VBA. A mio parere questo era un concetto difficile ma è stato spiegato, come sempre, con grande chiarezza. Complimenti
@NickTheGeek3 жыл бұрын
Grazie mille Riccardo
@mectronik89076 жыл бұрын
Credo che questo corso stia diventando più valido rispetto agli altri per semplicità e chiarezza. Complimenti! Speriamo continui...
@NickTheGeek6 жыл бұрын
Ciao Alessandro, grazie! Di sicuro il corso continua, spero che continui anche il suo successo :-P
@paolog.34614 жыл бұрын
Ciao e grazie per l'impegno che hai messo in questo tuo corso, se non altro ho cominciato a capirci qualcosa, qui però mi si sono ingarbugliate le idee... Lo ricomicio da capo nella speranza che sia vera l'affermazione "Repetita iuvant"! Credo sia inutile andare avanti anche se uno dei motivi che mi spinge ad imparare il VBA è più per poter semplificare l'immissione di dati e il loro smistamento più che una loro catalogazione. Comunque grazie di cuore!
@NickTheGeek4 жыл бұрын
Ciao, mi dispiace che questo video ti abbia creato confusione; se hai dubbi specifici chiedi pure, ma nel frattempo ti consiglio di saltarlo e di proseguire con i successivi; se ti interessa l'immissione di dati ti consiglio in particolare gli ultimi video sulle userform (dal 61 in poi); devo ancora registrare quelli finali in cui farò un progetto più complesso, ma mi richiederanno ancora qualche settimana/mese di tempo
@paolog.34614 жыл бұрын
@@NickTheGeek Magari un po' è colpa dell'età e che mai ho affrontato un linguaggio di programmazione finora, amo excel da sempre (fu amore a prima vista) e a livello amatoriale lo padroneggio abbastanza, da un po' mi sono reso conto che alcuni miei fogli potrebbero essere ulteriormente semplificati tramite il VBA e da qui il tentativo di comprensione e tutti e tentativi precedenti erano naufragati clamorosamente. Approfittando di questa quarantena per caso mi sono imbattuto nel tuo corso ( che ha molte meno visualizzazioni di quel che merita a mio giudizio) e un po' di luce è arrivata, il caos c'è stato quando ho tentato di ricostruire i passaggi di questi due ultimi video dove annida ora annida poi mi sono perso!!! ahahah piano piano ci riesco... A prescindere da tutto questo GRAZIE!
@NickTheGeek4 жыл бұрын
Grazie a te per seguirmi Paolo, in effetti in questi due video c'è grande uso di For e If annidati per mostrare come gestire soprattutto tabelle di dati; questo può sempre essere utile ma non sbatterci troppo la testa, casomai passa oltre e torna su questi in seguito
@droitaucoeur13 жыл бұрын
Ciao Nick. Io invece di utilizzare Activate, metterei l'istruzione With End With. Oppure Sheets("xxx").Cells.Clear.
@NickTheGeek3 жыл бұрын
Ciao Jacky, grazie.
@andreagiovannini28586 жыл бұрын
Ciao Nick, ottimo esercizio, con passaggi e strategie, non sempre intuitivi per non addetti ai lavori, ma perfettamente spiegati! Ho notato che con la riga di codice “Worksheets("Risultato").Activate” “Cells.Clearcontents” Nel foglio "Risultato",viene cancellata anche la riga con le intestazioni. Al riguardo ho attuato la soluzione che ripropongo qui di seguito, scritta subito dopo la dichiarazione delle variabili, di cui ti chiedo di confermarmi l’esattezza o l’eventuale soluzione da adottare in questi casi: Worksheets("Risultato").Select fine_risultato = Cells(Rows.Count, "a").End(xlUp).Row Range(Cells(2, 1), Cells(fine_risultato, 3)).ClearContents Grazie!
@NickTheGeek6 жыл бұрын
Ciao Andrea, grazie! Sì il codice che hai scritto va bene, non conosco altre soluzioni più pratiche per non considerare la prima riga. Forse funzionerebbe anche questa (come terza riga nel tuo codice che hai scritto): Rows("2:" & fine_risultato & """).ClearContents ma al momento non posso verificare. Ovviamente ti pulirebbe tutta la riga fino all'ultima colonna di destra, quindi devi assicurarti di non avere niente da mantenere nelle colonne successive.
@andreagiovannini28586 жыл бұрын
Ciao Nick, confermo il funzionamento della terza riga di codice che mi hai proposto in sostituzione alla mia. Ho dovuto solo ridurre da tre a due le virgolette che seguono la seconda &. Grazie!
@NickTheGeek6 жыл бұрын
ottimo! :)
@gianni_carboni4 жыл бұрын
Il video è assolutamente utilissimo come tutti quelli visti finora e ti rinnovo i miei ringraziamenti e complimenti, continuerò a guardare tutta la serie. L'unica cosa che mi viene da chiedere è: perché secondo te è opportuno agire in questo modo, metodo tra l'altro molto più affascinante e stimolante (per me), quando lo stesso risultato si può ottenere in pochi click con una noiosa ma efficace pivot? La mia non è una critica, eh. Sia ben chiaro. Io vengo da una formazione scolastica informatica e mi ritrovo perfettamente in questo mondo da te spiegato. Però, mi chiedo, a conti fatti, perché non usare una pivot? Visto che alla base dell'informatica c'è il concetto di efficienza, perché non preferire uno strumento altrettanto efficace ma che spende molte meno risorse?
@NickTheGeek4 жыл бұрын
Ciao Gianni, si poteva fare senz'altro con una pivot, ma l'obiettivo era quello di spiegare con un esempio relativamente semplice l'utilizzo combinato dei cicli e delle condizioni, in modo da poterlo replicare in altre situazioni più complesse in cui le pivot non sono utili.
Posso dare ad una variabile di una sub il contenuto di una cella compilata sul foglio di lavoro? Se si come?
@NickTheGeek3 жыл бұрын
Puoi dichiarare la variabile e poi assegnarle il valore; supponendo che sia integer: Dim var as Integer var = Range("A1")
@robertobraicovick68676 жыл бұрын
Grazie!
@lorenzomolin96384 жыл бұрын
Ciao Nicola, innanzitutto grazie per il corso che ritengo utilissimo per chi è a digiuno e anche per chi come me non usa programmazione dai tempi del turbo pascal o di db III +... volevo chiederti se, secondo te, non era meglio produrre una sub con passaggi logici tipo quelli mentali che useremmo per farlo a mano questo conteggio ... mi spiego meglio, usare un ciclo do while loop per scorrere dalla prima all'ultima riga finchè la riga selezionata non e' vuota. dichiarare delle variabili di conteggio che andranno azzerate al cambio provincia e via cosi ... che ne pensi? perchè io mi sono un po' perso durante il video ...
@lorenzomolin96384 жыл бұрын
Ho provato a scriverne una come me l'ha detta la testa ... cosi ... Sub conteggio_popolazione() Dim Num_comuni As Integer Dim Provincia As String Dim Totale As Long Dim i As Integer Dim j As Integer Worksheets("Origine").Activate i = 2 j = 2 Num_comuni = 0 Provincia = Cells(2, 2) Do While Cells(i, 1) "" Do While Cells(i, 2) = Provincia Num_comuni = Num_comuni + 1 Totale = Totale + Cells(i, 6) i = i + 1 Loop Worksheets("Risultato").Activate Cells(j, 1) = Num_comuni Cells(j, 2) = Provincia Cells(j, 3) = Totale Worksheets("Origine").Activate Provincia = Cells(i, 2) Totale = 0 Num_comuni = 0 j = j + 1 Loop Worksheets("Risultato").Activate End Sub che ne pensi Nicola?
@NickTheGeek4 жыл бұрын
Ciao Lorenzo, sicuramente si può fare in più modi; non ho provato la tua macro ma il tuo sistema è sicuramente più snello rispetto a quello che ho usato io.
@lorenzomolin96384 жыл бұрын
@@NickTheGeek ... l'unico dubbio che mi e' sorto strada facendo e ascoltando i tuoi tutorial utilissimi e fatti molto bene direi e' questo ... il mio metodo sara' forse piu' snello ma credo abbia un handicap su fogli molto grandi in quanto con il ciclo do while fai fare un controllo ad ogni riga e con for next invece non lo fai ... questo in termini di tempo dovrebbe incidere, ripeto su fogli di dimensioni ragguardevoli ... dico bene?
@NickTheGeek4 жыл бұрын
Non sono un esperto di algoritmi, ma nella tua macro hai due while con cui fai due controlli (che la riga non sia vuota e che la colonna B sia uguale a Provincia), mentre all'interno del mio ciclo For avevo messo una If che fa il confronto tra la provincia della riga attuale e quella della riga precedente, quindi è pur sempre una sola condizione da valutare, ma il controllo deve essere fatto sue due diverse celle (riga attuale e riga superiore); quindi alla fine credo che i due sistemi si equivalgano come tempi di esecuzione.
@riccardoonano16343 жыл бұрын
Ciao Nicola , vorrei utilizzare il comando "ultima_riga per poter scrivere nella successiva , vuota , il contenuto di un'altra cella ; ho fatto varie prove senza successo. Come devo fare ? Ti ringrazio anticipatamente..,......... complimenti , senza dubbio il miglior corso wba in rete, continua così
@NickTheGeek3 жыл бұрын
Ciao Riccardo, grazie per i complimenti. Cosa succede quando assegni un valore a ultima_riga? Ti dà errore? Non fa niente? Calcola una riga sbagliata? Di sistemi ce ne sono molti, io uso sempre quello che mostro al minuto 3:50, quindi utilizzando una colonna come riferimento per vedere qual è l'ultima cella scritta in quella colonna (in questo caso la A); potrebbe essere che nella tua formula usi una colonna che non è interamente compilata?
@riccardoonano16343 жыл бұрын
@@NickTheGeek per una parte del codice penso di aver fatto bene . Dopo aver assegnato alla variabile ultima_riga il valore cella(rows.count....etc, ho creato una nuova variabile , riga_vuota= ultima_riga+1 , poi ho scritto , riga_vuota = cella("C1") , ma non succede nulla.............cosa ho sbagliato?
@riccardoonano16343 жыл бұрын
In sostanza vorrei assegnare alla cella sottostante all'ultima riga il valore di una determinata cella, questo mi permette di fare un programma che giorno dopo giorno , mettendo la data , mi archivia i costi di trasporto delle merci. Così a fine mese ho il totale dei costi. Però ho un altro problema , quando arrivo alla riga del sabato mi deve generare in automatico la domenica senza dati, per poi riprendere il lunedì........ spero di essere stato chiaro...... grazie di tutto
@NickTheGeek3 жыл бұрын
Per quanto riguarda il primo problema, scrivendo: riga_vuota = ultima_riga + 1 riga_vuota = cella("C1") significa che prima assegni alla variabile riga_vuota il valore di ultima_riga incrementato di 1 (che è corretto), ma subito dopo sovrascrivi questo valore assegnando alla variabile riga_vuota il valore della cella C1. Non so in quale colonna della prima riga vuota vuoi scrivere il valore della cella C1, ma supponendo che sia la colonna A, allora al posto della seconda linea dovresti scrivere: Cells(riga_vuota, 1) = Range("C1") In questo modo utilizzi la variabile riga_vuota come indicatore di riga all'interno della proprietà Cells, per poter scrivere all'incrocio tra quella riga e la colonna A. Per quanto riguarda il problema della domenica, immagino che da qualche parte ci sia una colonna con la data di riferimento per quella riga, quindi dovresti utilizzare la funzione Weekday che ti restituisce il giorno della settimana di una certa data, ad esempio: Weekday("24/10/2021") ti restituisce il valore 1, che significa che il 24/10/21 è domenica. Senza vedere il file e il codice posso solo indovinare come funzioni il tutto, ma supponendo che la data sia nella colonna B, dopo aver scritto: riga_vuota = ultima_riga + 1 dovresti scrivere: If Weekday(Cells(riga_vuota, 2)) = 1 Then riga_vuota = riga_vuota + 1 End If E solo dopo scriverai: Cells(riga_vuota, 1) = Range("C1") In questo modo, se la colonna B (supponendo che sia quella che contiene la data) contiene una data che corrisponde a domenica, allora la variabile riga_vuota viene nuovamente incrementata di 1 (quindi di 2 rispetto alla variabile ultima_riga), e il valore di C1 viene scritto nella riga sottostante alla domenica. Non ho fatto prove quindi non so se così possa funzionare, ti consiglio di verificarlo su una copia del foglio originale, perché se non funziona potrebbe anche sballarti tutti i dati.
@riccardoonano16343 жыл бұрын
@@NickTheGeek grazie mille , funziona perfettamente , sono molto contento, mi manca un ultimo controllo per finire il lavoro . Che controllo IF devo fare per darmi un messaggio di errore se finito il mese non cambio foglio ? Esempio sto lavorando sul mese di febbraio poi erroneamente continuo a mettere dati di marzo anziché cambiare foglio. Ti ringrazio anticipatamente , questo e' il mio primo progetto in vba è sono molto contento.
@AB-fr8mi2 жыл бұрын
Ciao! Complimenti per il corso. Sto facendo grandi progressi grazie a questi video. La stringa di codice per contare le righe mi sta dando dei problemi. Con F8 mi riporta il conteggio uguale a zero. La parte cells(rows.count, "a") invece è corretta. Da cosa può dipendere?
@NickTheGeek2 жыл бұрын
Ciao, grazie per i complimenti. Senza vedere il file mi è difficile capire il problema, se vuoi prova a mandarmelo a nickthegeek.yt@gmail.com, spero di riuscire a guardarlo in tempi relativamente brevi.
@enricoenremi37135 жыл бұрын
Grazie di aver risposto, colgo lìocassione per esporti un problema che ho con il programma di questo video Nel ciclo For - Next j ,premesso che ho fatto tutti i tuoi passagi, mi si blocca alla somma_popolazione dandomi il messaggio " Errore definito dall'applicazione o dall'oggetto" Errero run time 1004. Non so cosa fare...poui aiutarmi???? Grazie in anticipo
@NickTheGeek5 жыл бұрын
è un errore piuttosto generico e potrebbe essere dovuto a molti motivi, sei certo di aver scritto il codice esattamente come nel video? I dati nel foglio Excel sono gli stessi (o almeno dello stesso tipo) che si vedono nel video?
@enricoenremi37135 жыл бұрын
@@NickTheGeek Grazie risolto, avevo saltato le parti finali del video. Grazie
@NickTheGeek5 жыл бұрын
perfetto, problema risolto :)
@robertobraicovick68676 жыл бұрын
Ciao Nick, nelle prove di questo esercizio, non capisco perché come somma della popolazione es: Agrigento=890832, Alessandria=839862 esattamente il doppio così via per tutte le righe. Ho letto e riletto il codice e non trovo l'errore. Secondo te (in base alla tua esperienza) dove potrebbe essere l'errore? Calcola che è tutto perfetto (nomi provincie, numero comuni… Scordavo buona domenica! :-)
@NickTheGeek6 жыл бұрын
Ciao Roberto, senza vedere il codice mi risulta difficile capire, normalmente potresti aver fatto fare due cicli di codice oppure essere partito da una situazione in cui i valori non erano a zero, però mi sembra strano.
@robertobraicovick68676 жыл бұрын
@@NickTheGeek Ho ricontrollato tutto mi sembra che l'errore parta dal primo foglio (Popolazione residente per comune...) Sotto la colonna Comune, ll'interno del Comune Agliè ci sono 2 Agliè, Airasca 2 Airasca, così fino alla fine... Praticamente devo aver fatto qualcosa all'inizio e si è riportato l'errore fino alla fine. Allora per non rifare tutto ho scritto: somma_popolazione = somma_popolazione + Cells(j, 6) / 2 così adesso va bene :-) Grazie Nick e scusami tanto se qualche volta rubo del tempo alle tue FANTASTICHE LEZIONI.
@NickTheGeek6 жыл бұрын
ottimo, complimenti per aver capito dov'era il problema e per averlo risolto :) grazie ancora per i complimenti e non preoccuparti, scrivi pure senza problemi
@manuelfighera96624 жыл бұрын
Provincia = cella (i-1,2). Row Cosa sta a indicare .row e quando si usa
@NickTheGeek4 жыл бұрын
Row è una proprietà dell'oggetto cella, e indica la riga dell'oggetto, ad esempio la cella A2 ha Row 2, mentre C1076 ha Row 1076. Stessa cosa per la colonna, per la quale puoi usare la proprietà Column. Si usano quando vuoi trovare la riga o la colonna di una particolare cella.
@aruannovincenzo3 жыл бұрын
Buongiorno prof. NickTheGeek, inserisco qui la macro sull'esercizio in questione. Ho avito il problema seguente: inseriva tutte le province valorizzate tranne l'ultima "Viterbo". per ovviare al problema ho dovuto aggiungere un +1 al calcolo dell'ultima riga al fine di ottenere un controllo sull'ultima riga, che andasse oltre l'ultimo comune di viterbo. Ho cercato di seguire anche il suo consiglio per evitare di attivare i fogli valorizzandoli direttamente, senza passare da "Activate". E' venuto fuori questo: Sub Risultato() Dim i As Long, j As Long, k As Long 'Dichiarazione di Variabili Dim ultimariga As Long, primariga As Long, rigacomuni As Long Dim conteggiocomuni As Long, sommapopolazione As Long Dim provincia As String 'Valorizzazione delle variabili ultimariga = Worksheets("Origine").Cells(Rows.Count, 1).End(xlUp).Row + 1 'Valore dell'ultima riga da analizzare (il +1 è stato inserito perchè _ senza non calcola l'ultima provincia "Viterbo" primariga = 2 'valore della prima riga da cui iniziare conteggiocomuni = 0 'Valore iniziale dei comuni k = 2 'Valore iniziale dell'iterazione su foglio origine 'Ciclo che calcola tutte le righe dell'intervallo For i = 3 To ultimariga If Worksheets("Origine").Cells(i, 2) Worksheets("Origine").Cells(i - 1, 2) Then 'La variazione avviene quando cambia la provincia (es. R 44 agrigento r 45 alessandria) provincia = Worksheets("Origine").Cells(i - 1, 2) 'attribuisce il valore della provincia da utilizzare per il calcolo rigacomuni = i - 1 'Valore della riga dei comuni (una riga precedente al cambio provincia) conteggiocomuni = rigacomuni - primariga + 1 'conteggio dei comuni per provincia sommapopolazione = 0 'reset della variabile sommapopolazione per calcolo su provincia successiva 'Ciclo che somma la popolazione dalla prima riga all'ultima riga della provincia For j = primariga To rigacomuni sommapopolazione = sommapopolazione + Worksheets("Origine").Cells(j, 6) 'somma il totale popolazione (es dalla riga 2 alla riga 44 per la prov di agrigento) Next j Worksheets("Risultato").Cells(k, 1) = provincia Worksheets("Risultato").Cells(k, 2) = conteggiocomuni Worksheets("Risultato").Cells(k, 3) = sommapopolazione k = k + 1 primariga = i End If Next i End Sub Grazie per i suoi preziosi insegnamenti. (ci sono commenti che possono risultare fastidiosi, ma mi permettono di capire cosa stia facendo la sub)
@NickTheGeek3 жыл бұрын
Ciao Vincenzo, hai ragione riguardo il problema di Viterbo, serve mettere il +1 nel ciclo For; me l'aveva già segnalato un utente con un commento che ho messo in primo piano in questo video; è stata una mia svista quando ho girato il video (non ho fatto sufficienti test). Per quanto riguarda l'utilizzo del nome dei fogli direi che va bene, anzi puoi attivarne uno inizialmente, e quindi evitare di richiamarlo ogni volta quando ci fai operazioni sopra; ad esempio, se all'inizio attivi "Origine", poi puoi anche non scrivere Worksheets("Origine")., perché è sottinteso dato che ti trovi già su quel foglio. Credo che funzioni, casomai fai un tentativo e fammi sapere per favore.
@aruannovincenzo3 жыл бұрын
@@NickTheGeek buongiorno, ho provato ad omettere l'oggetto worksheets("Valore"), nella subroutine che analizzava le vendite, riferita al video 26 "Ciclo for Each... Next". Posso confermarti che omettendo l'oggetto, purtroppo, inserisce i dati solo per l'istruzione che contiene worksheets("Valore"). Per le istruzioni seguenti, procede con il foglio selezionato (attivo) in quel momento. Deduco che l'istruzione worksheet(valore).activate evita di inserire l'oggetto, ma, ogni volta che bisogna passare da un foglio all'altro bisogna ricordarsi di attivare. spero di essere stato esaustivo nella descrizione delle operazioni svolte.
@NickTheGeek3 жыл бұрын
Sì il discorso è proprio questo: se metti sia activate sia il riferimento al foglio, è ridondante; se non metti nessuno dei due rischi un errore, perché il programma si riferisce al foglio attivo e quindi ad un certo punto potrebbe essere sbagliato; quindi per fare le operazioni su un foglio, o lo attivi e poi ometti il riferimento, oppure non lo attivi però poi devi sempre usare il riferimento.
@antoniodorso53266 жыл бұрын
anche la mia maestra di informatica ci fa usare excel