Condividi:        

Macro di Excel

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Macro di Excel

Postdi Cesare2010 » 01/02/11 15:41

Buongiorno a tutti.
E' la prima volta che scrivo in un forum. Inanzitutto vorrei complimentarmi con i moderatori (veramente molto in gamba) e con quanti che con le loro discussioni ed "esigenze" hanno garantito, a me "molto neofita", di riuscire a scrivere qualche piccolo codice macro per il funzionamento di qualche misero database in excel. :oops:
Se possibile, vorrei chiedere consiglio su qualcosa che sicuramente è stato ampiamente trattato nel passato ma che, nonostante le mie ricerche, non sono riuscito a venirne a capo.
Passo al problema:
1) ho un file "A" con una pletora di fogli comunicanti fra loro;
2) i dati (forse meglio: valori) di alcuni di questi fogli (es.: 7 - 8 - 9 - 10 - 11 - 12 - 13) devono essere copiati in un altro file "B", al momento non "aperto" , che riporta lo stesso numero (quantità) con il medesimo nome di fogli dove riportare i dati di "A" (7 - 8 - 9 - 10 - 11 - 12 - 13);
3) il tutto, nel file "B", va inserito a partire dalla prima cella libera della colonna B di ogni foglio, mentre nella colonna A va il riferimento al file di provenienza: "A".
Molto umilmente chiedo se qualcuno mi può dare una mano a scrivere un codice macro da attivare, ovviamente con un pulsante, dal file "A".
Nella speranza di essere stato piuttosto chiaro nell'esposizione, ringrazio anticipatamente ed estendo a tutti un caloroso saluto.
Cesare2010.
Cesare2010
Utente Junior
 
Post: 30
Iscritto il: 31/01/11 17:37

Sponsor
 

Re: Macro di Excel

Postdi antoo69 » 01/02/11 15:57

Sposto
dai un pesce ad un uomo e lo sfamerai per un giorno.
insegna ad un uomo a pescare e lo sfamerai per tutta la vita.

Dell Alienware M17x
Avatar utente
antoo69
Moderatore
 
Post: 2112
Iscritto il: 28/04/09 16:40
Località: PARMA

Re: Macro di Excel

Postdi Anthony47 » 01/02/11 16:41

