2016-01-20 15 views
5

Sono uno stagista in una società industriale in Brasile e succede che sto usando molto bene. Ho appena iniziato a giocare con VBA qualche giorno fa e sono divertito da molte cose che può fare per me !!VBA: metodo migliore per copiare i dati da una cartella di lavoro chiusa

Non ho un forte background di programmazione, quindi sto imparando facendo fondamentalmente. Il codice funziona correttamente e richiede meno di 15 secondi dall'inizio alla fine. Non mi preoccupo del tempo, ma se potesse essere migliorato sarebbe fantastico.

Il mio obiettivo principale è mantenere il codice semplice ed efficiente. Lascerò l'azienda nei prossimi mesi e mi piacerebbe che fosse facile da mantenere e da usare. Quello che sto chiedendo è un modo migliore per scrivere il mio codice in modo che gli altri possano capire più facilmente e, se possibile (ovviamente lo è!) Impiegare meno tempo.

Il mio codice elimina 4 fogli di contenuto nella cartella di lavoro corrente, quindi copia i dati aggiornati da altri 4 cartelle di lavoro chiuse. Quindi chiudere tutto. :) I dati riguardano la produzione giornaliera ei loro nomi sono in portoghese, mi dispiace per quello.

Sub CopiarBase() 

' 
' Atalho do teclado: Ctrl+q 
' 


    ' Variables 
    Dim MyCurrentWB As Workbook 
    Dim BMalharia As Worksheet 
    Dim BBeneficiamento As Worksheet 
    Dim BEmbalagem As Worksheet 
    Dim BDikla As Worksheet 

    Set MyCurrentWB = ThisWorkbook 
    Set BMalharia = MyCurrentWB.Worksheets("B-Malharia") 
    Set BBeneficiamento = MyCurrentWB.Worksheets("B-Beneficiamento") 
    Set BEmbalagem = MyCurrentWB.Worksheets("B-Embalagem") 
    Set BDikla = MyCurrentWB.Worksheets("B-Dikla") 

    'Clean all the cells - Workbook 1 


    Dim Malharia_rng As Range 
    Set Malharia_rng = BMalharia.Range("A2:CN" & BMalharia.Cells(Rows.Count, 1).End(xlUp).Row) 
    Malharia_rng.ClearContents 

    Dim Ben_rng As Range 
    Set Ben_rng = BBeneficiamento.Range("A2:CY" & BBeneficiamento.Cells(Rows.Count, 1).End(xlUp).Row) 
    Ben_rng.ClearContents 

    Dim Emb_rng As Range 
    Set Emb_rng = BEmbalagem.Range("A2:CT" & BEmbalagem.Cells(Rows.Count, 1).End(xlUp).Row) 
    Emb_rng.ClearContents 

    Dim Dikla_rng As Range 
    Set Dikla_rng = BDikla.Range("A2:AV" & BDikla.Cells(Rows.Count, 1).End(xlUp).Row) 
    Dikla_rng.ClearContents 


    'Copy from Malharia Workbook 

    Workbooks.Open "C:\Users\marco.henrique\Desktop\Bases\Malharia Base.xls" 

    LastRowMB = Workbooks("Malharia Base.xls").Worksheets("Malharia Base").Cells(Rows.Count, 1).End(xlUp).Row 
    Dim Malha_base As Range 
    Set Malha_base = Workbooks("Malharia Base.xls").Worksheets("Malharia Base").Range("A2:CN" & LastRowMB) 

    MyCurrentWB.Worksheets("B-Malharia").Range("A2:CN" & LastRowMB).Value = Malha_base.Value 
    Workbooks("Malharia Base.xls").Close 

    'Copy from Beneficiamento Workbook 

    Workbooks.Open "C:\Users\marco.henrique\Desktop\Bases\Beneficiamento Base.xls" 

    LastRowBB = Workbooks("Beneficiamento Base.xls").Worksheets("Beneficiamento Base").Cells(Rows.Count, 1).End(xlUp).Row 
    Dim Ben_base As Range 
    Set Ben_base = Workbooks("Beneficiamento Base.xls").Worksheets("Beneficiamento Base").Range("A2:CY" & LastRowBB) 

    MyCurrentWB.Worksheets("B-Beneficiamento").Range("A2:CY" & LastRowBB).Value = Ben_base.Value 
    Workbooks("Beneficiamento Base.xls").Close 

    'Copy from Embalagem Workbook 

    Workbooks.Open "C:\Users\marco.henrique\Desktop\Bases\Embalagem Base.xls" 

    LastRowEB = Workbooks("Embalagem Base.xls").Worksheets("Embalagem Base").Cells(Rows.Count, 1).End(xlUp).Row 
    Dim Emb_base As Range 
    Set Emb_base = Workbooks("Embalagem Base.xls").Worksheets("Embalagem Base").Range("A2:CT" & LastRowEB) 

    MyCurrentWB.Worksheets("B-Embalagem").Range("A2:CT" & LastRowEB).Value = Emb_base.Value 
    Workbooks("Embalagem Base.xls").Close 

    'Copy from Dikla Workbook 

    Workbooks.Open "C:\Users\marco.henrique\Desktop\Bases\Diklatex Base.xls" 

    LastRowDB = Workbooks("Diklatex Base.xls").Worksheets("Diklatex Base").Cells(Rows.Count, 1).End(xlUp).Row 
    Dim Dikla_base As Range 
    Set Dikla_base = Workbooks("Diklatex Base.xls").Worksheets("Diklatex Base").Range("A2:AV" & LastRowDB) 

    MyCurrentWB.Worksheets("B-Dikla").Range("A2:AV" & LastRowDB).Value = Dikla_base.Value 
    Workbooks("Diklatex Base.xls").Close 

