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

[Excel 2007]- Scrittura di dati nelle macro Opzioni
a10n11
Inviato: Sunday, September 15, 2013 10:55:29 AM

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


aetio
Inviato: Sunday, September 15, 2013 12:27:11 PM

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

a10n11
Inviato: Sunday, September 15, 2013 9:04:46 PM

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

aetio
Inviato: Sunday, September 15, 2013 10:17:54 PM

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
aetio
Inviato: Monday, September 16, 2013 10:44:21 AM

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
a10n11
Inviato: Monday, September 16, 2013 10:57:55 AM

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

a10n11
Inviato: Monday, September 16, 2013 11:25:16 AM

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

aetio
Inviato: Monday, September 16, 2013 1:28:29 PM

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

a10n11
Inviato: Monday, September 16, 2013 3:07:04 PM

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

aetio
Inviato: Monday, September 16, 2013 3:32:20 PM

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
a10n11
Inviato: Monday, September 16, 2013 5:39:05 PM

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

aetio
Inviato: Monday, September 16, 2013 6:27:16 PM

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
a10n11
Inviato: Monday, September 16, 2013 6:34:25 PM

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

aetio
Inviato: Monday, September 16, 2013 9:17:37 PM

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").Select
Ho 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
aetio
Inviato: Tuesday, September 17, 2013 12:59:41 AM

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
aetio
Inviato: Tuesday, September 17, 2013 8:59:02 AM

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


a10n11
Inviato: Tuesday, September 17, 2013 10:21:06 AM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
aetio ha scritto:
Mi rispondo da solo :-))


Ti sei risposto bene

aetio
Inviato: Tuesday, September 17, 2013 10:40:10 AM

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
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.