2016-10-06 4 views
4

이것이 가능한지 확실하지 않지만 웹에서 답변을 찾지 못했습니다. 셀에서 시트의 동적 참조 - VBA

나는 다른 사람들에 의해 채워집니다 하나의 템플릿 통합 문서 Schedule.xls을 만들어 personA, personBpersonC을 말한다. 각 통합 문서에서 동일한 범위를 복사하여 마스터 파일 Master.xls에 붙여 넣어 각 사용자의 정보를이 마스터 북으로 가져올 수 있어야합니다.

Master.xlsSchedule.xls을 채우는 사람과 동일한 수의 용지를 사용합니다.

예를 들어,이 3 인 : personA, personBpersonC으로 체재합시다. 그들은 자신의 스케줄을 생성하면

는, 그 정보를 얻기 위해 원하는 Master.xls에 복사하지만, 별도의 시트에 personA, personBpersonC 이름.

나는, Schedule.xls에서 셀을 설정하여이 작업을 수행 할 사람들이 personA, personBpersonC 사이의 값을 선택할 수 있습니다 A1을 말한다.

이렇게하면 Master.xls에 시트에 대한 동적 참조를 만들 수 있습니다. 매크로가 정보를 붙여 넣습니다.

`Range("B2.D5").Select 
Selection.Copy 
Workbooks.Open Filename:= _ 
    "C:\My Documents\Master.xlsx" 
Sheets(*REFERENCE*).Select 
Range("B2").Select 
ActiveSheet.Paste 
Range("A1").Select 
Application.CutCopyMode = False 
ActiveWorkbook.Save 
ActiveWorkbook.Close` 
난에 기록 할 시트를 설정하는 대신 참조의 작성해야 무엇

?

미리 감사드립니다.

+0

'PersonX'가 * Schedule.xls *에 참여했을 때 * Master.xls * (전체 UNC 경로)를 업데이트하면 다른 방법을 사용합니다. * Master.xls *에는 기본 템플릿 시트가 있습니다. 워크 시트 ** personX **가 마스터가 아닌 경우 시트 사본을 만들고 ** personX **로 이름을 바꾸고 일정에서 원하는 범위를 복사하십시오 그것에. 그러나 이것은 사람이 Master.xls에 대한 쓰기 권한이 있다고 가정합니다. – PatricK

+0

@ mmarinr이 질문에 답하고 있지만 코드 문제를 해결하지 못했습니다. 'Sheets (Range ("A1") .Value) .Select'를 사용하십시오. 그러나'Select ','Selection'과'ActiveSheet'를 사용하지 않는 편이 낫습니다. –

+0

'Schedule.xls' 파일에'ComboBox'와 같은 것이 있습니다. 그런 다음'Workbook_Open'에서'Master.xls'에있는 모든 시트로 콤보 상자를 채 웁니다. 사람이 자신의 이름을 찾지 못하면 이름을 입력하기 만하면됩니다. 그런 다음'Schedule.xls'의'Workbook_BeforeClose'에서'Master.xls'를 업데이트하십시오. 사용자를위한 시트가 없으면 시트를 추가 한 다음 정보를 추가하십시오. @ShaiRado가 추천 한 것처럼,'Select'와 같은 것을 사용하지 않도록하십시오. 어떻게하면 '워크 시트'와 다른 엑셀 객체를 사용할 수 있는지 살펴보십시오 – Zac

답변

0

간단하고 코드가없는 방식을 제안합니다. 그런 다음 특정 요청에 대한 VBA 코드를 알려 드리겠습니다.

단순함을 위해 두 개의 통합 문서 인 Carl 's SlaveWB.xlsx와 Master.slxm을 같은 폴더에 넣으십시오. 두 스프레드 시트에서 동기화하려는 워크 시트 (단방향 복사)를 엽니 다. 이 간단한 예제를 위해이 시트를 수동으로 작성하십시오. 이제 마스터 시트의 A1 셀을 클릭하십시오. 편집 모드에서 "="을 입력 한 다음 Carl의 워크 시트 (다른 ​​통합 문서)의 A1 셀을 클릭하십시오. 이제 시트가 연결되었습니다. 이 작업은 A1뿐 아니라 전체 워크 시트에서 수행 할 수도 있습니다. A1 셀을 전체 워크 시트에 복사/붙여 넣기하면됩니다. 이제 Carl은 직장에서 그의 워크 북을 탈 수 있습니다. 그가 체크인하는 방법은 다음과 같습니다. 그는 자신의 최신 통합 문서를 미리 지정된 폴더에 복사하기 만하면됩니다. 마스터 통합 문서를 열면 Carl의 "체크인"통합 문서의 모든 데이터가 자동으로 입력됩니다.