Ciao Cesare2010 e benvenuto nel forum.
Partendo dal file A, foglio 13, avvia la registrazione di una macro e poi esegui diligentemente le seguenti operazioni:
-apri il file B
-torna al file A, seleziona il primo foglio che ti interessa (non deve essere il 13 al momento attivo)
-seleziona e copia il range che ti interessa
-attiva il file B, seleziona il foglio giusto, seleziona la posizione giusta in fondo a col B
-incolla i dati (o "incolla valori", dipende da cosa devi fare
-su col A scrivi "il riferimento al file di provenienza" (ma devi spiegare che cosa intendi)
-torna sul file A, ferma la registrazione della macro.

Pubblica quindi il codice generato, con l' elenco dei fogli su cui vuoi fare la stessa operazione, e modificheremo poi la macro affinche' faccia il lavoro automaticamente.

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19441
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro di Excel

Postdi Cesare2010 » 01/02/11 17:48

Ciao Antony47,
grazie per il benvenuto e per la tua sollecitudine.
Ho fatto ciò che hai suggerito ed il codice è qui di seguito.
L'operazione di copia valori va fatta per tutti i fogli del FileA da riportare nei medesimi del FileB.
Ad integrazione di quanto detto nella mia prima richiesta di aiuto, aggiungo che: il FileB è un file di riepilogo dati provenienti non solo dal FileA. Ciò a dire che la macro in argomento verrà inserita in tutti quei file ai quali fa capo il FileB (riepilogo) e che da ognuno di essi i dati (valori) che interessano vengono aggiunti.
Spero vivamente di aver esposto correttamente il problema.

Codice: Seleziona tutto
Sub Copia()
'
' Copia Macro
' Macro registrata il 01/02/2011 da Cesare
'

'
    Workbooks.Open Filename:="M:\Archivio\Excel\FileB.xls", UpdateLinks:=3
    Windows("FileA.xls").Activate
    Sheets("Foglio7").Select
    Range("A11:N19").Select
    Selection.Copy
    Windows("FileB.xls").Activate
    Range("B11").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Windows("FileA.xls").Activate
    Sheets("Foglio8").Select
    Range("A11:N17").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("FileB.xls").Activate
    Sheets("Foglio8").Select
    Range("B11").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("A11").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "FileA"
    Range("A12").Select
    ActiveCell.FormulaR1C1 = "FileA"
    Range("A13").Select
    ActiveCell.FormulaR1C1 = "FileA"
    Range("A14").Select
    Sheets("Foglio7").Select
    Range("A11").Select
    ActiveCell.FormulaR1C1 = "FileA"
    Range("A12").Select
    ActiveCell.FormulaR1C1 = "FileA"
    Range("A13").Select
    ActiveCell.FormulaR1C1 = "FileA"
    Range("A14").Select
    ActiveCell.FormulaR1C1 = "FileA"
    Range("A15").Select
    ActiveCell.FormulaR1C1 = "FileA"
    Range("A16").Select
    ActiveCell.FormulaR1C1 = "FileA"
    Range("A17").Select
    ActiveCell.FormulaR1C1 = "FileA"
    Range("A18").Select
    ActiveCell.FormulaR1C1 = "FileA"
    Range("A19").Select
    ActiveCell.FormulaR1C1 = "FileA"
    Range("A20").Select
End Sub
Cesare2010
Utente Junior
 
Post: 30
Iscritto il: 31/01/11 17:37

Re: Macro di Excel

Postdi Anthony47 » 02/02/11 00:58

Prova questa variante, che metti su un file a se stante; poi apri il FileA e lanci la macro:
Codice: Seleziona tutto
Sub MyGod()
Dim I As Integer, IRow As Long, LRow As Long
Dim FileAN As String, CSh As String, MyRan As String, Rispo
'
FileAN = ActiveWorkbook.Name

Rispo = MsgBox("Procedo a storicizzare i dati del file " & FileAN & "?", vbYesNo)
If Rispo = vbNo Then Exit Sub
'Application.ScreenUpdating = False     '<<< VEDI TESTO
Workbooks.Open Filename:="M:\Archivio\Excel\FileB.xls", UpdateLinks:=3
Windows(FileAN).Activate
For I = 1 To Worksheets.Count
    Sheets(I).Select
CSh = ActiveSheet.Name
    MyRan = Application.Intersect(ActiveSheet.UsedRange, Range("A11:N" & Rows.Count)).Address
    Range(MyRan).Select
    Selection.Copy
    Windows("FileB.xls").Activate
Sheets(CSh).Select
IRow = Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Row
    Range("B" & IRow).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
LRow = Range("B" & Rows.Count).End(xlUp).Row
Cells(IRow, 1).Resize(LRow - IRow, 1) = FileAN
    Windows(FileAN).Activate
Next I
Application.ScreenUpdating = True
End Sub

Se ti da' fastidio il "lampeggiare dei fogli" togli l' apostrofo in testa all' istruzione Application.ScreenUpdating = False.

In questo modo avrai la macro in un file "terzo", e non devi inserirla in tutti i files su cui devi lavorare.
La macro prende i dati dal "file corrente" e li travasa su FileB.

Ti potrebbe interessare questo codice da mettere in sostituzione della riga FileAN = ActiveWorkbook.Name
Codice: Seleziona tutto
With Application.FileDialog(msoFileDialogFilePicker)
    .AllowMultiSelect = False
    .Filters.Clear
    .Filters.Add "Excel", "*.xls*"
    .Title = "Scegli il file su cui lavorare"
    .Show
    If .SelectedItems.Count = 0 Then
       MsgBox ("Nessun file selezionato, procedura annullata")
       Exit Sub
    End If
    FileAN = .SelectedItems(1)     'Directory e Nome del file selezionato
End With
Workbooks.Open Filename:=FileAN
Il suo scopo e' selezionare da macro quale e' il FileA da aprire, quindi si lancia la macro dal file "terzo" che la contiene, viene selezionato quale file aprire, viene aperto FileB, si fa il travaso dei dati foglio per foglio.


Ovviamente farai le prove dopo aver fatto due copie di backup dei tuoi dati originali...

Ciao, fai sapere.
Avatar utente
Anthony47
Moderatore
 
Post: 19441
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro di Excel

Postdi Cesare2010 » 02/02/11 10:26

Buongiorno Antony47 (anzi.... buongiorno a tutti).
Ancora grazie per il tuo sollecito interessamento; ho provato la variante proposta ma.... dà un "Errore di run-time '91" all'altezza della stringa " MyRan = Application.Intersect(ActiveSheet.UsedRange, Range("A11:N" & Rows.Count)).Address".
Ho provato ad inserire anche le altre stringhe, come suggerito (per vedere l'effetto che fa), ma anche qui dà un errore di run-time '9 (indice non incluso nell'intervallo). Ad onor del vero, inserendo queste "seconde" stringhe ho disattivato quella che recita: "Workbooks.Open Filename:="C:\.......etc.).
Una domanda sciocca, nella consapevolezza che mi sono restati solo due neuroni e che solo occasionalmente si incontrano: perché lanciare la macro da un terzo file?
Grazie e a risentirci.
Cesare2010
Utente Junior
 
Post: 30
Iscritto il: 31/01/11 17:37

Re: Macro di Excel

Postdi Anthony47 » 02/02/11 16:04

Stai facendo la prova con dei fogli vuoti? E' possibile che nell' uso reale ti imbatti in fogli vuoti?
Per "vuoto" intendo un foglio senza dati nell' area A11:Nxx

Il secondo codice va inserito in sostituzione della riga che ti ho detto, il resto della macro rimane invariata.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19441
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro di Excel

Postdi Cesare2010 » 02/02/11 18:31

No, i fogli non sono vuoti e la seconda macro l'ho inserita correttamente come mi avevi indicato.
Cesare2010
Utente Junior
 
Post: 30
Iscritto il: 31/01/11 17:37

Re: Macro di Excel

Postdi Cesare2010 » 02/02/11 21:40

Chiedo umilmente scusa ad Anthony47.
La risposta alla domanda postami è: si, è possibile che possano incontrarsi fogli vuoti.
Cesare
Cesare2010
Utente Junior
 
Post: 30
Iscritto il: 31/01/11 17:37

Re: Macro di Excel

Postdi Anthony47 » 02/02/11 23:01

la seconda macro l'ho inserita correttamente come mi avevi indicato
Avevi detto " ho disattivato quella che recita: "Workbooks.Open Filename:="C:\.......etc.)" e ti avevo creduto :D :D

Comunque ho capito che l' istruzione che ti avevo fatto sostituire con quell' altro blocco va mantenuta, cioe' quelle istruzioni vanno messe subito prima di (e NON al posto di) FileAN = ActiveWorkbook.Name.
Questo per l' errore "Indice non incluso nell' intervallo".

Per l' errore 91, visto anche il tuo ultimo post, sostituisci dalla riga "MyRan = etc etc" fino alla fine con queste:
Codice: Seleziona tutto
LRow = Cells(Rows.Count, 1).End(xlUp).Row
If LRow < 11 Then GoTo SkSh
MyRan = "A11:N" & LRow
'    MyRan = Application.Intersect(ActiveSheet.UsedRange, Range("A11:N" & Rows.Count)).Address
    Range(MyRan).Select
    Selection.Copy
    Windows("FileB.xls").Activate
Sheets(CSh).Select
IRow = Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Row
    Range("B" & IRow).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
LRow = Range("B" & Rows.Count).End(xlUp).Row
Cells(IRow, 1).Resize(LRow - IRow, 1) = FileAN
    Windows(FileAN).Activate
SkSh:
Next I
End Sub
Essenzialmente c' e' un metodo diverso di calcolare l' area da copiare e lo skip di fogli vuoti.
NB: l' area da copiare ora la calcolo da riga 11 all' ultima riga che ha un valore in col A, e' corretta questa logica, nel caso dei tuoi dati?

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19441
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro di Excel

Postdi Cesare2010 » 03/02/11 17:25

Buongiorno Anthony,
la macro, compresa l'ultima modifica, "sembrerebbe" vada bene a condizione che nei due File: "A" (quello attivo da dove lanciare la macro, quindi il copy) e "B" (dove riportare i valori) compaiano lo stesso numero di fogli con il medesimo nome; comunque si interrompe dopo il terzo ciclo per il verificarsi dell'errore 1004 (definito dall'applicazione o dall'oggetto) sulla riga "Cells(IRow, 1).Resize(LRow - IRow, 1) = FileAN". Comunque, nella colonna A dei 3 fogli del FileB, dove sono stati riportati i valori dei corrispondenti fogli del FileA, compare il "riferimento" al FileA ma non nell'ultima riga copiata.
Qualora nel File "A" - come è ed è stato da me detto nel primo post - vi fossero altri fogli, oltre all'errore di run-time 9 sul rigo "Sheets(CSh).Select", la macro comincia a leggere dal primo. Non è ciò che si chiede.
Scusami la pedanteria, ma ribadisco che nel FileB compare solo una parte dei fogli del FileA (Comincio sinceramente a vergognarmi :oops: :oops: :oops: ).
Ciao,
Cesare.
Cesare2010
Utente Junior
 
Post: 30
Iscritto il: 31/01/11 17:37

Re: Macro di Excel

Postdi Anthony47 » 04/02/11 00:22

Per l' errore 1004, che dovrebbe capitare su un foglio con dati solo su Riga 11, modifica l' istruzione che va in errore con
Codice: Seleziona tutto
Cells(IRow, 1).Resize(LRow – Irow +1, 1) = FileAN

Per quanto riguarda il cominciare da Foglio1, questo nasce dalla tua risposta a una delle mie prime domande:
"L'operazione di copia valori va fatta per tutti i fogli del FileA da riportare nei medesimi del FileB"; adesso capisco che forse volevi scrivere " . . . a tutti i Fogli del FileA che esistono nel FileB".
Se e' cosi', allora modifica due spezzoni della macro come segue
Codice: Seleziona tutto
Workbooks.Open Filename:="M:\Archivio\Excel\FileB.xls", UpdateLinks:=3   '***
'Windows(FileAN).Activate      '---
For I = 1 To Worksheets.Count  '***
    Sheets(I).Select           '***             
CSh = ActiveSheet.Name         '***
Windows(FileAN).Activate       '+++
Sheets(CSh).Select             '+++
.
.
.
Cells(IRow, 1).Resize(LRow - IRow, 1) = FileAN    '***
'    Windows(FileAN).Activate      '---
Next I                             '***

Legenda; *** istruzioni esistenti e confermate; +++ nuove istruzioni; --- istruzioni da eliminare
In questo modo chi guida sono i fogli di FileB.

Se invece la casistica e' piu' complessa allora prova a rispiegare.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19441
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro di Excel

Postdi Cesare2010 » 06/02/11 16:39

Buon pomeriggio Anthony,
mi scuso per il ritardo ma altri impegni mi hanno distolto dal forum. Ho apportato le correzioni suggerite e....... :) :)
Wow, wow, wow....wow. That's wonderful. Are you a big, you're the greatest...... di più!!!
Ti ringrazio per la pazienza dimostratami e che metti sempre a disposizione di quanti cercano di risolvere problemi legati ad excel.
In effetti i consigli hanno evitato una lunga sequela di copia/incolla e mi hanno dato la possibilità di imparare qualcosa.
La macro inserita nel programma da me preparato funziona alla grande.
Per informazione, nella speranza di fare cosa corretta (peraltro nessun problema è insorto) ti comunico che ho aggiunto le seguenti stringhe:

“Dim W As Worksheet

Dopo la stringa del “Paste” ho aggiunto:

Range("A1").Select

Dopo il “Next I”, ho aggiunto:

Application.CutCopyMode = False
Windows("Elenchi generali stagioneA.xls").Activate
ActiveWorkbook.Close savechanges:=True
Windows(FileAN).Activate
For Each W In Worksheets
Sheets.Select
Range("A1").Select
Next W

Un Salutone ed a presto risentirci,
Cesare
Cesare2010
Utente Junior
 
Post: 30
Iscritto il: 31/01/11 17:37

Re: Macro di Excel

Postdi Anthony47 » 07/02/11 00:29

Ok, pero' non ho capito a cosa servono le ultime istruzioni, quelle del ciclo For Each W /Next W.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19441
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro di Excel

Postdi Cesare2010 » 07/02/11 21:40

Le ho inserite solo per togliere la "fastidiosa" visualizzazione di gruppi celle ancora selezionate. :oops:
Credo che nei prossimi giorni inserirò sul forum un problema, forse simile. Sto cercando di ridurre una pletora di macro su un programmino studiato (parola grossa) da me un pò di tempo fa (2004), ancora funzionante, sul quale mi piacerebbe imparare meglio e di più.
Un grosso saluto,
Cesare.
Cesare2010
Utente Junior
 
Post: 30
Iscritto il: 31/01/11 17:37

Re: Macro di Excel

Postdi Anthony47 » 07/02/11 21:54

Dovrebbe bastare la sola
Application.CutCopyMode = False

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19441
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro di Excel

Postdi Cesare2010 » 07/02/11 22:51

Thank you.... Merci.....Danke Schoen......Gracias

Ciao
Cesare2010
Utente Junior
 
Post: 30
Iscritto il: 31/01/11 17:37


Torna a Applicazioni Office Windows


Topic correlati a "Macro di Excel":


Chi c’è in linea

Visitano il forum: Nessuno e 12 ospiti

cron