End Sub 

Mi dispiace se non ero abbastanza chiaro, ovviamente l'inglese non è la mia lingua madre. Qualsiasi dubbio sul mio codice o sull'intera idea è libero di porre domande.

Grazie in anticipo per qualsiasi aiuto ragazzi!

+2

Sto votando per chiudere questa domanda come off-topic perché è esattamente adatto per [Code Review] (http://codereview.stackexchange.com/) –

+1

Questa potrebbe essere una buona domanda per [codereview.se], fintanto che: ** (A) ** _ il codice funziona_, ** e (B) ** _ non è ipotetico o incompleto in alcun modo_. Per favore leggi la [guida in tema] (http://codereview.stackexchange.com/help/on-topic) prima di postare, se scegli di andare su [Code Review] (http://codereview.stackexchange.com/ domande/ask). Se hai domande o dubbi, unisciti a noi al nostro [Help Desk CR] (http://chat.stackexchange.com/rooms/34045). – Phrancis

+0

Lo farò. Dispiace per la confusione! – mschlindwein

risposta

0

io non sono sicuro di quanto tempo si risparmia, ma vorrei suggerire disabilitare il refresh dello schermo quando la macro è in esecuzione, con l'aggiunta di

Application.ScreenUpdating = False 

all'inizio del sub (e, ovviamente, la stessa linea con = True alla fine)

1

Di solito passo l'aggiornamento dello schermo, interattivo e lo deduco prima di fare qualsiasi cosa in una cartella di lavoro, per poi riportarlo al loro stato precedente alla fine.

Dim oldInteractive As Boolean = Application.Interactive 
Dim oldCalulation As XlCalculation = Application.Calculation 
Dim oldScreenUpdating As Boolean = Application.ScreenUpdating 
Application.Interactive = False 
Application.Calculation = XlCalculation.xlCalculationManual 
Application.ScreenUpdating = False 

'Your code here 

Application.Interactive = oldInteractive 
Application.Calculation = oldCalulation 
Application.ScreenUpdating = oldScreenUpdating 

Ciò impedirà di eseguire calcoli mentre il codice è in esecuzione, il che può rallentare molto le cose. È importante riportare Application.Calculation al suo vecchio valore in quanto rimarrà come lo si imposta anche dopo che il codice è terminato, il che può causare confusione.