VBA:如何同时在两个工作簿中引用单元格

我正在写一个macros,将数据从报告文件移动到主文件。 我的初始版本工作,但它很慢,闪烁很多。 这并不奇怪,因为我正在使用Workbook.Activate() 。 我故意这样做,初步简单,并帮助debugging。

但是,现在它工作正常,我想停止使用Workbook.Activate()

我怎样才能在两个单独的工作簿中引用单元格,而不是一直都在实现它们中的每一个呢? 我不介意在开始时做几次闪光,但是在那之后,我希望那里不再有闪光。

我已经在一个简单的testing中尝试了这个:

 Sub try() Dim c As Range Dim c1 As Range Workbooks(MASTER_FILE_NAME).Activate Set c = Cells(25, 1) Workbooks(REPORT_FILE_NAME).Activate Set c1 = Cells(10, 1) c.Value = c1.Value Set c = Cells(c.Row + 1, c.COLUMN) Set c1 = Cells(c1.Row + 1, c.COLUMN) c.Value = c1.Value End Sub 

但第三个块只是简单地将这两个范围设置为指向报告文件中的单元格。 我是否需要使用命名范围? 我真的不喜欢。 有没有另一种方法?

如果您不使用。 .Activate.Select ,将不会有任何屏幕活动,因此无需closures屏幕更新(只有在您有大量数据传输的情况下)

你应该简单地创buildWorkbookWorksheet对象来让你正在使用的代码:

 Sub try() Dim wB1 As Workbook Dim wB2 As Workbook Dim wS1 As Worksheet Dim wS2 As Worksheet Dim c1 As Range Dim c2 As Range Dim MASTER_FILE_NAME As String MASTER_FILE_NAME = "Workbook_MASTER_Name.xlsm" Dim REPORT_FILE_NAME As String REPORT_FILE_NAME = "Workbook_REPORT_Name.xlsm" 'Set wB1 = ThisWorkbook 'Set wB1 = ActiveWorkbook Set wB1 = Workbooks(MASTER_FILE_NAME) Set wB2 = Workbooks(REPORT_FILE_NAME) Set wS1 = wB1.Sheets("Master_Sheet_Name") Set wS2 = wB2.Sheets("Report_Sheet_Name") Set c1 = wS1.Cells(25, 1) Set c2 = wS2.Cells(10, 1) 'Put the data of the master in report c2.Value = c1.Value Set c1 = c1.Offset(1, 0) Set c2 = c2.Offset(1, 0) c2.Value = c1.Value End Sub 

或者你可以直接使用一个单元格范围(效率更高,速度更快!):

 Sub try_ranges() Dim wB1 As Workbook Dim wB2 As Workbook Dim wS1 As Worksheet Dim wS2 As Worksheet Dim c1 As Range Dim c2 As Range Dim LastRow1 As Long Dim MASTER_FILE_NAME As String MASTER_FILE_NAME = "Workbook_MASTER_Name.xlsm" Dim REPORT_FILE_NAME As String REPORT_FILE_NAME = "Workbook_REPORT_Name.xlsm" 'Set wB1 = ThisWorkbook 'Set wB1 = ActiveWorkbook Set wB1 = Workbooks(MASTER_FILE_NAME) Set wB2 = Workbooks(REPORT_FILE_NAME) Set wS1 = wB1.Sheets("Master_Sheet_Name") Set wS2 = wB2.Sheets("Report_Sheet_Name") 'Get the last used row in column A in your master sheet LastRow1 = wS1.Range("A" & wS1.Rows.Count).End(xlUp).Row 'Take the whole column in master sheet Set c1 = wS1.Range(wS1.Cells(25, 1), wS1.Cells(LastRow1, 1)) 'Resize the range in report sheet to fit what you have taken in master sheet Set c2 = wS2.Cells(10, 1).Resize(c1.Rows.Count, 1) 'Transfer the values with high efficiency! ;) c2.Value = c1.Value End Sub 
 Sub try() Dim c As Range Dim c1 As Range Set c = Workbooks(MASTER_FILE_NAME).sheets("azzeetr").Cells(25, 1) Set c1 = Workbooks(REPORT_FILE_NAME).sheets("dfdsfvsdfvs").Cells(10, 1) c.Value = c1.Value Set c = c.offset(1) Set c1 = c1.offset(1) End Sub 

记住“单元格”假设“activewrokbook.activesheet”。

要停止闪烁,你可以使用它(虽然它会停止工作簿的变化,这是一个很好的习惯,并应该改善性能):

 With Application.Excel .ScreenUpdating = False .DisplayStatusBar = False .Calculation = xlCalculationManual .EnableEvents = False End With 

为了回答你关于同时参考的问题,不,不可能完全同时,但皮埃尔是正确的:

 Set c = Workbooks(MASTER_FILE_NAME).sheets("azzeetr").Cells(25, 1) Set c1 = Workbooks(REPORT_FILE_NAME).sheets("dfdsfvsdfvs").Cells(10, 1) 

使用这个你不会在活动页面之间改变,只是在不同的书中引用单元格。

我会用这个:

 With Application.Excel .ScreenUpdating = False .DisplayStatusBar = False .Calculation = xlCalculationManual .EnableEvents = False End With Set c = Workbooks(MASTER_FILE_NAME).sheets("azzeetr").Cells(25, 1).offset(1,0) Set c1 = Workbooks(REPORT_FILE_NAME).sheets("dfdsfvsdfvs").Cells(10, 1).offset(1,0) c.Value = c1.Value With Application.Excel .ScreenUpdating = True .DisplayStatusBar = True .Calculation = xlCalculationAutomatic .EnableEvents = True End With