VBA – 从closures的工作簿复制数据的最佳方法

我是巴西一家工业公司的实习生,碰巧我正在使用excel。 几天前我刚刚开始玩VBA,我很喜欢它可以为我做的许多事情!

我没有很强的编程背景,所以我基本上是在学习。 代码工作正常,从开始到结束只需不到15秒。 我不打扰时间,但是如果能改善的话那就太棒了。

我的主要目标是保持代码简单高效。 我将在接下来的几个月里离开公司,我希望它很容易维护和使用。 我所要求的是编写我的代码更好的方法,以便其他人更容易理解,如果可能的话(当然是!)花费更less的时间。

我的代码删除我目前的工作簿中的4张内容,然后从其他4封闭的工作簿复制更新的数据。 然后closures一切。 :)数据是关于日常生产和他们的名字是在葡萄牙语,对此感到遗憾。

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 

对不起,如果我不够清楚,当然英语不是我的母语。 任何关于我的代码或整个想法的疑问都可以自由地提出问题。

提前感谢任何帮助家伙!

我通常会在屏幕更新,交互式和计算closures之前做任何工作簿,然后切换回到他们以前的状态在最后。

 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更改回原来的值是很重要的,因为即使在代码完成之后,它仍将保持您设置的方式,这可能会导致混淆。

我不知道你会花多less时间,但我build议在macros运行时通过添加禁用屏幕刷新

 Application.ScreenUpdating = False 

在sub的开头(显然是在同一行结尾= True