ciao non so se sei ancora attivo in questi commenti, comunque nella versione 2019 è cambiato molto, sto imparando con i tuoi tutorial ma la regola del "rimane la scelta del'oggetto su cui scrivere" non vale: se dopo aver scritto una directory in un foglio diverso da quello dell'oggetto vado per scrivere "Range..." il programma sceglie comunque l'oggetto, senza ricordarsi della directory della linea di codice precedente
Ciao, sì ci sono ancora; in realtà anche in Excel 2013 viene preso come riferimento il file/foglio attivo in quel momento; se ti riferisci al minuto 11:00 del video, quando inizio a scrivere il range, subito prima avevo cliccato il file 2 quindi l'istruzione range viene scritta in quel file, anziché nell'altro, e la linea precedente di codice non influisce sulla scelta del file/foglio in cui scrivere.
Grazie Nick. oggi ho iniziato a seguire il tuo corso per caso, ho già un po di dimestichezza con la programmazione, ma il percorso in auto di sta mattina ho deciso di guardare i primi 5 video, devo dire complimenti per la semplicità nella spiegazione e per avermi chiarito alcuni concetti. proseguirò il corso molto volentieri. grazie
Complimenti per le spiegazioni. Fino ad ora non avevo capito molto della sintassi del VBA. Adesso va un po meglio. Mi piacciono molto i commentoi con le Tue risposte molto dettagliate,peró spesso le richieste sono fuori tema corrente. Ci vorrebbe una sezione domande risposte. Mi piacerebbe se approfondisti questo titolo,perche poi sarebbe tutto piú chiaro per i meno esperti.
Grazie per i complimenti. Questo video è solo un'introduzione ai concetti di oggetto, proprietà e metodi; in realtà poi saranno usati in tutto il resto del corso, perché in pratica tutto VBA (almeno a livello base) ruota su questi tre concetti.
Ciao Nick, complimenti per la tua preparazione capacita' divulgativa. Se accetti i consigli, ti consiglierei di fare attenzione alla messa a fuoco della videocamera e di ingrandire al massimo la schermata in questione come fa ad esempio gerardo zuccala'. Complimenti, ciao grazie
Ciao Nick, grazie per i video che sono di grande utilità per chi come me sta facendo i primi passi su VBA. Mi devo chiarire un aspetto, nella finestra dei progetti, dal video, si vede che hai solo due VBAproject dove scrivi il codice. Io invece quando apro l'editor mi ci trovo molti più progetti che non posso utilizzare, il mio e un altro chiamato "funcres.xlam". Mi chiedo a cosa servono e perchè te non li hai ma soprattutto in quello chiamato "funcres.xlam" devo scrivere del codice oppure lo crea excel ed io non lo devo considerare? quando voglio scrivere del codice mi devo concentrare solo sul mio progetto? Grazie
Ciao Paolo, grazie a te per il commento. Nella finestra dei progetti, normalmente, ci sono solo i file che in quel momento sono aperti; ad esempio, nel mio video ne avevo due aperti e quindi li vedi entrambi nella lista. Tutti i file con estensione xlam sono componenti aggiuntivi, che tu o chi altri ha accesso al computer potrebbe aver installato in passato; non modificarli né rimuoverli da lì, semplicemente sappi che non sono file da utilizzare per le macro. Quindi scrivi sempre il tuo codice solo all'interno dei "veri" file di Excel (xls o xlsm).
@@NickTheGeek Grazie per il chiarimento, ma li posso spostare? nel senso "il file funcres.xlam" è posizionato sotto i miei file xlsm, lo posso riposizionare sopra? semplice curiosità Grazie ancora
Non ho un caso sottomano e quindi non posso provare, ma non credo si possano spostare, normalmente nella finestra dei progetti puoi solo copiare moduli da un file all'altro.
Ciao Nick, volevo chiederti una cosa: come mai se scrivo una riga del tipo [Sheets("Foglio2").Range("A1").] dopo il punto non compare l'elenco delle proprietà e metodi di range mentre se scrivo una riga del tipo [Sheets("Foglio2").Select / Range("A1").] dopo il punto compare l'elenco?
Ciao, non saprei qual è il criterio, anche a me qualche volta non compare l'elenco dopo il punto, se non compare posso solo suggerirti di premere Ctrl + Spazio.
Bellissimo e utilissimo argomento ))) Considero quasi un errore degli sviluppatori di excel-vba questo sistema dove se prima specifichi una sorta di gerarchia poi lui la prosegua anche dopo senza specificarla . Avrei preferito un sistema piu' "ignorante" del tipo " se la specifico ok " altrimenti mi lavora poi sempre sul file/foglio selezionato . E' solo una mia riflessione , sicuramente ignoro io altre cose quindi è giusto come hanno fatto . Comunque è un argomento piu' che importante e basilare , complimenti ancora
Intendi il passaggio alla fine quando faccio il clear contents senza specificare tutto il percorso? In questo caso funziona con il sistema "ignorante" che hai detto tu, cioè in quel momento è attivo il foglio 2 del file "Corso VBA", quindi mi pulisce la cella A1 di quel foglio in particolare. Se avessi voluto pulire un altro foglio avrei dovuto scrivere tutto il percorso, ma dato che in quel momento è attivo quello, non ho avuto bisogno di scriverlo e sono partito direttamente da Range. Fammi sapere se era questo che intendevi.
Ho confuso forse una tua frase , quando scrivi tutto il percorso completo dove volevi che ti scrivesse il dato . In quel caso comunque avevi attivato manualmente quel file , quindi avrebbe continuato a lavorare sempre in quello anche senza il percorso . Spero di non aver confuso altre cose nel frattempo :D
Esatto, se non specifichi il file/foglio allora ti considera per buono il foglio attivo in quel momento; se devi fare operazioni su un foglio diverso da quello attivo, allora metti il percorso intero (oppure attiva il foglio e poi scrivi le istruzioni senza percorso).
Ciao Nick, un piccolo aiuto per favore: Quale codice devo scrivere per avere il numero del foglio che sto lavorando da MsgBox? (Avendo una 20 di fogli aperti (uno per ogni tua lezione che sto seguendo fino adesso)) esempio con questo mi dice il totale dei fogli attivi: MsgBox (Worksheets.Count), vbOKOnly, "Fogli aperti" ma io vorrei sapere il foglio su cui scrivo qual è … spero di non essere stato troppo casinista a porti la domanda :-)
Ciao, scrivo l'istruzione Application.Workbooks("Cartel2.xlsm").Worksheets("Foglio3").Range("c3") = "vba2" ma mi restituisce errore di run-time 9, come mai? come lo risolvo? Grazie
Ciao, normalmente quell'errore significa che Excel non riesce a trovare un oggetto. Verifica di avere, nella stessa cartella del file contenente la macro, un file che si chiama Cartel2.xlsm, e al suo interno un foglio che si chiama Foglio3.
sto cercando di imparare qualcosa sul VBA grazie alle tue lezioni; al di là dei dovuti complimenti per la chiarezza delle tue spiegazioni ti chiedo a proposito di questa lezione n. 5: se due cartelle o due file non sono nella stessa directory ma in diverse directory, occorre cambiare il percorso nella macro ?
Ciao, grazie per i complimenti. Se devi fare riferimento a un file in un'altra directory, prima di tutto devi aprire il file usando il percorso completo. Ad esempio: Set wb = Workbooks.Open("C:\test\prova.xlsm") wb.Worksheets("Foglio1").Cells(1, 1) = "vba" Con la prima linea apri il file, con la seconda scrivi in una sua cella (usando il riferimento "wb" impostato con il Set nella prima linea).
Carissimo Nick, le devo fare i miei complimenti per la semplicità e la chiarezza nello spiegare un linguaggio di programmazione complesso come VBA per Excel. Devo però chiederLe una precisazione : all'inizio del 5° video (Oggetti, proprietà e metodi), si vede che ci sono due progetti (Corso VBA e Corso VBA.2), ma non ho visto come Lei abbia creato il secondo progetto (Corso VBA.2). Mi potrebbe spiegare come lo posso inserire , passo per passo ? ( Penserà che sia una cosa banalissima, e forse lo è, ma ho sentito parlare ( se non mi sbaglio ) di un secondo file ( magari mi sbaglio ), mentre io vedo solo una cartella di lavoro con tre fogli. Avrei bisogno di questa spiegazione, per poter andare avanti con i video, per favore, il prima possibile. Grazie.
Ciao Alessandro, grazie per i complimenti. Non so se ho ben capito il problema, ma il progetto "Corso VBA 2" è semplicemente un altro file Excel che ho creato assegnandogli l'estensione xlsm, quindi lo puoi creare come qualsiasi altro file di Excel. Per quanto riguarda la cartella di lavoro, per Excel è un sinonimo di file, quindi uso i due termini in modo intercambiabile durante i miei video. Fammi sapere se sono stato chiaro e se era questo che volevi sapere.
Un video non riesco; posso provare a spiegarti a parole, ma se sei riuscito a creare il file dove scrivere il codice (cioè il file Corso VBA.xlsm) il processo è esattamente identico: 1) apri Excel 2) scegli di creare un nuovo file (la procedura può variare a seconda della versione di Excel, ma di solito c'è un pulsante o un'icona con scritto "Nuovo") 3) scegli il menu "File" e quindi la voce "Salva con nome" 4) scegli il percorso dove salvare il file (ad esempio il desktop) 5) nello spazio "Nome file" scrivi il nome con cui vuoi salvare il file, in questo esempio "Corso VBA 2" (senza virgolette) 6) nello spazio "Salva come" apri il menu a tendina e scegli l'estensione xlsm 7) premi Salva Aprendo entrambi i file, li vedi entrambi come progetti. Fammi sapere se riesci
@@NickTheGeek Carissimo signor Nick. Penso di esserci riuscito. Devo solo provare , appena torno a casa dal mio lavoro. Eventualmente, visto che Lei è stato così gentile e preciso nelle spiegazioni, se avrò qualche altro problema, La disturberò ancora. Per il momento La ringrazio moltissimo.
ho deciso di cambiare strategia, praticamente da ogni file scheda inserisco delle macro che vanno a modificare il record del report. cosicche devo aprire il file scheda da aggiornare ed il file report e non tutti i 500 files scheda. qual'e' il comando che mi permette di aprire un file excel da macro vba ? con questo comando attivo un file excel gia aperto: Workbooks("Scheda_guasto_01705_num.1.xlsm").Activate se al posto di inserire il nome esplicito del file volessi usare una variabile come posso fare ?
Per aprire il file non funziona il comando che avevi scritto nella tua macro? Tipo Workbooks.Open Filename:=("LISTA PARZIALE (2).xlsm")? Quando chiedi della variabile, intendi per fare un ciclo FOR? I nomi dei file sono tutti sequenziali oppure i nomi possono essere molto diversi tra di loro?
utilizzerei lo stesso sistema che hai usato nella tua macro precedente, cioè scrivendo i nomi di tutti i file in una colonna, e poi fare un ciclo FOR per aprirli uno alla volta e fare le operazioni che servono in ciascuno di essi. Ad esempio, se il file che contiene nella colonna A i nomi dei file si chiama principale.xlsm, e supponendo che i file siano nella cartella C:\test: ultima_riga = Cells(Rows.Count, 1).End(xlUp).Row For i = 1 To ultima_riga Workbooks("principale.xlsm").Activate nome_file = Cells(i, 1) Workbooks.Open FileName:=("C:\test\" & nome_file) ... Next i all'inizio verifico qual è l'ultima riga scritta nella colonna A del foglio, quindi faccio un ciclo assegnando ogni volta un nome diverso (prendendolo dalla colonna A), apro il file e faccio le operazioni che servono (i tre puntini), quindi passo a quello successivo e faccio lo stesso
Ciao Giovanni. Prima devi attivare il riferimento a Powerpoint all'interno di VBE: Strumenti --> Riferimenti --> seleziona Microsoft PowerPoint 16.0 Object Library (il numero varia in base alla versione di Office) --> premi OK. Poi il codice per aprire il file potrebbe essere questo: Dim app As PowerPoint.Application Dim pres As PowerPoint.Presentation Set app = New PowerPoint.Application Set pres = app.Presentations.Open("D:\test.pptx")
Ciao Nick, ma non hai detto che Activate si usa solo per UNA cella mentre per più celle si usa Select? Invece tu per un intervallo (quindi più celle) hai usato sempre Activate! ?
@@NickTheGeek scusami Nick ma non capisco, nel senso che io ho un solo progetto aperto cosi come appare alla fine del video precedente sugli intervalli ed ora che son passato al video sugli oggetti ho notato che tu l'avevi gia presente ma io non so come fare... (Scusa la mia ignoranza in materia)
Nessun problema. Ho solo creato un altro file Excel che ho chiamato Corso VBA 2, poi l'ho aperto normalmente con un doppio clic sul file, e quindi quando ho aperto la finestra dell'editor di VBA erano già presenti entrambi in alto a sinistra nella finestra dei progetti. Fammi sapere se è tutto chiaro.
Un suggerimento su come migliorare le prestazioni di ricerca in vb ? Incrocio 100.000 righe con altre 100.000 righe (Per evitare i cerca vert), con doppio ciclo for ma ci mette un ora... soluzioni?
Mi fai un esempio di che tipo di ricerca devi fare e che tipo di dati devi estrarre? Ad esempio devi cercare un certo elemento in una certa colonna e quindi ottenere tutti gli altri elementi nella stessa riga?
@@NickTheGeek Ciao, molto semplice e banale...scorro i dati di una colonna del foglio A e per ogni dato cerco lo stesso valore in una colonna del foglio b... praticamente un cercavert..... Ho usato 2 cicli for..ma su 1000 righe in entrambi i fogli ci mette troppo....su 80.000 righe si imballa..... poi ieri notte ho provato la funzione find.....quindi primo ciclo for per scorrere i valori della del foglio 1 e il metodo find sui valori del foglio b..... È nettamente più veloce..solo che è difficile gestire la funzione find...perché a valore trovato dovrei fare delle operazioni su valori di altre colonne ma della stessa riga trovata.... Per ogni valore della colonna a del foglio 1 devo cercare lo stesso valore nella colonna a del foglio due...se lo trovo.allora sommo il valore della colonna b della stessa riga al valore della colonna b del foglio2... E poi gestire se trova più valori se nn li trova ecc ecc... Con i cicli for scorro tutto e ho tt i puntamenti alla riga/ colonna... ma ci mette 5 ore.... o velocizzo i cicli for ma nn so.come fare...(indici?? Come.nei db?) O uso altri moduli (Come la find).... Ricordo il foglio1 sarà sempre variabile... il foglio 2 è una raccolta di dati fisso (parametri da sommare) ma di 80.000 righe.... grazieeeee non so se mi hai capito
Con il Find puoi usare la proprietà Row per sapere quale riga è stata trovata, ad esempio, all'interno del ciclo For che scorre tutti i valori della colonna A del foglio1: Sheets("Foglio2").Select Columns("A:A").Select riga_foglio2 = Selection.Find(valore_da_cercare).Row 'il valore_da_cercare sarà quello della colonna A del Foglio 1, preso di volta in volta dal primo ciclo For addendo_foglio2 = cells(riga_foglio2, 2) 'valore della colonna B del foglio2, da sommare a quello corrispondente nella colonna A del foglio 1 Però poi per gestire anche più valori trovati la cosa si fa più complessa, perché dovresti usare una variabile per tenere traccia della riga a cui sei arrivato nel foglio2, e ripartire con il Find dal valore di quella riga + 1
@@NickTheGeek si appena rientro faccio prove... mi confermi che cmq le varie istruzioni variano dalle varie versioni del pacchetto office? Perché alcune sintassi che ho trovato del find nn andavano... cmq confermi che nn dovrebbe esserci ottimizzazione tipo indici... doppio ciclo for su tante righe è deleiterio.. no?
Non mi risulta che ci sia la possibilità di indicizzare le tabelle di Excel; per quanto riguarda le istruzioni penso siano sempre retro compatibili, quindi se usi Office dalla versione 2010 in poi il Find dovrebbe funzionare sempre allo stesso modo, eventualmente con aggiunte successive; forse con il 2007 ci sono problemi, e di sicuro ce ne possono essere con Office per Mac; casomai fammi sapere esattamente con quale sintassi hai problemi. Il doppio ciclo for sicuramente rallenta molto, eventualmente prova a dichiarare tutte le variabili che usi, se non l'hai già fatto.
Ciao, a un certo punto nel video scrivi : Range("a1").Value="Nicola" Ma qual è la differenza rispetto a scrivere Range("a1")="Nicola", quindi senza la proprietà Value?
Ciao Mario, tra i due esempi non c'è nessuna differenza pratica; gli oggetti più comuni hanno tutti una proprietà "di default" che è quella che viene sottintesa se non viene scritta, ad esempio per Cells e Range la proprietà di default è Value. Quindi non c'è differenza tra le due scritture; formalmente però sarebbe meglio sempre esplicitare la proprietà (quindi scrivere Range("A1").Value = ...), anche per evitare possibili errori di assegnazione: ad esempio, se dichiari una variabile intervallo come Range, e provi a scrivere così: Dim intervallo as Range Set intervallo = Range("a2:c2") non ti dà errore, perché giustamente stai assegnando un range (quindi a2:c2) alla variabile intervallo; se invece scrivi così: Dim intervallo as Range Set intervallo.Value = Range("a2:c2") ti dà errore, perché stai tentando di assegnare alla variabile intervallo più di un valore (cioè tutti i valori contenuti nelle celle a2:c2)
Buonasera sto seguendo il corso Wba e al video n° 4 degli oggetti mi sono fermato dome metti tutti i vba nella stessa pagina quando fai alt f11 es vba1 e vba2 a me excel 2016 non lo fa fare mi sai dire come si fa grazie mille
@@NickTheGeek buonasera all'inizi del video 4 quanto metti nel vba duecorso vba 1 e 2 a me non riesco a farlo non ho capito come ai fatto grazie per la tua disponibilità
Ah ok, quindi intendi nel video 5 (cioè questo): se apri due file excel ed entri nell'editor VBA di uno qualsiasi dei due, vedi entrambi i file in quella finestra; non ho Excel 2016 ma dovrebbe funzionare nello stesso modo.
Nessun disturbo, però non riesco a esserti utile; quindi se hai due file excel aperti e vai nell'editor di VBA, quanti ne vedi in quella finestra in alto a sinistra? Solo uno oppure nessuno?
Ciao Nick, bel Corso in video complimenti finalmente riesco a capire qualcosa del VBA e ti ringrazio, ho una domanda ma se io ho delle caselle piene ad es. da A1 a L40 nel Foglio 1 è li vorrei portare nel foglio 3 come funziona ci sto provando da un bel po di tempo ma non ci riesco.
Ciao Renato, grazie per i complimenti. In questi casi (cioè quando vuoi riprodurre in VBA una serie di operazioni facilmente eseguibili in Excel), ti consiglio di registrare una normale macro facendo quelle operazioni, e vedere qual è il codice che ne viene fuori. Sarà qualcosa del tipo: Sub copiaincolla() Sheets("Foglio1").Select Range("A1:L40").Select Selection.Copy Sheets("Foglio3").Select Range("A1").Select ActiveSheet.Paste End Sub Detto in italiano, seleziona il foglio1, seleziona l'intervallo che ti interessa, copia il contenuto della selezione, seleziona il foglio3, seleziona la cella A1 (del foglio attivo in quel momento, cioè il foglio3), incolla. Fammi sapere, ciao.
@@ThePero3067 Sì potresti fare anche così, se è già selezionata una cella all'interno dell'intervallo che ti interessa (in questo caso una cella qualsiasi nell'intervallo A1:L40) ; se invece non sei sicuro di dove sia la selezione in quel momento, con Range("A1:L40").Select prendi comunque tutto l'intervallo.
Buongiorno vorrei capire come fare a scrivere su un foglio l ultimo contenuto scritto di una colonna di un altro foglio considerando che ci possono essere anche celle vuote. Grazie
Ciao, devi innanzitutto calcolare l'ultima riga scritta nel foglio: ultima_riga = Cells(Rows.Count, "A").End(xlUp).Row Funziona anche se ci sono celle vuote nella colonna A, o intere righe vuote. Quindi assegni a una variabile il contenuto della cella che ti interessa, ad esempio se si trova nella colonna "E": contenuto_da_copiare = Cells(ultima_riga, 5) Infine ti sposti nell'altro foglio e assegni il valore alla cella che ti interessa, ad esempio se fosse la cella A1 del Foglio2: Sheets("Foglio2"). Activate Cells(1,1) = contenuto_da_copiare
CIAO, RIESCO FACILMENTE A LEGGERE DELLE CASELLE DA 500 FILE EXCEL E COMPILARE UN REPORT, MA L'OPERAZIONE INVERSA DI LEGGERE UNA COLONNA DEL REPORT E MODIFICARE I DATI DEI 500 FILE, MI IMPIEGA UN SACCO DI TEMPO , APRENDO TANTI FILE . C'E' UN METODO VELOCE PER FARE QUESTA SECONDA OPERAZIONE ?
Ciao, non saprei se ci sono metodi più semplici perché non mi è mai capitato di avere a che fare con così tanti file; il report è un altro file Excel? Supponendo di sì: le operazioni che fai per leggere sono: apri uno dei 500 file --> copi il dato --> incolli il dato nel report --> chiudi il file --> per 500 volte? le operazioni che fai per scrivere sono: copi il dato dal report --> apri un file --> incolli il dato nel file --> salvi e chiudi il file --> per 500 volte?
Sub REPORT() Dim i As Integer Dim nomefile As String Dim DA_RIGA As Integer Dim A_RIGA As Integer Dim colonna As Integer DA_RIGA = Cells(2, 6) A_RIGA = Cells(2, 7) For i = DA_RIGA To A_RIGA nomefile = Cells(i, 1) colonna = 2 'numero progressivo Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA RT'!C3 " colonna = 3 'CDC Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA RT'!C17 " colonna = 4 'Localita' Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA RT'!C18 " colonna = 5 'RT Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA RT'!A1 " If Cells(i, colonna) = 0 Then Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA RT'!D1 " Else: End If colonna = 6 'MARCA Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA RT'!C9 " colonna = 7 'MODELLO Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA RT'!C11 " colonna = 8 'SN Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA RT'!C13 " colonna = 9 'MATRICOLA RW Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA RT'!C15 " colonna = 10 'CAS Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA CAS'!A1 " If Cells(i, colonna) = 0 Then Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA CAS'!D1 " Else: End If colonna = 11 'GUASTO 1 Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA RT'! F14 " variabile = Cells(i, colonna) If variabile = "INDIPENDENTE" Then Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA RT'!F15 " Else: End If colonna = 12 'GUASTO 2 Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA RT'!F28 " colonna = 13 'GUASTO 3 Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA RT'!F38 " colonna = 14 'RIPARAZ 1 Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA CAS'!F14 " variabile = Cells(i, colonna) If variabile = "INDIPENDENTE" Then Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA CAS'!F15 " Else: End If colonna = 15 'RIPARAZ 2 Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA CAS'!F28 " colonna = 16 'RIPARAZ 3 Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA CAS'!F36 " colonna = 17 'ESITO Cells(i, colonna) = "='F:\REPORT 1\[" & nomefile & "]SCHEDA CAS'!A36 " Next i End Sub con questa macro leggo la colonna a1 dove ho la lista dei file ( ottenuta con il comando dos dir > lista.txt ed importata nel report). i files sono schede excel con i campi vari cdc, progressivo, nome localita' ecc che una volta importati posso ordinare con la funzione 'filtro di excel". diciamo che questa operazione mi riesce bene alla prima esecuzione, alla seconda esecuzione ho qualche messaggio di errore, che ho rimediato creando nuove schede report,.... ma non e' un problema. il problrma e' la macro inversa, in cui devo incominciare aprendo i file excel(schede) a mano o al limite preparando dei file bat da fare eseguire a cmd , un po macchinoso. questa e' la funzione inversa che mi da filo ta torcere: Sub ESITO() Dim i As Integer Dim nomefile As String Dim DA_RIGA As Integer Dim A_RIGA As Integer Dim colonna As Integer Dim var1 As String DA_RIGA = Cells(3, 17) A_RIGA = Cells(5, 17) colonna = 17 'nella colonna 17 ho gli esiti da cambiare nelle schede(files esterni excel) For i = DA_RIGA To A_RIGA 'Workbooks("F:\REPORT 1\LISTA PARZIALE (2).xlsm").Open 'Workbooks.Open Filename:=("LISTA PARZIALE (2).xlsm"), ReadOnly:=False Application.Workbooks("LISTA PARZIALE (2).xlsm").Worksheets("report").Range("P1") = Cells(i, colonna) pippo = Range("P1") 'nella prima colonna ho i nomi files(schede exceld i files esterni) nomefile = Cells(i, 1) 'Application.Windows(nomefile).Activate Workbooks(nomefile).Open , ReadOnly:=False Application.Workbooks nomefile .Worksheets("SCHEDA CAS").Range("C36") = pippo Workbooks(nomefile).Close Next i End Sub @@NickTheGeek
Sub oggetti() Workbooks("Cartel1.xlsm").Sheets("Foglio1").Range("a4") = "VBA3" Workbooks("Cartel1.xlsm").Sheets("Foglio1").Range("e5") = "VBA4" Range("c5") = "VBA5" End Sub Ho scritto queste righe di codice il Modulo e' all'interno del File VBA2. Da quello che ho capito dovrebbe scrivere i testi sempre nella cartella Cartel1. Invece l'ultima istruzione la scrive nel foglio VBA2 (cioe' quello dove ho inserito il Modulo).
Adesso non riesco a riprodurre il caso, ma penso che nel video succeda il contrario perché al min 10:28 passo all'editor VBA direttamente dal file VBA2, quindi ha tenuto come attivo il file VBA2; se non lo selezioni manualmente (né lo fai selezionare tramite codice VBA), allora è corretto che la terza riga del tuo codice te la scriva sul foglio attivo del file in cui è presente il modulo.
@@NickTheGeek infatti c'è questa differenza: nel video effettua la scrittura di default nell'ultimo foglio specificato. Mentre nel mio programma torna al foglio collegato al modulo di istruzioni.