2016-10-11 2 views
1

보고서 파일의 데이터를 마스터 파일로 이동하는 매크로를 작성하고 있습니다. 내 초기 버전은 작동하지만 느리고 깜박입니다. 내가 Workbook.Activate()을 사용하고 있기 때문에 이것은 놀라운 일이 아닙니다. 초기의 단순성과 디버깅을 돕기 위해 의도적으로이 작업을 수행했습니다.VBA : 두 통합 문서의 셀을 동시에 참조하는 방법

그러나 제대로 작동 했으므로 Workbook.Activate()을 사용하지 않으려합니다.

두 개의 별도 통합 문서에있는 셀을 실제로 어떻게 항상 이동하지 않고도이 셀을 참조 할 수 있습니까? 처음에는 몇 가지 섬광을 신경 쓰지 않습니다. 그러나 그 후에는 더 이상 존재하지 않기를 바랍니다.

나는 간단한 테스트 하위에서 이것을 시도했다 :

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 

하지만 세 번째 블록은 단순히 설정 모두 보고서 파일에 세포를 가리 키도록 범위. 명명 된 범위를 사용해야합니까? 나는 정말로 그렇지 않다. 다른 방법이 있을까요?

답변

1

모든 화면 활동이되지 않습니다 (경우에만

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 
,536 : 당신은 당신은 단순히 당신이 사용하는 하나의 코드를 수 있도록 WorkbookWorksheet 객체를 생성한다

전송하는 많은 양의 데이터)가

또는 직접 셀 범위로이 작업을 수행 할 수 있습니다 이것에 대한

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 
+0

대단히 고마워요! – skiaddict1

2
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"로 가정합니다.

+1

감사합니다, 나는 암시 "activeworkbook.activesheet"가 몰랐어요 -하지만 (훨씬 더 효율적이고 빠른!) 지금 생각해 보면 이해가됩니다. – skiaddict1

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) 
Set c1 = Workbooks(REPORT_FILE_NAME).sheets("dfdsfvsdfvs").Cells(10, 1) 

그냥 다른 책에서 셀을 참조, 액티브 시트 사이에 변경되지 않습니다이 사용.

나는 이것을 사용하십시오 : 당신이 잠시 동안 화면 업데이트를 해제 .Activate 또는 .Select, 그래서 필요가 없습니다를 사용하지 않는 경우

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 
+0

여기에 '오프셋'을 사용하는 것을 좋아합니다 - 그 존재를 알지 못했습니다. 'blah.row + 1'보다 훨씬 쉽습니다! – skiaddict1

관련 문제