한 통합 문서에서 다른 통합 문서로 복사 (서식을 캡처하는)를 원한다면 어렵지 않습니다.

먼저 master의 이전 "Carl"워크 시트의 이름을 바꾸거나 삭제하십시오. 다음은 워크 시트를 이름별로 삭제하는 코드입니다. 마스터의 시트 이름이 Carl의 "Sheet1"워크 시트 인 A1 셀에 저장되어 있으면 WSName : Workbooks ("SlaveWB") 시트 (Sheet1)의 값으로 전달할 수 있습니다.).값.

'DeleteWorksheet(WSName) 
Public Function DeleteWorksheet(WSName As String) 
    'If Not IIf(IsNull(DebugMode), False, DebugMode) Then On Error GoTo FoundError 
    If Not Range("DebugMode").Value Then On Error Resume Next 

    Dim WorksheetExists As Boolean 
    DeleteWorksheet = False 

    'if no worksheet name provided, abort 
     If Len(WSName) < 1 Then Exit Function 

    'if worksheet exists, delete 
     WorksheetExists = False 
     On Error Resume Next 
     WorksheetExists = (Sheets(WSName).Name <> "") 'if worksheet exists, set WorksheetExists = True 
     On Error GoTo FoundError 
     If WorksheetExists Then Sheets(WSName).Delete 'if worksheet exists, delete 
     DeleteWorksheet = True 'function succeeded (deleted worksheet if it existed) 

    Exit Function 
FoundError: 
    On Error Resume Next 
    DeleteWorksheet = False 
    Debug.Print "Error: DeleteWorksheet(" & WSName & ") failed to delete worksheet. " 
End Function 

다음으로, 마스터에 칼의 통합 문서에서 수정 된 워크 시트를 복사합니다. 아래의 코드는 srcWBName에서 tgtWBName으로 워크 시트를 복사하고 tgtWBName에 원하는 시트 이름을 지정합니다. 스프레드 시트에만 코드를 보관하시기 바랍니다.모든 사용자가 보유한 모든 사본에 동일한 코드를 넣는 것은 너무 위험합니다. 그리고 코드 업데이트를 관리하기가 어려울 것입니다.

Sub CopyWSBetweenWBs(srcWBName As String, srcWSName As String, _ 
        tgtWBName As String, tgtWSName As String) 

    'srcWBName - name of PersonA's workbook 
    'srcWSName - name of worksheet to copy from Person A's workbook 
    'tgtWBName - target workbook, the master 
    'tgtWSName - what you want to call the worksheet after copying it to the target/master. 
    '   If you want this sheetname to be taken from a cell, just pass the cell 
    '   reference. For example, this can be 
    '   Workbooks(srcWBName).Sheets(srcWSName).Cells(1,1).Value 

    Dim srcWB As Workbook 
    Dim srcWS As Worksheet 
    Dim tgtWB As Workbook 
    Dim tgtWS As Worksheet 

    'Create XL objects 
    Set srcWB = Workbooks(srcWBName) 
    Set srcWS = srcWB.Worksheets(srcWSName) 

    Set tgtWB = Workbooks(tgtWBName) 
    Set tgtWS = tgtWB.Worksheets(tgtWSName) 

    ' Start at the source 
    srcWB.Activate 
    srcWS.Activate 

    ' Copy to target workbook 
    srcWS.Copy Before:=tgtWB.Sheets(1) '<~~ copy to beginning of workbook 
    ' After copying the worksheet, it is active, so you can rename it now. 
    ActiveSheet.Name = tgtWSName 


End Sub 

그게 전부입니다. 이게 도움이 되길 바란다.

관련 문제