2011-09-14 4 views
1

지금 통합 문서에는 하나의 마스터 시트와 30 가지 개별 시트가 있습니다. 모든 개인은 똑같은 포맷으로되어 있으며 회사 내의 여러 부서에 대한 정보 만 가져옵니다. 하나의 템플릿 워크 시트에 대한 모든 개별 시트를 없애기 위해 각 부서의 정보를 가져 오는 데 사용하는 매크로를 통합하는 방법이 있습니까? 특정 부서의 매크로를 실행할 때 템플릿을 기반으로 새 워크 시트를 열고 내 현재 매크로가 새 워크 시트에 가져 오는 정보를 넣도록 변경하고 싶습니다. 내가 마스터 워크 시트에서 끌어 지금 사용하는 것은 다음과내 통합 문서의 작동 방식을 재검토하려합니다.

Sub DepartmentName() 

    Dim LCopyToRow As Long 
    Dim LCopyToCol As Long 
    Dim arrColsToCopy 
    Dim c As Range, x As Integer 

    On Error GoTo Err_Execute 


    arrColsToCopy = Array(1, 3, 4, 8, 25, 16, 17, 15) 'which columns to copy ? 
    Set c = Sheets("MasterSheet").Range("Y5") 'Start search in Row 5 
    LCopyToRow = 10 'Start copying data to row 10 in DepartmentSheet 

    While Len(c.Value) > 0 

     'If value in column Y ends with "2540", copy to DepartmentSheet   
     If c.Value Like "*2540" Then 

      LCopyToCol = 1 

      Sheets("DepartmentSheet").Cells(LCopyToRow, LCopyToCol).EntireRow.Insert shift:=x1Down 

      For x = LBound(arrColsToCopy) To UBound(arrColsToCopy) 

       Sheets("DepartmentSheet").Cells(LCopyToRow, LCopyToCol).Value = _ 
           c.EntireRow.Cells(arrColsToCopy(x)).Value 

       LCopyToCol = LCopyToCol + 1 

      Next x 

      LCopyToRow = LCopyToRow + 1 'next row 

     End If 

     Set c = c.Offset(1, 0) 

    Wend 

    'Position on cell A5 
    Range("A5").Select 

    MsgBox "All matching data has been copied." 

    Exit Sub 

Err_Execute: 
     MsgBox "An error occurred." 

End Sub 

내가 위에서 수행 정확하게 방법을이 템플릿을 열리도록이에 뭔가를 삽입 한 다음 정보를 게시하고 싶습니다.

+0

부서의 정보로 새 통합 문서를 만들거나 마스터 목록과 같은 통합 문서 안에 템플릿 시트 만 복사 하시겠습니까? –

+0

기본적으로 후자입니다. 통합 문서에 항상 두 장의 시트가 포함되도록하고 싶습니다. 맨 위 시트는 마스터이고, 맨 아래 시트는 템플릿입니다. 그런 다음 특정 부서의 매크로를 실행하면 새 (세 번째) 워크 시트가 열려야 템플릿과 똑같이 보이고 작동하며 마스터 시트의 정보를 기존 매크로에서 가져 오는 것과 똑같이 가져옵니다. – Jon

+0

+1 아주 좋은 생각입니다. 단일 프리젠 테이션 시트 만들기! – Reafidy

답변

0

EDIT2 : 옵션은 다른 모든 부서 시트

Sub Tester() 
    CreateDeptReport "2540"  'just recreates the dept sheet 
    'CreateDeptReport "2540", True 'also removes all other depts 
End Sub 


Sub CreateDeptReport(DeptName As String, Optional ClearAllSheets As Boolean = False) 

    Const TEMPLATE_SHEET As String = "Report template" 'your dept template 
    Const MASTER_SHEET As String = "MasterSheet" 

    Dim shtRpt As Excel.Worksheet, shtMaster As Excel.Worksheet 
    Dim LCopyToRow As Long 
    Dim LCopyToCol As Long 
    Dim arrColsToCopy 
    Dim c As Range, x As Integer 
    Dim sht As Excel.Worksheet 

    On Error GoTo Err_Execute 

    arrColsToCopy = Array(1, 3, 4, 8, 25, 16, 17, 15) 'which columns to copy ? 

    Set shtMaster = ThisWorkbook.Sheets(MASTER_SHEET) 
    Set c = shtMaster.Range("Y5") 'Start search in Row 5 

    LCopyToRow = 10 'Start copying data to row 10 in DepartmentSheet 

    While Len(c.Value) > 0 
     'If value in column Y ends with dept name, copy to report sheet 
     If c.Value Like "*" & DeptName Then 

      'only create the new sheet if any records are found 
      If shtRpt Is Nothing Then 
       For Each sht In ThisWorkbook.Sheets 
        If sht.Name <> MASTER_SHEET And sht.Name <> _ 
                TEMPLATE_SHEET Then 
         If ClearAllSheets Or sht.Name = DeptName Then 
          Application.DisplayAlerts = False 
          sht.Delete 
          Application.DisplayAlerts = True 
         End If 
        End If 
       Next sht 

       ThisWorkbook.Sheets(TEMPLATE_SHEET).Copy after:=shtMaster 
       Set shtRpt = ThisWorkbook.Sheets(shtMaster.Index + 1) 
       shtRpt.Name = DeptName 'rename new sheet to Dept name 
      End If 

      LCopyToCol = 1 
      shtRpt.Cells(LCopyToRow, LCopyToCol).EntireRow.Insert shift:=xlDown 

      For x = LBound(arrColsToCopy) To UBound(arrColsToCopy) 

       shtRpt.Cells(LCopyToRow, LCopyToCol).Value = _ 
          c.EntireRow.Cells(arrColsToCopy(x)).Value 

       LCopyToCol = LCopyToCol + 1 

      Next x 

      LCopyToRow = LCopyToRow + 1 'next row 
     End If 
     Set c = c.Offset(1, 0) 
    Wend 

    Range("A5").Select 'Position on cell A5 
    MsgBox "All matching data has been copied." 
    Exit Sub 

