|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, con queste 2 macro
Sub Copia_Filtrato()
Sheets("Foglio4").Select Call Seleziona_Filtrato_per_copia Sheets("Foglio1").Select Range("B25").Select ActiveSheet.Paste Application.CutCopyMode = False Sheets("Foglio3").Select Call Seleziona_Filtrato_per_copia Sheets("Foglio1").Select Range("B50").Select ActiveSheet.Paste Application.CutCopyMode = False Sheets("Foglio2").Select Call Seleziona_Filtrato_per_copia Sheets("Foglio1").Select Range("B75").Select ActiveSheet.Paste Application.CutCopyMode = False End Sub
Sub Seleziona_Filtrato_per_copia()
Uriga = Range("A" & Rows.Count).End(xlUp).Row Set Area = Range("A1", Range("AR" & Uriga)).SpecialCells(xlCellTypeVisible) Area.Select Selection.Copy Set Area = Nothing End Sub
incollo in Foglio1 un Range di tabelle filtrate di lunghezza variabile copiato dagli altri 3 fogli di lavoro, Foglio4, 3, 2, del file.
Il problema che devo risolvere è questo: dovendo lavorare in parecchi file in cui i nomefoglio e il numerofoglio cambiano continuamente in seguito all' importazione di fogli di dati da altri file, dovrei disporre di una macro che trattasse i nomefoglio e il numerofoglio in generale, più precisamente con questo concetto: anziché Sheets("Foglio4").Select Call Seleziona_Filtrato_per_copia Sheets("Foglio1").Select
Sheets("Ultimofogliodelfile").Select Call Seleziona_Filtrato_per_copia Sheets("Primofogliodelfile").Select etc.
E' un'operazione possibile? Grazie infinite per la soluzione eZio
|
|
|
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
Sub Copia_Filtrato() aggiungi x = Sheets.Count Sheets(x).Select 'riga ta togliere -----'Sheets("Foglio4").Select Call Seleziona_Filtrato_per_copia Sheets(1).Select ' da togliere ----------Sheets("Foglio1").Select Range("B25").Select ActiveSheet.Paste Application.CutCopyMode = False Sheets("Foglio3").Select Call Seleziona_Filtrato_per_copia Sheets("Foglio1").Select Range("B50").Select ActiveSheet.Paste Application.CutCopyMode = False Sheets("Foglio2").Select Call Seleziona_Filtrato_per_copia Sheets("Foglio1").Select Range("B75").Select ActiveSheet.Paste Application.CutCopyMode = False End Sub
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, chiedo scusa, ma sicuramente il mio "concetto" di cui sopra era troppo... ermetico: quell' etc. suonava come una poesia di Ungaretti :-\\ In realtà il mio problema Sheets("Ultimofogliodelfile").Select Call Seleziona_Filtrato_per_copia Sheets("Primofogliodelfile").Select etc.
dev'essere rapportato con la macro, più chiaramente: Sheets("Ultimofogliodelfile").Select Call Seleziona_Filtrato_per_copia Sheets("Primofogliodelfile").Select Range("B25").Select ActiveSheet.Paste Application.CutCopyMode = False Sheets("Penultimofogliodelfile").Select Call Seleziona_Filtrato_per_copia Sheets("Primofogliodelfile").Select Range("B50").Select ActiveSheet.Paste Application.CutCopyMode = False Sheets("Terzultimofogliodelfile").Select Call Seleziona_Filtrato_per_copia Sheets("Primofogliodelfile").Select Range("B75").Select ActiveSheet.Paste Application.CutCopyMode = False etc. fino a Sheets("Secondofogliodelfile").Select Call Seleziona_Filtrato_per_copia Sheets("Primofogliodelfile").Select Range("B??").Select (*) ActiveSheet.Paste Application.CutCopyMode = False Chiedo assai (ma assai...) scusa per la vaghezza della mia esposizione in apertura del thread :-(( [a volte sono una FRANA..................] Per mia fortuna il codice che mi hai scritto mi è servito per risolvere un altro problema, del quale non riuscivo a trovare la soluzione... :-))
Grazie infinite, buon pomeriggio eZio
EDIT: (*) questo in realtà è un problema che dovrò risolvere, ma ho già a disposizione una tua macro che lavora per incollare un range a n righe dall'ultima riga scritta... per cui non volevo abusare della tua immensa Pazienza :-))
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, nell' EDIT del post precedente accennavo ad un problema di posizionamento progressivo delle tabelle via via incollate dai fogli del file nel Primofogliodelfile: problema risolto con le 2 macro seguenti, la 1^ per il primo posizionamento (quello incollato da Ultimofogliodelfile), la 2^ per il posizionamento progressivo delle tabelle incollate dagli altri fogli del file.
Sub Seleziona_Filtrato_per_copia1() Uriga = Range("A" & Rows.Count).End(xlUp).Row Set Area = Range("B1", Range("DU" & Uriga)).SpecialCells(xlCellTypeVisible) With Sheets("Primofogliodelfile") Uriga2 = .Range("a" & Rows.Count).End(xlUp).Row + 5 End With Area.Copy Destination:=Sheets("Primofogliodelfile").Cells(Uriga2, 2) Set Area = Nothing End Sub
Sub Seleziona_Filtrato_per_copia2() Uriga = Range("A" & Rows.Count).End(xlUp).Row Set Area = Range("B1", Range("DU" & Uriga)).SpecialCells(xlCellTypeVisible) With Sheets("Primofogliodelfile") Uriga2 = .Range("b" & Rows.Count).End(xlUp).Row + 5 End With Area.Copy Destination:=Sheets("Primofogliodelfile").Cells(Uriga2, 2) Set Area = Nothing End Sub
Pertanto la traccia delle istruzioni della macro-dima diventa:
Sheets("Ultimofogliodelfile").Select Call Seleziona_Filtrato_per_copia1 Sheets("Penultimofogliodelfile").Select Call Seleziona_Filtrato_per_copia2 Sheets("Terzultimofogliodelfile").Select Call Seleziona_Filtrato_per_copia2 etc. fino a Sheets("Secondofogliodelfile").Select Call Seleziona_Filtrato_per_copia2
Grazie infinite per l'attenzione, buona giornata eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve con la premessa che non conosco il layout dei foglio del tuo file, dovrebbe essere sufficiente questo: primo foglio del file : Sheets(1).select secondo foglio del file : Sheets(2).select ultimo foglio del file: Sheets(Sheets.Count).Select penultimo foglio del file : Sheets(Sheets.Count-1).Select terzultimo foglio del file: Sheets(Sheets.Count-2).Select saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, a10n11 ha scritto:salve con la premessa che non conosco il layout dei foglio del tuo file, dovrebbe essere sufficiente questo:
primo foglio del file : Sheets(1).select secondo foglio del file : Sheets(2).select ultimo foglio del file: Sheets(Sheets.Count).Select penultimo foglio del file : Sheets(Sheets.Count-1).Select terzultimo foglio del file: Sheets(Sheets.Count-2).Select saluti Giap "dovrei" (condizionale d'obbligo) avere risolto con questa macro '------------ Dim I As Integer X = Sheets.Count Sheets(X).Activate Application.Run "Seleziona_Filtrato_per_copia1" For I = (X - 1) To 1 Step -1 Sheets(I).Activate Application.Run "Seleziona_Filtrato_per_copia2" Next I End Sub Provata su diversi file con numero e nomefoglio diversi, funziona... Grazie assai, buon pomeriggio eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
aetio ha scritto:Ciao, "dovrei" (condizionale d'obbligo) avere risolto con questa macro '------------ Dim I As Integer X = Sheets.Count Sheets(X).Activate Application.Run "Seleziona_Filtrato_per_copia1" For I = (X - 1) To 1 Step -1 Sheets(I).Activate Application.Run "Seleziona_Filtrato_per_copia2" Next I End Sub Provata su diversi file con numero e nomefoglio diversi, funziona... Grazie assai, buon pomeriggio eZio salve La tua macro passa in rassegna tutti i fogli della cartella non mi pareva che fosse questo il tuo intendimento. saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, a10n11 ha scritto: La tua macro passa in rassegna tutti i fogli della cartella non mi pareva che fosse questo il tuo intendimento.
La macro deve trasferire i dati selezionati con le 2 macro da tutti i fogli del file al 1° foglio in modo ordinato (una sorta di riepilogo generale). Il problema è dato dal fatto che i file hanno di volta in volta numero di fogli e nomefoglio diversi, per cui bisogna avere a disposizione una macro che li tratti in modo generico, ma nel contempo faccia tutto il lavoro richiesto... Sicuramente quell'inopportuno etc. ha fuorviato di parecchio la comprensione. Ma senza il suo aiuto, in ogni caso, non sarei MAI riuscito ad inquadrare il problema... Grazie assai e buo pomeriggio eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, resuscito questo thread per chiedere lumi su un dettaglio tecnico: questa macro
'-------------------- Dim I As Integer X = Sheets.Count Sheets(X).Activate Application.Run "Seleziona_Filtrato_per_copia1" For I = (X - 1) To 1 Step -1 Sheets(I).Activate Application.Run "Seleziona_Filtrato_per_copia2" Next I End Sub
se viene eseguita su alcuni PC funziona alla perfezione, ma se viene eseguita su alcuni altri NO. Il problema che ho riscontrato è che I = 1 non è sempre effettivamente il 1° foglio ma di fatto è accodato ad altri "oggetti" aperti, ma invisibili sul desktop (es. i file PERSONAL o XLSTART etc.) e se anziché scrivere 1 scrivo 2 o 3 a seconda del pc (causa S.O.??) la macro si esegue correttamente. Il sistema più "canonico" sarebbe quello di nominare i file col loro nome, o con l'istruzione ActiveWorkBook.Name ma, con tutta franchezza, io mi perdo in quell'oceano... :-)) Come andrebbe riscritta la macro affinché quella I = 1 sia effettivamente riconosciuta dal sistema in modo universale? Grazie infinite, anche per la pazienza. Buona giornata eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve nella cartella Xlstart normalmente vengono inseriti file che si vogliono aprire automaticamente all'esecuzione di excel. Il file Personal normalmente serve per inserire macro da utilizzare in qualsiasi file di excel aperto ( anche se io preferisco inserirle in file Xla come componente aggiuntivo nella cartella Startup) per risolvere il tuo problema, (sempre sia chiara la lattura di quanto hai esposto), basta far puntare la macro alla cartella corretta con una istruzione del tipo: with worbooks xxxx e sotto metti la tua porzione del codice saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, a10n11 ha scritto: per risolvere il tuo problema, (sempre sia chiara la lattura di quanto hai esposto), basta far puntare la macro alla cartella corretta con una istruzione del tipo: with worbooks xxxx e sotto metti la tua porzione del codice
chiedo conferma: se la cartella ha questo percorso C:\Documents and Settings\User\Documenti\LAVORO_1\Cartella1 sarà sufficiente scrivere with workbooks Cartella1? anche se la macro risiede in un file dal percorso diverso? Facendo un ragionamento in generale: non è possibile dare istruzione al SO di essere in presenza di un riferimento relativo, al pari di quello che è possibile dare nei codici del Range (con o senza $)? In villano volgare, come se il Sistema Solare rimanesse identico indipendentemente dal fatto di trovarsi nella via Lattea o in Andromeda... (chiedo perdono per il ragionamento a spanne, me è per fare capire a cosa mi riferisco). Grazie assai eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve non riesco ad immaginare lo scenario che hai davanti. da come dici pare di capire che aprendo un file excel, venga aperto contemporaneamente anche un file che si trova nella cartella Xlstart. Da qui in avanti mi perdo. Ipotizzando che tu abbia 2 file aperti con i relativi fogli, che la macro si trovi sul file X ma che deve lavorare sul file Y (anch'esso aperto), devi per forza passare alla routine il nome del file su cui vuoi lavorare oppure indicare alla macro che deve lavorare sul file attivo. saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, sicuramente sono io che mi perdo in un bicchiere d'acqua, e per di più non riesco a spiegare il problema (che in realtà è semplicissimo)... In parole povere vorrei che quella macro potesse lavorare in parecchi file, per cui vorrei che lavorasse sui file che di volta in volta trova aperti in sequenza (il 1°, il 2°, il 3° etc.), ma di fatto da un pc all'altro non sempre il 1° viene letto 1°, il 2° 2° etc. Modificando l'istruzione I = To 1 a seconda del pc (sostituisco 1 con 2 o 3), tutto il pacchetto lavora correttamente... Grazie assai eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
aetio ha scritto:Ciao, sicuramente sono io che mi perdo in un bicchiere d'acqua, e per di più non riesco a spiegare il problema (che in realtà è semplicissimo)... In parole povere vorrei che quella macro potesse lavorare in parecchi file, per cui vorrei che lavorasse sui file che di volta in volta trova aperti in sequenza (il 1°, il 2°, il 3° etc.), ma di fatto da un pc all'altro non sempre il 1° viene letto 1°, il 2° 2° etc. Modificando l'istruzione I = To 1 a seconda del pc (sostituisco 1 con 2 o 3), tutto il pacchetto lavora correttamente... Grazie assai eZio Salve se la macro in discussione è questa: Dim I As Integer X = Sheets.Count Sheets(X).Activate Application.Run "Seleziona_Filtrato_per_copia1" For I = (X - 1) To 1 Step -1 Sheets(I).Activate Application.Run "Seleziona_Filtrato_per_copia2" Next I End Sub perchè parli di lavorare su file aperti?, il codice sopra indicato lavora solo sui fogli del file attivo. saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, hai ragione. Volevo evitare di aprire un altro thread col medesimo argomento di fondo per cui h preso ad esempio la macro già postata :-)) la macro che, con la medesima filosofia descritta più sopra, lavora sui file aperti è questa: ,-------- Dim I As Integer X = Workbooks.Count For I = X To 3 Step -1 Workbooks(I).Activate Application.Run "Macro1" Next I End Sub
Grazie assai e buona serata eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
aetio ha scritto:Ciao, hai ragione. Volevo evitare di aprire un altro thread col medesimo argomento di fondo per cui h preso ad esempio la macro già postata :-)) la macro che, con la medesima filosofia descritta più sopra, lavora sui file aperti è questa: ,-------- Dim I As Integer X = Workbooks.Count For I = X To 3 Step -1 Workbooks(I).Activate Application.Run "Macro1" Next I End Sub
Grazie assai e buona serata eZio Salve vedendo ora il codice la nebbia va diradandosi. Quello che tu vorresti fare è passare in rassegna tutti i file aperti ad eccezione dei file aperti ma nascosti. se così è, devi utilizzare l'istruzione windows e non workbooks in questo modo: Sub WBvisible() For Each Wb In Windows If Wb.Visible = True Then Wb.Activate Application.Run "Macro1" End If Next End Sub saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
a10n11 ha scritto: vedendo ora il codice la nebbia va diradandosi.
con te la nebbia NON esiste proprio..................!! :-)) Proprio questo cercavo da mesi... Grazie infinite, mio Angelo Custode eZio Edit: intanto che " il ferro è caldo" nella macro '-------- Dim i As Integer X = Workbooks.Count i = 3 Workbooks(i).Activate Sheets("Foglio 2").Select Range("ah3", Range("aj" & Rows.Count).End(xlUp)).Select Selection.Copy For i = 4 To X Step 1 Workbooks(i).Activate Application.Run "Macro2" Next i Application.CutCopyMode = False Application.Run "Macro3" End Sub Attivo il 3° file aperto, nel Foglio 2 seleziono il range e lo copio nei file dal 4° all'ultimo, poi chiedo di eseguire la Macro2; infine di eseguire la Macro3. Macro2 3 Macro3 lavorano con lo stesso concetto dei file aperti, per cui compreso bene il meccanismo con cui scrivere correttamente le istruzioni non dovrei avere ulteriori problemi (condizionale più che mai d'obbligo). Dovrei appunto escludere dal lavoro quei file aperti ma nascosti che di fatto ora sbilanciano quel 3 (e di conseguenza anche tutto il resto delle istruzioni), facendolo divenire di fatto 4, o 5 a seconda del PC/SO che è in uso nella macchina in cui sto eseguendo excel... come adatto le istruzioni che mi hai scritto sopra?? (lo so, sono proprio un rompiscatole, per giunta assai ignorante in materia di VBa, ma ho tanta voglia di imparare BENE)
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve quello che non riesco a capire, è perchè vuoi utilizzare la posizione dei file aperti per eseguire la macro. Non so quale sia l' indicizzazione dei file aperti se per ordine alfabetico o per ordine di apertura. Quindi richiamarli per posizione mi pare un tantino precario in merito alla certezza di lavorare su uo specifico file. Perchè non puoi usare i nomi dei file? saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, le tue perplessità sono più che fondate. Il mio problema è che ho a che fare con migliaia di file, per cui indirizzare ai rispettivi file tutte quelle macro dopo poco tempo invoglierebbe al suicidio per disperazione :-) Ho quindi messo a punto un sitema molto semplice che, dando indicazioni precise sull'apertura dei file-madre e su intere cartelle ad essi strettamente legate, svolgono tutta una serie di operazioni perfettamente incastrate tra di loro che su alcune macchine girano alla perfezione (il famoso 3° file aperto in sequenza sopra menzionato viene effettivamente visto dal sistema come il 3° file aperto), mentre su altri PC tutto và a meraviglia solo se modifico pari-pari tutti i puntatori (il 3 diventa 5 o 6, il 4 6 o 7 etc. a seconda del PC in uso). Evidentemente c'è qualche file nascosto che viene conteggiato dal SO o dal PC, mentre il sistema è incastrato alla perfezione altrimenti genererebbe sempre errori; mi mancano i famosi codici che permettano di istruire tutte le macchine a leggere quel 3 come 3, indipendentemente dai file aperti in background che di fatto confondono e disorientano la macchina... La macro che hai scritto sopra è perfetta, il concetto dei "soli file aperti visibili" risponde in modo esatto al mio problema, ma i miei enormi limiti di conoscenza del VBa non mi permettono di adattare correttamente alle mie macro (che ho postato sopra) le istruzioni che hai scritto nella Sub WBvisible. Credo che se vedessi in che modo scrivi i codici in quelle macro, riuscirei a capire il modus operandi per scriverli anche nelle altre (ma ripeto: il condizionale è d'obbligo), quindi riolverei il mio problema alla radice. Grazie infinite per tutto. Buona giornata eZio
Edit: chiedo scusa. ho dimenticato di aggiungere che l'indicizzazione dei file aperti è per ordine di apertura.
|
|
Guest |