Aiutamici Forum
Benvenuto Ospite Cerca | Topic Attivi | Utenti | | Log In | Registra

[Excel 2007]- File con nome e numero fogli variabile... Opzioni
aetio
Inviato: Tuesday, August 20, 2013 10:59:31 PM

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
Sponsor
Inviato: Tuesday, August 20, 2013 10:59:31 PM

 
a10n11
Inviato: Wednesday, August 21, 2013 10:28:40 AM

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

aetio
Inviato: Wednesday, August 21, 2013 11:29:44 AM

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 :-))

aetio
Inviato: Thursday, August 22, 2013 10:03:30 AM

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
a10n11
Inviato: Thursday, August 22, 2013 1:10:23 PM

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

aetio
Inviato: Thursday, August 22, 2013 2:15:09 PM

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
a10n11
Inviato: Thursday, August 22, 2013 2:34:02 PM

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

aetio
Inviato: Thursday, August 22, 2013 2:42:33 PM

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
aetio
Inviato: Friday, September 06, 2013 9:33:12 AM

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
a10n11
Inviato: Friday, September 06, 2013 10:45:31 AM

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


aetio
Inviato: Friday, September 06, 2013 1:44:42 PM

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

a10n11
Inviato: Friday, September 06, 2013 7:38:35 PM

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

aetio
Inviato: Friday, September 06, 2013 8:21:04 PM

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
a10n11
Inviato: Saturday, September 07, 2013 9:49:34 AM

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

aetio
Inviato: Saturday, September 07, 2013 5:06:14 PM

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
a10n11
Inviato: Saturday, September 07, 2013 11:50:10 PM

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

aetio
Inviato: Sunday, September 08, 2013 12:07:20 AM

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)
a10n11
Inviato: Monday, September 09, 2013 10:11:20 AM

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

aetio
Inviato: Monday, September 09, 2013 10:38:34 AM

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.


Utenti presenti in questo topic
Guest


Salta al Forum
Aggiunta nuovi Topic disabilitata in questo forum.
Risposte disabilitate in questo forum.
Eliminazione tuoi Post disabilitata in questo forum.
Modifica dei tuoi post disabilitata in questo forum.
Creazione Sondaggi disabilitata in questo forum.
Voto ai sondaggi disabilitato in questo forum.

Main Forum RSS : RSS

Aiutamici Theme
Powered by Yet Another Forum.net versione 1.9.1.8 (NET v2.0) - 3/29/2008
Copyright © 2003-2008 Yet Another Forum.net. All rights reserved.