Err_Execute: 
     MsgBox "An error occurred." 
End Sub 
+0

나는 아침에 그것을 더 많이 할 것이다. 회의에서 5,하지만 바로 나가 그것을 실행하려고하면 오류 메시지가 발생하고 있어요. 나는 내일 아침 더 깊이 볼 것이다. 빠른 답변 감사합니다. :) – Jon

+0

나는 그것을 테스트하지 않았으므로 약간의 조정이 필요할 수도 있습니다 ... –

+0

마침내 이것에 대해 살펴볼 기회가 생겼고 처음으로 "잘못된 인수 번호 또는 유효하지 않은 속성 할당"오류가 발생했습니다 부분 : Sub Tester() CreateDeptReport "2540" – Jon

1

이 코드는 당신이 필요로하는 무엇을해야합니까를 제거하려면 :

Sub Test() 
    CreateDepartmentReport ("2540") 
End Sub 
Sub CreateDepartmentReport(strDepartment) 

    Sheets("DepartmentSheet").UsedRange.Offset(10).ClearContents 

    With Sheets("MasterSheet").Range("C4", Sheets("MasterSheet").Cells(Rows.Count, "C").End(xlUp)) 
     .AutoFilter Field:=1, Criteria1:="=*" & strDepartment, Operator:=xlAnd 
     .SpecialCells(xlCellTypeVisible).EntireRow.Copy Sheets("DepartmentSheet").[A10] 
    End With 

    With Sheets("MasterSheet") 
     If .AutoFilterMode Then .AutoFilterMode = False 
    End With 

    Sheets("DepartmentSheet").Range("B:B,E:G,I:X").EntireColumn.Hidden = True 

    MsgBox "All matching data has been copied.", vbInformation, "Alert!" 

End Sub 

주 : 대신 새 프레젠테이션 시트를 얻을 수 있도록 템플릿 시트를 대처, 템플릿 시트를 원하는대로 설정하면 위의 코드에서 새 데이터를 복사하기 전에 데이터를 지울 수 있습니다. 특정 열만 복사하는 대신 코드는 프레젠테이션 시트에서 원하지 않는 열을 숨 깁니다.

+0

나는 그 아이디어가 마음에 들지만, 그것은 내 템플릿에 하나의 주요한 문제를 야기하고있다. 10 행 이상에서는 모든 것이 고정되어 있으며 다양한 헤더, 병합 된 셀 및 요약 차트가 포함되어 있습니다. 매크로를 실행하면 정보가 잘 전달되고 필자가 원하지 않는 것을 필터링하지만 전체 행을 숨기므로 시트의 맨 위 부분을 잘라내고 있습니다 (필요한 곳). :) 그게 내가 주로 가진 일을하는 이유 였어. 선택된 정보를 가져 왔지만 얼어 붙은 부분을 만지지는 않아. 10시에 만나기는하지만 점심 식사 전에 다시 들러서 먹습니다. :) – Jon

+0

코드가 행을 숨기지 않습니다. 그게 무슨 뜻인지 모르겠습니다. 이 코드는 언제 어디서나 원하는 데이터를 놓고 원하는 데이터를 남길 수 있습니다. 그냥 내버려두고 자하는 범위를 정확히 알려줘 야합니다. 현재 코드는 데이터를 부서 시트 행 10에 복사하고 있습니까? 너가 원하는게 그거야? 행 10 위의 정보를 변경하지 않습니다. 행 10 위의 잘못된 열을 숨기는 것이 문제라면 마스터 시트와 일치하도록 템플릿을 조정하거나 일치하는 빈 열을 지정해야합니다. – Reafidy

관련 문제