|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve utilizzando le celle di appoggio sul file Excel_A a partire da colonna 18 (R) riga 1 prova questa soluzione: Nel File EXCEL_A Controlla le celle bordate di riga 3 e mette i risultati a partire da colonna 18 in riga 1 contemporaneamente apre tanti file per quante celle bordate trova Sub controlla2() Dim mycoll As Collection Dim myvalue As Collection Dim n As Integer Set mycoll = New Collection Set myvalue = New Collection Set area = Range("h3:o3") For Each cell In area If Not cell.Borders.LineStyle = xlNone Then mycoll.Add (cell.Address) myvalue.Add cell.Value n = n + 1 End If Next cell col = 18 Riga = 1 For a = 1 To n Cells(Riga, col).Value = Range(mycoll(a)).Column Cells(Riga + 1, col).Value = myvalue(a) col = col + 1 Next a For y = 1 To n Workbooks.Open "EXCEL" & y & ".xlsm" Next y Set mycoll = Nothing Set myvalue = Nothing End Sub Nel file EXCEL(N) Nb: la macro si aspetta di trovare file con nome Excel1 - excel2 ecc. in base al numero del file, legge la colonna appropriata, applica il filtro e alla fine ne cancella i dati Sub Filtra1() Dim nfl As Long nfl = Mid(ActiveWorkbook.Name, 6, 1) Set wb = Workbooks("EXCEL_A.xlsm") Set sh = wb.Sheets("Foglio1") With sh End With sh.Range("A1").Activate Selection.AutoFilter Colfield = Cells(1, 17 + nfl).Value Crit = Cells(2, 17 + nfl).Value ActiveSheet.Range("$H$3", Range("$O$3").End(xlDown)).AutoFilter Field:=Colfield, Criteria1:=Crit, _ Operator:=xlAnd '' qui il codice di '' quello che deve fare con il filtro applicato-------> sh.activate Range(Cells(1, 17 + nfl), Cells(2, 17 + nfl)).ClearContents Selection.AutoFilter End Sub saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Caio, innanzi tutto Grazie per la tua davvero immensa pazienza (e pari comprensione per un povero diavolo come il sottoscritto...) Credo proprio che HAI fatto centro, come sempre: sono stupende!! E assolvono ai miei vincoli/limiti "strutturali". Concedimi di rimanere allibito anche per la sintesi delle tue creature: ne leggo di macro nel web, ma per ottenere quello che tu riesci a fare in 4 righe scrivono una Divina Commedia (se mai vi riescono!!). Nulla a che vedere con la bellezza e l'eleganza regale delle tue creature! Mi mancherai tantissimo... [al di là del preziosissimo aiuto che mi dai...] Avrei una ciliegina da mettere sulla torta, che credo non ti dia particolare tribolazione perché lavora su queste tue due utime macro: -la sub controlla2 rimane com'è: individua le celle con bordi colorati e apre i file necessari per l'immissione dei dati nei campi FIELD e CRITERIA1 della sub Filtra1. -la mia ultima richiesta prima di lasciarti in sacrosanta pace (sempre che tu voglia ancora darmi retta) riguarda la macro Filtra1 che è scritta in ogni file EXCEL(n) CHE DEVE RIMANERE INVARIATA NELL'IMPIANTO E possibile dare istruzioni alla macro controlla2 (quindi tutto avviene dal file EXCEL_A) di: -andare nel 1° file che ha aperto e scrivere la 1^ colonna che ha trovato nei campi FIELD e CRITERIA1 del 1° dei 2 filtri e chiudere il file in cui ha appena scritto i dati, salvandone le modifiche; -andare nel 2 file che ha aperto e scrivere la 2^ colonna che ha trovato nei campi FIELD e CRITERIA1 del 1° dei 2 filtri e chiudere il file in cui ha appena scritto i dati, salvandone le modifiche; etc. fino all'ultima colonna che ha trovato, in cui scriverà i dati nell'ultimo file che ha aperto, dopodiché lo chiude salvandone le modifiche? Mi chiuderesti del tutto una serie di problematiche legate a questa operazione che definisco grottesca, ma con la quale mio malgrado devo fare i conti... :-\\ Grazie infinite eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve se non ho capito male, vorresti che la macro del file Excel_A oltrfe ad prire i file vi inserisca i dati relativi alla cella bordata? se è questa la richiesta, modifica la macro Controlla 2 come segue: ......................... ......................... For y = 1 To n Workbooks.Open "EXCEL" & y & ".xlsm" With ActiveWorkbook.ActiveSheet .Cells(1, 18).Value = Range(mycoll(y)).Column .Cells(2, 18).Value = myvalue(y) End With Next y .......................... ........................ ....................... saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, a10n11 ha scritto:salve se non ho capito male, vorresti che la macro del file Excel_A oltrfe ad prire i file vi inserisca i dati relativi alla cella bordata? Hai capito benissimo :-) ...e mi hai risolto un grosso problema. Grazie infinite per tutto, carissimo Amico mio. In becco all'aquila (in aviazione si dice così) per i tuoi impegni. eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, c'è la possibilità di scrivere il codice .Cells(1, 18).Value = Range(mycoll(y)).Column in modo che scriva nella cella R1 dei file EXCEL(n) la lettera della colonna anziché il numero ? Grazie assai, buona giornata eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
aetio ha scritto:Ciao, c'è la possibilità di scrivere il codice .Cells(1, 18).Value = Range(mycoll(y)).Column in modo che scriva nella cella R1 dei file EXCEL(n) la lettera della colonna anziché il numero ? Grazie assai, buona giornata eZio
salve .Cells(1, 18).Value = Chr(Range(mycoll(y)).Column + 64) saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve serve una precisazione al metodo indicato per convertire il numero in lettera di colonna. il metodo indicato va bene per colonne da 1 a 26 - andando oltre, il metodo è un po' differente, visto che in codice ascii le lettere alfabetiche maiuscole vanno da 65 a 90. ti mostro la funzione completa estratto dal sito microsoft: Function ConvertToLetter(iCol As Integer) As String Dim iAlpha As Integer Dim iRemainder As Integer iAlpha = Int(iCol / 27) iRemainder = iCol - (iAlpha * 26) If iAlpha > 0 Then ConvertToLetter = Chr(iAlpha + 64) End If If iRemainder > 0 Then ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64) End If End Function saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, Grazie per la precisazione. Stavo cercando a dritta e a manca nel web, ma (ovvio) non avendo trovato nulla di risolutivo mi ero arrangiato con questa soluzione: mi appoggiavo alla cella S1 in cui avevo scritto la funzione: =SE(R1=8;"h";SE(R1=9;"i"; etc. fino a SE(R1=33;"ag";)))))))))))))))))))))))))) in tal modo veniva visualizzata la lettera corrispondente :-)
Ora mi sta sorgendo un altro problema (fortunatamente assai circoscritto) in una serie di file in cui non posso fare altrimenti: c'è modo con una macro di farle scrivere nei campi FIELD e CRITERIA1 del primo dei due filtri (in questa sotto, la lettera h) della macro
Sub Filtra1() swProcessato = ActiveWorkbook.Name Workbooks(swProcessato).Activate Sheets("Foglio 2").Select Range("A2:AH2").Select Selection.Copy Range("A16").Select ActiveSheet.Paste Range("A17").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.AutoFilter ActiveSheet.Range("$A$18", Range("$AH$18").End(xlDown)).AutoFilter Field:=Range("h18").Column, Criteria1:=Range("h18").Value, _ Operator:=xlAnd 'MODIFICARE FIELD E CRITERIA1 A SECONDA DELLA SIGMA DA FILTRARE ActiveSheet.Range("$A$18", Range("$AH$18").End(xlDown)).AutoFilter Field:=Range("AH18").Column, Criteria1:=Range("AH18").Value, _ Operator:=xlAnd Rows("3:12").Select Selection.EntireRow.Hidden = True End Sub
la lettera che trova nella cella S1 del Foglio1 e poi di farle chiudere quel file, salvando le modifiche dopo avere modificato la sub Filtra1? Sembra che questo chiodo fisso non voglia finire di rompere le scatole :\\ Grazie infinite, eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
aetio ha scritto:Ciao, Grazie per la precisazione. Stavo cercando a dritta e a manca nel web, ma (ovvio) non avendo trovato nulla di risolutivo mi ero arrangiato con questa soluzione: mi appoggiavo alla cella S1 in cui avevo scritto la funzione: =SE(R1=8;"h";SE(R1=9;"i"; etc. fino a SE(R1=33;"ag";)))))))))))))))))))))))))) in tal modo veniva visualizzata la lettera corrispondente :-)
Ora mi sta sorgendo un altro problema (fortunatamente assai circoscritto) in una serie di file in cui non posso fare altrimenti: c'è modo con una macro di farle scrivere nei campi FIELD e CRITERIA1 del primo dei due filtri (in questa sotto, la lettera h) della macro
Sub Filtra1() swProcessato = ActiveWorkbook.Name Workbooks(swProcessato).Activate Sheets("Foglio 2").Select Range("A2:AH2").Select Selection.Copy Range("A16").Select ActiveSheet.Paste Range("A17").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.AutoFilter ActiveSheet.Range("$A$18", Range("$AH$18").End(xlDown)).AutoFilter Field:=Range("h18").Column, Criteria1:=Range("h18").Value, _ Operator:=xlAnd 'MODIFICARE FIELD E CRITERIA1 A SECONDA DELLA SIGMA DA FILTRARE ActiveSheet.Range("$A$18", Range("$AH$18").End(xlDown)).AutoFilter Field:=Range("AH18").Column, Criteria1:=Range("AH18").Value, _ Operator:=xlAnd Rows("3:12").Select Selection.EntireRow.Hidden = True End Sub
la lettera che trova nella cella S1 del Foglio1 e poi di farle chiudere quel file, salvando le modifiche dopo avere modificato la sub Filtra1? Sembra che questo chiodo fisso non voglia finire di rompere le scatole :\\ Grazie infinite, eZio
Salve Io temo che alla fine benga fuori un polpettone indigeribile. Continui a mostrarmi la macro Filtra1 nella versione originale e non nella versione modificata. Che fin ha fatto quella che ti ho modificato? Cosa devo intendere per Sigma?? saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, hai perfettamente ragione... il polpettone è indigeribile per chiunque, te lo assicuro. E il fatto che tu fino ad ora lo abbia digerito senza il minimo problema la dice lunga su che "stomaco" [leggere: cervello] tu abbia :-)) Torno serio: SIGMA è una delle innumerevoli sigle che ho nelle mie macro per distinguere e capire al volo in ogni momento di cosa sto parlando e in quale costellazione della mia galassia mi trovo, altimenti davvero sarebbe impossibile stare dietro a tutto il mio polpettone senza fare tremende confusioni. Ti chiedo scusa, è sempre lo stesso discorso: per me che so cosa sto maneggiando è semplice, ma devo mettermi nei panni (i tuoi) che di punto in bianco ti trovi davanti un pasticcio di macro e devi dipanare l'intricata matassa. Pertanto ignora quella sigla che scioccamente ho mantenuto nel commento. Le macro che mi hai scritto stanno già facendo stupendamente il loro egregio lavoro nei file in cui sono state inserite, ma in questo caso specifico devo risolvere il problema tenendo conto di questa enorme limitazione: la macro deve rimanere così com'è, non posso fare variazioni altrimenti tutto l'intricato incastro/ingranaggio s'inceppa inesorabilmente (chiaramente le istruzioni dei riferimenti di Foglio1 da cui pescare le lettere da modificare andranno inseriti, ma senza modificare la macro nel suo impianto). Purtroppo il mio problema, per fortuna l'ultimo di questa serie, è questo e non posso assolutamente fare altrimenti (per ora, poi gradualmente modificherò e porterò allo stesso standard di quelle che stanno già lavorando): questa sub Filtra1 è in un file; in Foglio1, cella S1, c' è il riferimento letterale ottenuto con la funzione che ti ho sintetizzato sopra; devo potere modificare la lettera dei campi FIELD e CRITERIA1 del primo dei due filtri della macro in modo che vi venga scritta quella di cella S1 di Foglio1. Non posso inserire cicli, o altri lavori da fare svolgere la macro: devono solo essere modificati quei due parametri e poi il file dev'essere chiuso salvando le modifiche... Ora questo lavoro viene svolto manualmente, ma oltre che alienante è assai facile fare errori di scrittura perché i file da sistemare sono parecchi. Se si riuscisse a fare queste sostituzioni via VBa sarebbe davvero una gran bella vittoria... Grazie infinite, per tutto eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve stai chiedendo di costruire una macro che vada a modificare dei parametri all'interno di un'altra macro? saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, a10n11 ha scritto:salve stai chiedendo di costruire una macro che vada a modificare dei parametri all'interno di un'altra macro? saluti Giap che pazienza che hai!! in pratica si, una macro o una o più istruzioni che indichino alla macro di sostituire i campi FILED e CRITERIA1 del primo dei due filtri con la lettera scritta in S1 di Foglio1 del file. Magari chiedo una fesseria... ma mi risolverebbe un problema serio :-\\ Grazie infinite eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve mi mostri la macro esatta che devi modificare? supposto che la macro sia questa, descritta nel modulo2 del progetto VBa ( che nel modulo ci sia solo questa macro) Macro in modulo2 - da sostituire la riga 14 del codice Sub Filtra1() swProcessato = ActiveWorkbook.Name Workbooks(swProcessato).Activate Range("A17").Select Sheets("Foglio 2").Select Range("A2:AH2").Select Selection.Copy Range("A16").Select ActiveSheet.Paste Range("A17").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.AutoFilter ActiveSheet.Range("$A$18", Range("$AH$18").End(xlDown)).AutoFilter Field:=Range("A18").Column, Criteria1:=Range("A18").Value, _Operator:=xlAnd ActiveSheet.Range("$A$18", Range("$AH$18").End(xlDown)).AutoFilter Field:=Range("AH18").Column, Criteria1:=Range("AH18").Value, _ Operator:=xlAnd Rows("3:12").Select Selection.EntireRow.Hidden = True End Sub con questa macro (inserita magari in un modulo a sè) viene eliminata la riga numero 14 (quella segnata in rosso) di Filtra1 ,e sostituita con il Field e Criteria che trova in cella S1 NB. per eseguira la macro, necessita che venga attivato il riferimento a: Microsoft Visual Basic for applications extensibility 5.3 Code: Sub ModificaFiltra1()
Set wb = Workbooks("Il nome del tuo File") Set sh = wb.Sheets("Foglio1") With sh x = .Range("S1").Value End With ThisWorkbook.VBProject.VBComponents("Modulo2").CodeModule.DeleteLines 14 ThisWorkbook.VBProject.VBComponents("Modulo2").CodeModule.InsertLines (14), _ "ActiveSheet.Range(" & """$A$18""" & ", Range(" & """$AH$18""" & ").End(xlDown))" & _ ".AutoFilter Field:=Range(" & """" & x & "18""" & ").Column," & _ "Criteria1:=Range(" & """" & x & "18""" & ").Value, _" End Sub
saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, a10n11 ha scritto: mi mostri la macro esatta che devi modificare?
prima di tutto concedimi un'esclamazione che mi esce spontaneamente: " Mamma mia, Mamma mia!!" sono davvero esterefatto... sono fermamente convinto che il VBa l'abbia inventato tu. La macro è quella che ho scritto sopra, che è quella che hai scritto qui sopra eccetto per riga4 Range("A17").SelectHo eseguito alla lettera le tue indicazioni, con le variazioni necessarie e... non avevo dubbi: FUNZIONA TUTTO A MERAVIGLIA. Non ho parole per ringraziarti, perché mi viene dal profondo del cuore. Mi hai risolto un problema serio, dal quale non potevo mio malgrado uscirne in tempi brevi. Grazie infinite, caro Amico. eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, chiamando la macro ModificaFiltra1 da questa macro che risiede nel primo file aperto, e lavora dall'ultimo fino al secondo, ,---------- Dim x As Integer Dim Wb As Window Dim n As Integer
For Each Wb In Windows If Wb.Visible <> True Then x = x + 1 End If Next i = x + 2 e = Workbooks.Count For n = e To i Step -1 Workbooks(n).Activate Application.Run "ModificaFiltra1" Next n
End Sub
viene restituito un Avviso di Errore di run-time '1004' : Impossibile eseguire la macro. E' possibile che la macro non sia disponibile nella cartella di lavoro o che tutte le macro siano disattivate. Dato che quella procedura viene eseguita regolarmente e senza alcun problema con decine di altre macro credo che questa macro particolare necessiti di uno specifico codice per essere eseguita regolarmente... Il riferimento a Microsoft Visual Basic for applications extensibility 5.3 è stato regolarmente attivato. Ho provato a cercare in rete, ma non ho trovato la minima spiegazione. Grazie assai eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Mi rispondo da solo :-)) (passettino dopo passettino qualcosa imparo, forse)
la sub perché si esegua "forse" và scritta così ,---------- Dim x As Integer Dim Wb As Window Dim n As Integer
For Each Wb In Windows If Wb.Visible <> True Then x = x + 1 End If Next i = x + 2 e = Workbooks.Count For n = e To i Step -1 Workbooks(n).Activate Application.Run ("'" & ActiveWorkbook.Name & "'!ModificaFiltra1") Next n
End Sub
...ma in questo affascinante Universo del VBa non bisogna MAI dare nulla per scontato (si prendono certi schiaffoni!!) per cui se ho scritto una fesseria mi si riprenda senza indugi... Buona giornata eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
aetio ha scritto:Mi rispondo da solo :-))
Ti sei risposto bene
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
a10n11 ha scritto:Ti sei risposto bene detto da te fà piacere alla n ;-)) Grazie assai eZio
|
|
Guest |