2016-01-20 6 views
5

Я стажер в промышленной компании в Бразилии, и бывает так, что я использую excel много. Я только начал играть с VBA пару дней назад, и я удивлен многими вещами, которые он может сделать для меня !!VBA - лучший способ скопировать данные из закрытой книги

У меня нет сильного фона программирования, поэтому я участвую в основном. Код работает нормально, и от начала до конца требуется менее 15 секунд. Я не беспокоюсь о времени, но если бы он мог быть улучшен, это было бы здорово.

Моя основная цель - сохранить код простым и эффективным. Я уеду из компании в ближайшие месяцы, и я бы хотел, чтобы это было легко использовать и использовать. То, что я прошу, - это лучший способ написать мой код, чтобы другие могли понять легче, и, если возможно (конечно, это!), Требуется меньше времени.

Мой код удаляет 4 листа содержимого в моей текущей книге, а затем копирует обновленные данные из 4 других закрытых книг. Затем закройте все. :) Данные о ежедневном производстве, и их имена на португальском языке, извините за это.

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 

Прошу прощения, если я не был достаточно ясен, конечно английский не мой родной язык. Любые сомнения относительно моего кода или всей идеи не стесняются задавать вопросы.

Заранее благодарим за помощь!

+2

Я голосующий, чтобы закрыть этот вопрос как не по теме, потому что он подходит именно для [Code Review] (http://codereview.stackexchange.com/) –

+1

Это может быть хорошим вопросом для [codereview.se], до тех пор, пока: ** (A) ** _ код работает_, ** и (B) ** _it не является гипотетическим или неполным каким-либо образом. Перед публикацией прочитайте руководство по теме (http://codereview.stackexchange.com/help/on-topic), если вы решите перейти на [Обзор кода] (http://codereview.stackexchange.com/ вопросы/предложения). Если у вас есть какие-либо вопросы или проблемы, присоединяйтесь к нам в нашей [CR Help Desk] (http://chat.stackexchange.com/rooms/34045). – Phrancis

+0

Я сделаю это. Извините за беспорядок! – mschlindwein

ответ

0

Я не знаю, сколько времени вы будете жалеть, но я хотел бы предложить отключить обновление экрана, когда макрос работает, добавив

Application.ScreenUpdating = False 

в начале подпункта (и, очевидно, в ту же строку с = True в конце)

1

Обычно я перехожу к обновлению экрана, взаимодействую и вычисляю, прежде чем что-либо делать с книгой, а затем верните ее в прежнее состояние в конце.

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 

Это предотвратит выполнение расчетов во время работы вашего кода, что может замедлить работу. Важно изменить Application.Calculation обратно на прежнее значение, так как оно останется таким, как вы его установили, даже после завершения вашего кода, что может вызвать путаницу.

Смежные вопросы