4월 6 2015
엑셀(EXCEL) – 일정한 간격의 행과 임의의 열들을 추출하는 법
http://www.clien.net/cs2/bbs/board.php?bo_table=lecture&wr_id=266028&page=2&sca=&sfl=&stx=&spt=0&page=2&comment_page=last&cwin=#c_266501
데이터에서 일정한 간격의 행과 또 다른 일정 간격의 열을 추출하는 팁을 올렸는데 댓글에서 초코코님이
일정한 간격의 행에서 랜덤한 열들을 추출할 수 없는지가 문의가 있었습니다. 쉽게 생각해서 접근했는데
Listbox의 열의 한계가 10개 임으로 Offset함수를 사용할 경우 List중간 중간이 비어서 보기도 싫고
내용도 많이 들어가지 못해서 이 랜덤한 열을 어떻게 처리할 지 고민하다가 10년은 늙은 듯 해요… ㅠㅠ
자! 아래 내용 설명 들어갑니다. 코드는 짧지만 코드 처리 부분이 너무 힘들었어요.
우선 개발도구> Visual Basic 선택하시고 UserForm1을 하나 만듭니다.
Listbox1, Listbox2, Textbox1, Commandbutton1, Commandbutton2, Label1을 UserForm1에 만듭니다.
각각의 내용에 아래 함수 붙여 넣으시고 실행하시면 됩니다. 자료는 INT(RAND()*10000)으로 생성함.
Listbox1의 속성창에서 MultiSelect 는 fmMultiSelectMulti로 선택합니다. 다중 선택을 위해서입니다.
Listbox2의 ColumnCount는 10으로 최대한 주고, ColumnWidths는 60pt로 전체를 다 조정합니다.
Option Explicit
‘ 아래 함수에서 참조할 내용을 public으로 정의해서 사용합니다.
Public row_cnt As Integer, col_cnt As Integer, sel_cnt As Integer
‘ 사용자 정의폼을 초기화 합니다.
Private Sub UserForm_Initialize()
Dim i As Integer
Dim rng As Range
Sheets(“Data”).Select
‘ 데이터가 들어간 행의 갯수를 구함
row_cnt = Application.CountA(Range(“A1”, Range(“A1”).End(xlDown)))
‘ 데이터가 들어간 열의 갯수를 구함
col_cnt = Application.CountA(Range(“A1”, Range(“A1”).End(xlToRight)))
‘ Listbox1에 추출할 데이터 내용 추가
For i = 0 To col_cnt – 1
‘ A1셀에서 오른쪽으로 전체 열의 수만큼 이동하면서 추가
‘ 추출할 내용을 Listbox1에 추가하는 루틴임.
For Each rng In Range(“A1”).Offset(0, i)
UserForm1.ListBox1.AddItem rng
Next rng
Next i
‘ Time은 항상 선택되므로 선택을 기본으로 함
UserForm1.ListBox1.Selected(0) = True
End Sub
‘ Data 추출 루틴입니다.
Private Sub CommandButton1_Click()
Dim i As Integer, j As Integer, k As Integer, ccnt As Integer, runit As Integer
runit = UserForm1.TextBox1.Value
i = 0
j = 0
k = 0
ccnt = 0 ‘ 리스트 박스에 나타날 위치를 정해주는 변수, 중간에 값들이 비어서 offset함수만 사용하면
‘ 데이터가 리스트 박스 중간중간이 비어서 보기 싫고 Listbox가 10열밖에 Data를 넣을 수 없어
‘ 효율이 떨어짐
sel_cnt = 0 ‘ Listbox1에 선택되어진 리스트의 갯수
‘속도를 빠르게 하기 위해서 업데이트를 하지 않고 추출 진행
Application.ScreenUpdating = False
For i = 0 To UserForm1.ListBox1.ListCount – 1
If UserForm1.ListBox1.Selected(i) = True Then
sel_cnt = sel_cnt + 1 ‘ 선택된 리스트의 갯수를 확인, Listbox2의 위치 선정을 위해 계산
End If
Next i
‘ 선택한 데이터가 10개가 넘으면 경고
If sel_cnt > 10 Then
MsgBox “선택한 데이터가 10개가 넘어요”
Exit Sub
End If
UserForm1.ListBox2.Clear ‘ 기존 추출된 Data 삭제
UserForm1.ListBox2.AddItem “” ‘ 추출할 데이터 제목 최상단에 추가
‘ 제일 힘든 루틴이었어요. Listbox 열의 크기가 10개 밖에 넣질 못해서 그냥 offset로 데이터를 추출할 수는 있지만
‘ 선택되지 않은 데이터의 열들이 비고 10이 넘어가는 데이터는 추출을 하지 못해서 로직 짜느라 10년은 늙은 듯 …
‘ 더욱이 추출하는 데이터가 랜덤이라 수열을 만들 수도 없고 해서 ㅠㅠ
For j = 0 To UserForm1.ListBox1.ListCount – 1
If UserForm1.ListBox1.Selected(j) = True Then
ccnt = (ccnt Mod sel_cnt) + 1 ‘ 핵심 루틴, 잘 해석해서 보세요
UserForm1.ListBox2.List(0, ccnt – 1) = Range(“A1”).Offset(0, j)
End If
Next j
‘ 데이터를 추출하는 루틴입니다. 위는 제목 행을 추출하는 루틴이구요.
‘ 첫 행을 임의로 추가 추출하고 싶으시면 runit – 1 부분을 0으로 대치하시면 됩니다.
For i = runit – 1 To row_cnt Step runit
UserForm1.ListBox2.AddItem “”
For j = 0 To UserForm1.ListBox1.ListCount – 1
If UserForm1.ListBox1.Selected(j) = True Then
ccnt = (ccnt Mod sel_cnt) + 1 ‘ 핵심 루틴, 잘 해석해서 보세요
UserForm1.ListBox2.List(k + 1, ccnt – 1) = Range(“A2”).Offset(i, j)
End If
Next j
k = k + 1
Next i
End Sub
‘ 추출된 데이터를 시트에 뿌려줍니다.
Private Sub CommandButton2_Click()
Dim i As Integer, j As Integer
i = 0
j = 0
‘ 속도를 빠르게 하기 위해서 업데이트 제한, 아래를 주석 처리하면 데이터가 넣어지는 것이 보임
Application.ScreenUpdating = False
‘ 추출할 데이트를 담을 시트 선택
Sheets(“ExtItem”).Select
‘ 기존 추출된 데이터 삭제
Range(“A1”, Range(“A1”).End(xlToRight)).End(xlDown).Clear
‘ 추출한 데이터 시트에 넣기, 자주 사용하는 루틴이므로 기억해 두면 좋음
For i = 0 To UserForm1.ListBox2.ListCount – 1
For j = 0 To UserForm1.ListBox2.ColumnCount – 1
Cells(i + 1, j + 1) = UserForm1.ListBox2.List(i, j)
Next j
Next i
‘ 짠~하고 업데이트된 데이터 보이기
Application.ScreenUpdating = True
Unload UserForm1
End Sub
첨부자료) 20150406-일정행-임의열 데이터 추출
전체 소스는 위 내용이므로 직접 실습하시면서 만들어 보시는 것도 실력향상에 도움이 될 것 같네요.
4월 7 2015
칼이나 가위는 자르는 도구지만 그 쓰임새는 다릅니다.
여기 팁란에 엑셀의 초급이나 중급자분에게 업무를 진행하면서 노가다? 단순 작업을 간단하게
할 수 있도록 몇 가지 팁들을 올렸는데 댓글에서 여러 의견들이 있었습니다. 엑셀 내장함수들을
사용해서 간단하게 할 수 있는데 굳이 VBA를 사용해서 할 필요가 있느냐? 등의 의견들이지요.
칼과 가위는 자르는데 사용하는 도구이지만 사용하는 곳이 다른 법입니다. 그것을 적절하게
잘 사용하는 것이 제일 좋은 법이지만, 칼이 편할 수도 있고 가위가 편할 수도 있는 것이지요.
칼도 한쪽으로만 자를 수 있는 도가 편할 수도, 양날로 자를 수도 있는 검이 편할 수도 있지요.
수학에서 이차 방정식을 풀 때 근의 공식을 사용할 수도 있지만 미분으로 쉽게 풀 수도 있고
원과 선의 접선과 같은 문제를 풀 때 x, y 함수를 잘 사용할 수도 있지만 Sin, Cos의 특성을
응용하여 삼각함수를 이용해서 풀 수도 있는 문제지요. 닭 잡는데 소 잡는 칼을 사용하는 바보?
엑셀에서 VBA로 일정한 간격의 행과 임의의 열들을 선택하여 데이터를 추출하는 팁
http://www.clien.net/cs2/bbs/board.php?bo_table=lecture&wr_id=266554
이제 내장?함수를 응용해서 풀어봅니다. 5초의 간격마다 데이터를 가져 오는 경우입니다.
팁에 올려 놓은 엑셀에서 자료보기 편하게 번갈아 가면서 행 배경색 자동으로 넣기입니다.
http://www.clien.net/cs2/bbs/board.php?bo_table=lecture&wr_id=265108&page=4
응용해 볼까요? 만약에 제목을 빼고 5행마다 셀의 배경색을 칠하는 방법입니다.
=IF(MOD(ROW(A6)-1,5)=0,1,0)
제목행을 계산해서 현재 행의 위치를 ROW( A6)-1 을 5로 나누어서 그 나머지가 0과 같으면
지정한 색으로 색칠하고 아니면 흰색으로 배경색을 만드는 것입니다. 즉 5의 배수마다 각행의
색상을 칠하는 것이지요. 조건부 서식을 복사해서 데이터가 있는 전체 셀에 붙여넣기합니다.
이제 데이터를 추출하는 방법입니다. 데이터 > 필터에서 셀 배경색으로 필터를 선택합니다.
(PC에서는 홈>정렬 및 필터 > 필터 > 색기준 필터이군요. 전 Mac사용자라서 …)
데이터 전체를 선택하고 위의 셀 배경색으로 필터를 하면 조건부 서식에서 지정된 배경색만
필터링해서 보여줍니다. 그리고 추출할 열만 남기고 나머지 열을 숨깁니다.
F5를 눌러 옵션에서 화면에 보이는 셀만 복사하기를 선택합니다.
http://www.be4u.kr/wp/?p=1259
자! 우리가 VBA를 이용해서 일정행과 임의의 열들을 추출하는 법과 엑셀의 내장함수들을
응용해서 추출한 결과가 똑같은 것을 알 수 있습니다. 칼을 사용하느냐 가위를 사용하느냐?
사용자의 편한 방법으로 내가 필요한 데이터를 빠른 시간에 추출하는 것이라고 생각합니다.
가끔씩 오는 택배 박스나 같이 온 편지를 열 때는 손이가 가위, 칼 어느 것으로나 열면! 되지만
식당에서 매일 하는 깍두기를 썰 때는 큰 칼을 퀼트할 때 천을 자를 때는 재단용 가위를 사용하는
것이 더 합당하다고 봅니다. 그 하는 일에 적당한 도구를 사용하는 것이지요.
즉 임시적으로 처리할 때는 어떻게든 빨리 처리되는 방법으로 하면 되지만 그 일이 정형화되면
도구를 사용해고 일의 처리 방법을 절차로 만들어 프로세스화 하자는 것입니다.
결론?
칼과 가위 녹슬지 않도록 잘 씻어서 기름칠 잘해 둡시다. 그리고 서로 서로 나누며 삽시다!
By vinipapa • 무른모 • 0 • Tags: 도구, 응용, 최적화, 칼과 가위