9월 15 2015
엑셀(EXCEL) – Pivot Table을 이용한 수업 중복 체크 및 몇가지 팁
엑셀에서 데이터와 문서라는 개념을 정립하고 시작하지 않으면 초기의 작은 데이터들은 문제가
없지만 데이터의 양이 많아지면 관리의 문제가 생깁니다. 저의 데이터와 문서라는 개인적인 구분은
열의 개념을 필드로 보고 행을 데이터로 정의합니다. 아래 질문에 첨부된 이미지 처럼 된 부분을 저는
문서라고 정의하고 일을 하고 있습니다. 사람이 보기 편한 데이터의 집합이지요.
http://www.clien.net/cs2/bbs/board.php?bo_table=kin&wr_id=3528009
(중복 되는 것을 확인하는 방법이 있을까요?)
이 팁의 첨부된 그림처림 왼쪽 부분은 문서, 오른쪽 부분을 데이터라 정의하고 시작해 봅시다.
위의 질문의 그림처럼 문서로 보고 데이터를 분리하고 해석하려면 상당히 많은 고민을 하고 한계가
있는 것도 사실입니다. 생각을 바꾸어서 이 문서를 데이터로 만들어 봅시다. 필드로 교수, 시간, 요일
내용으로 4개의 필드를 만들고 데이터를 입력해 봅니다.
일단 왼쪽과 같이 중복된 항목은 입력하지 않고 A교수의 요일별 시간별 강의대상을 입력해 봅시다.
그런데 엑셀보고 일을 시키려면 사람이 보기 좋은 것 보다는 컴퓨터가 보기 좋고? 처리하기 쉽도록
데이터형식으로 만들어 주어야 합니다. 몇 교수님의 내용이면 그냥 채우기하면 좋겠지만 사람이
많이지면 채우는 것도 힘들어집니다. 이제 게을러져야 합니다.^^;;; 자동채우기 루틴입니다.
내용을 보시면 아시겠지만 채워야할 영역과 그 영역의 끝을 판단할 컬럼을 선택해서 채우는 것입니다.
Option Explicit
Sub Fill_Data()
Dim RngCel As Range
Dim OffsetCol As Integer
Set RngCel = Application.InputBox(“시작셀 선택”, , Type:=8)
OffsetCol = InputBox(“비교 칼럼 입력”)
Do
If IsEmpty(ActiveCell.Value) Then
ActiveCell.Value = ActiveCell.Offset(-1, 0).Value
ActiveCell.Offset(1, 0).Activate
Else
ActiveCell.Offset(1, 0).Activate
End If
Loop Until IsEmpty(ActiveCell.Offset(0, OffsetCol).Value)
End Sub
반대로 데이터들을 보기좋게 문서화 하기 위한 루틴입니다. 아래로 중복되는 행을 지워서 보기좋게
문서화하는 과정입니다. 이것보다 더 사람이 보기 좋은 것은 질문란의 이미지와 더 비슷하겠지요.
Sub UnFill_Data()
Dim TempStr As String
Dim RngAll As Range
Dim RngCell As Range
Set RngAll = Application.InputBox(“영역 선택”, , Type:=8)
TempStr = “초기값”
For Each RngCell In RngAll
If TempStr = RngCell.Value Then
If Len(RngCell.Offset(1, 0).Value) > 0 Then
RngCell.Value = “”
End If
ElseIf TempStr <> RngCell.Value Then
TempStr = RngCell.Value
End If
Next
Set RngAll = Nothing
Set RngCell = Nothing
End Sub
이제 위 문제를 다른 시각으로 해석해 봅니다. 댓글에 좋은 내용이 담기고 상당한 논리적 접근이 필요한데
4가지 정도는 2^n 16개로 쉽지만 몇 개가 더 늘어나면 논리도 논리이고 힘들어 지는 것이 사실입니다.
그래서 엑셀의 기능의 종결자라고 하는 Pivot을 이용해 봅니다. 논리는 합계가 1보다 크면 중복이라는 것을
잘 활용해 무엇이 중복이 되는지를 파악해야 합니다.
Sub CreatePivotTable()
Dim pvtPCache As PivotCache
Dim pvtPTable As PivotTable
Dim pvtFld As PivotField
Dim shtSheet As Worksheet
Dim rngStart As Range
Set rngStart = Sheets(“Data”).[A2]
‘ 기존 중첩체크용 시트 삭제
For Each shtSheet In ThisWorkbook.Sheets
If shtSheet.Name = “PivotSheet” Then
Application.DisplayAlerts = False
shtSheet.Delete
Application.DisplayAlerts = True
End If
Next shtSheet
‘ 새로운 시트 작성
Worksheets.Add.Name = “PivotSheet”
Set pvtPCache = ActiveWorkbook.PivotCaches.Add _
(SourceType:=xlDatabase, _
SourceData:=rngStart.CurrentRegion.Address)
Set pvtPTable = pvtPCache.CreatePivotTable _
(TableDestination:=Sheets(“PivotSheet”).[A1], _
TableName:=”중첩체크”)
‘ 피봇 구성
With pvtPTable
.PivotFields(“내용”).Orientation = xlRowField
.PivotFields(“내용”).Position = 1
.PivotFields(“요일”).Orientation = xlColumnField
.PivotFields(“요일”).Position = 1
.PivotFields(“시간”).Orientation = xlColumnField
.PivotFields(“시간”).Position = 2
.AddDataField .PivotFields(“교수”), “개수:교수”, xlCount
‘ 전체요약 숨기기
.RowGrand = False
.ColumnGrand = False
End With
‘ 소계 부분 숨기기
With pvtPTable
For Each pvtFld In .PivotFields
pvtFld.Subtotals(1) = True
pvtFld.Subtotals(1) = False
Next pvtFld
End With
End Sub
해석하면 내용(반), 요일, 시간이 중복되는 교수님의 합을 구하는 것이 핵심입니다. 이렇게 되면 교수님이
몇 분으로 늘어나더라고 피벗 돌려서 중복되는 부분을 찾아 수정해 주면 됩니다. 교수님이 6분만 되어도
64가지 조건이 생기니 이것을 엑셀로 조건을 분리하는 것이 여간 힘든 일이 아닌 것을 알 수 있습니다.
피봇테이블에서 1보다 큰 숫자를 더블 클릭하면 중복된 교수님의 중복된 내용을 확인할 수 있습니다.
주저리 주저리 많이 써 놓았는데 문제를 바라보는 시각을 조금만 달리하면 데이터를 잘 활용할 수 있지만
문서로 보기 좋게 정리해 놓으면 보기는 좋은데 나중에는 가공하기가 힘들다는 것입니다. 그래서 서두에
써 놓았지만 데이터를 정리하는 시트는 시트대로 정리 후 이 데이터를 기반으로 가공하는 것이 훨씬 더
능률적이다는 것입니다.
첨부 화일 : 20150915-수업시간표 작성(중복금지체크)
9월 17 2015
엑셀(EXCEL) – 사용자 정의 꼬리말 설정(사용자 정보 인쇄)
일반적으로 엑셀에서 꼬리말의 경우 첨부된 이미지 상단처럼 페이지 번호, 전체 페이지, 날짜, 시간과
파일 경로, 이름, 그림 등을 추가할 수 있지만 미리보기의 아래처럼 사용자 이름, 로그온 IP 등과 같은
특수한 내용을 인쇄하기가 힘이 듭니다. 특히 보안에 관련된 문서의 경우 그 인쇄한 당사자가 누군지
확인할 수 있도록 Foot Print를 남기는 것이 중요하다고 봅니다.
http://www.clien.net/cs2/bbs/board.php?bo_table=kin&wr_id=3523980
([도움요청] 엑셀 바닥글 작성 . 갈켜주세요.. ㅠㅠ)
우선 VBA Editor여시고 Module 추가하시고 다음 소스 붙여넣기 합니다. 제가 올린 팁들에서 사용한
로그인 사용자 정보와 IP를 찾아내는 것입니다.
Option Explicit
Private Declare Function GetUserName Lib “advapi32.dll” Alias “GetUserNameA” _
(ByVal lpBuffer As String, nSize As Long) As Long
Function FindOutUserName() As String
Dim lpbuff As String * 12
Dim lngret As Long
Dim strUserName As String
On Error GoTo ET
lngret = GetUserName(lpbuff, 12)
strUserName = Left(lpbuff, InStr(lpbuff, Chr(0)) – 1)
FindOutUserName = Trim(strUserName)
Exit Function
ET:
FindOutUserName = “”
End Function
Public Function getIP()
Dim WMI As Object
Dim qryWMI As Object
Dim Item As Variant
Set WMI = GetObject(“winmgmts:\\.\root\cimv2”)
Set qryWMI = WMI.ExecQuery(“SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True”)
For Each Item In qryWMI
getIP = Item.IPAddress(0)
Next
Set WMI = Nothing
Set qryWMI = Nothing
End Function
이제 프린터할 꼬리말을 작성하는 루틴입니다. 간단하죠! 사용자 정보와 IP, 지금 프린트하는 시간을
중앙에 들어갈 꼬리말로 지정하는 것입니다. 다른 정보로 필요하면 왼쪽과 오른쪽 꼬리말로 지정해서
많은 정보가 들어갈 수 있도록 합니다. 왼쪽 꼬리말에 로고를 넣는 예제도 추가하였습니다.
Sub Custom_Footer()
Dim intTPage As Integer
Dim log_name As String, log_Ip As String
Dim DateStp As String, TimeStp As String
intTPage = ExecuteExcel4Macro(“Get.Document(50)”)
log_name = FindOutUserName
log_Ip = getIP
TimeStp = Format(Now(), “yyyy-mm-dd hh:mm:ss”)
With ActiveSheet.PageSetup
.CenterFooter = log_name & ” : ” & log_Ip & ” : ” & TimeStp
With .LeftFooterPicture
.Filename = “C:\Apple_logo.jpg”
.Height = 30
.Width = 30
End With
End With
ActiveSheet.PageSetup.LeftFooter = “&G”
End Sub
그리고 VBA Editor에서 ThisWorkBook을 더블클릭하시고 아래 코드를 넣어 줍니다. 내용은 프린터하기 전에
사용자 정의 루틴을 돌려서 기본 꼬리말의 내용을 대체하는 것입니다.
Option Explicit
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Call Custom_Footer
End Sub
상기 루틴들은 엑셀화일을 열때 Macro를 사용할 수 있도록해야 하므로 제한적으로 사용되지만 제가 올린
팁에 보면 엑셀화일을 열때 Welcome 시트만 보이도록 설정해서 무조적 매크로를 활성화해야 일을 시작?
할 수 있도록 하는 팁이 있습니다. 이것을 이용해서 프린터할 때 사용자 정의 꼬리말을 사용해서 프린트 한
내용을 확인할 수 있고 조금 더 추가하면 특정 시트를 숨겨서 인쇄 이력 관리도 가능합니다.
http://www.be4u.kr/wp/?p=2903 엑셀 화일을 지정 컴퓨터에서만 열 수 있게 하는 법
첨부 화일 : 20150916-사용자 정의 꼬리말(사용자 정보 인쇄)
By vinipapa • 무른모 • 0 • Tags: 꼬리말, 사용자 정의, 엑셀