블로그 이미지
이비그치면

태그목록

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

calendar

1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Excel Option 버튼에서 복수선택 VBA 처리

2011. 11. 22. 18:37 | Posted by 이비그치면

엑셀쉬트내에 옵션버튼은 복수개의 옵션버튼을 만들어도 선택은 하나만 할수있다
그런데 업무처리상 옵션그룹을 복수로 만들어야 할 경우가 있다

예를 들어 주간, 월간 선택
               A팀, B팀, C팀 중 선택

 
이런 경우 속성창을 열고 GroupName을 지정해주면 된다


작업구분을 JopTp   팀구분을 TeamTp등으로 지정하면 각각의 옵션선택이 가능하다

보고서작성 버튼에 할당된 모듈에서 이를 구분하여 처리하는 방법은 다음과 같다

Private Sub CommandButton1_Click()
Dim sJobTp as String
Dim oShape as Shape

For Each obj In Sheets("메뉴").OLEObjects
    If Obj.Name Like "*Option*" Then
        If obj.Object.GroupName = "JobTp" And obj.Object.Value = True Then
            sJobTp = obj.Object.Caption
            Exit For
        End If
    End If
Next

For Each obj In Sheets("메뉴").OLEObjects
    If Obj.Name Like "*Option*" Then
        If obj.Object.GroupName = "TeamTp" And obj.Object.Value = True Then
            test1 sJopTp, obj.Object.Caption
        End If
    End If
Next
엑셀 또는 워드 VBA 에서 String Array에 특정String이 있는지 확인 또는 
특정String의 위치값(Array Index) 확인

 BibleAbbr = Array("창", "출", "레", "민", "신", "수", "삿", "롯", "삼상", "삼하")
 Index = Application.Match("민", BibleAbbr, 0) 

If IsNumeric(Index) Then
    Debug.Print "Found!!!" & Index
Else
    Debug.Print "Error!!!"
End If

 

개발자의 경우 여러 DB툴(DB Tool)들 예를들어 TOAD, 골든(Golden), 오렌지(orange)등등을
이용하여 DB의 테이블에 있는 데이타들을 직접 ACCESS한다

그러나 업무일선의 사용자들은 데이타이용에 많은 제약을 받는다

원시적으로 화면의 데이타를 다시 수작업으로 입력하거나
약간 개선된 업무환경이라 하더라도 화면의 데이타를 덤프(Dump)하여 내려서
다시 가공하여 쓰거나 개발실(또는 전산실)에 요청하여 데이타를 작성해달라고
요청하는 정도이다

실제로 윗분들에게 보고하는 많은 자료는 엑셀로 데이타를 편집,가공하여
제출하는 일들이 빈번하기 때문에 이는 업무담당자에게 상당한 업무로드가
되고있다

사용자가 약간의 엑셀 VBA지식을 갖고 있다면 아래의 VBA를 이용하여
원하는 업무데이타를 데이타베이스에서 가져와 사용할 수 있고 어떤 경우
이것은 획기적인 업무생산성으로  연결될수도 있다


녹색으로 되어있는 부분을 선택하고
VBA창으로 가서 아래의 코드를 실행하는 방식으로 하면 된다

Sub test()

Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset

Set conn = New ADODB.Connection
Set rs = New ADODB.Recordset

conn.Open "Driver={Microsoft ODBC for Oracle};" & _
"Server=svr_name;" & _      'svr_name에 해당DB의 서버이름으로
"Uid=xxx;" & _                   'xxx에 접속 사용자 ID
"Pwd=yyy;"                       'yyy에 접속 패스워드

Set rng = Selection
For Each c In rng
    Sql = "select  sum(amount)  from abc_tbl " & _
      "where abc_date = '" & c.Cells(1, 2).Value & _
      "' and abc_id = '" & c.Cells(1, 1).Value

    rs.Open Sql, conn

    Set fld1 = rs.Fields(0)
    Do Until rs.EOF
        c.Cells(1, 3).Value = fld1.Value
        rs.MoveNext
    Loop
    rs.Close
   
Next

Set rs = Nothing
conn.Close
Set conn = Nothing

End Sub



엑셀 VBA 활용하여 파일 목록 작성 (File Lister)

2010. 9. 14. 11:21 | Posted by 이비그치면

요즘 하드디스크가 대용량이 되고
그리고 외장하드로 몇개씩 있다보니
하드에 많은 파일이 있게 되고 이를 매번 확인하기도 번거로운 일이 되었다
그래서 나름 색인작업을 해보려고 파일리스팅을 지원해주는  
몇몇 파일매니져 유틸리티를 찾아보다가(flyExplorer,  XYPlorer, Universal Explorer등) 
꼭 맘에 드는 것이없어 엑셀의 VBA로 직접 만들게 되었다


위의 파일을 다운받아 열어서
Sheet2에 가서 보면 아래와 같이 보인다

F2셀에 일련번호를 입력하고 F3셀에 드라이브문자를 입력하고 실행버튼을 누른다
실행하면 위의 일련번호로 이름붙인 쉬트(여기서는 001)가 하나 새로이 생성되고
거기에 외장하드(여기서는 F)에 있는 파일들이 리스팅된다  


















엑셀에서 필터를 사용하는 경우가 종종 있다
데이타 건수가 많을 때 필터를 적용하여

1) 데이타의 경우의 수를 확인할 수 있다

2)사용자가 원하는  특정 경우의 데이타만을 뽑아서 보고자 하는 경우 유용하게 
사용할 수 있다


- 필터를 적용하는 방법
   . 데이타가 있는 행의 셀중 임의의 셀 하나를 선택한다
   . 데이타 탭의 필터 아이콘을 누른다
   . 데이타 타이틀에 드롭다운 아이콘이 나타난다
   . 드롭다운아이콘을 눌러 원하는 값을 찾아 적용한다

- 필터를 해제하는방법
   . 데이타 탭의 필터 아이콘을 누른다(토글방식으로 해제와 적용이 번갈아 적용된다) 

이런 필터의 기능을 VBA에서 이용하는 방법을 소개한다

1)  중복데이타제거



아래의 코드를 VBA창에서 실행시키면
좌측에 있는 데이타에서 중복이 제거된 결과가
우측 그림과 같이 나타난다

Sub RemoveDupes()

Columns(1).EntireColumn.Insert '같은 데이타 제거후 결과를 넣기 위해 Column 추가
Range("B1", Range("B65536").End(xlUp)).AdvancedFilter _
Action:=xlFilterCopy, _
CopyToRange:=Range("A1"), _
Unique:=True '중복값을 제거하고 결과를 A열에 넣는다
'Columns(2).EntireColumn.Delete '원데이타열을 삭제한다

End Sub

2) 조건충족데이타 추출



아래의 코드를 VBA창에서 실행시키면
그림의 중간에 있는 데이타에서 좌측에 입력한 추출조건에 의해
추출된 결과가 우측의 결과물과 같이 나타난다

Sub ExtractSame()
Dim CritRng As String
Sheets("Sheet1").Activate
CritRng = "A1:C3"
CritRng = Range(CritRng).Address  '필터링기준값이 들어갈 범위는 절대주소

Range("E1", "G12").AdvancedFilter _
Action:=xlFilterCopy, _
CriteriaRange:=Range(CritRng), _
CopyToRange:=Range("K1", "M1"), _
Unique:=False

End Sub


※※  코드에서  빨간색으로 되어있는 것에 주의  추출조건을 입력하는 범위는
        절대주소이어야 한다
        1행은 데이타의 타이틀과 같이 타이틀이 들어가야한다
        2행부터 추출조건 입력
        같은 라인은 AND, 다른 라인은 OR






















엑셀 2007에서 VBA 열기

2010. 9. 3. 15:18 | Posted by 이비그치면
1) Office 단추 
  클릭

2) 하단의 엑셀옵션 - 기본설정 - 리본메뉴에 개발도구탭표시에 체크 - 확인

3) 아래와 같이 개발도구 탭이 리본메뉴에 표시됨

4) VBA 창 활성화
    - 개발도구로 들어가서 VisualBasic이나 코드보기
    - Alt + F11

엑셀 VBA 낙찰(입찰) 예정가격 구하기

2010. 9. 2. 17:36 | Posted by 이비그치면
입찰공고문중

예정가격은 지방자치단체 원가계산 및 예정가격작성요령 과 전자입찰특별유의서에 따라 개찰전에 기초금액에 ±3% 범위내에서 입찰집행관이 랜덤정렬방식으로 15개의 복수예비가격을 확정하고, 다수 추첨된 복수예비가격 4개를 산술 평균한 금액으로 합니다.


15개중 4개를 취하는 조합(Combination)의 수 : 15C4 = 15P4 / 4! = 15!/(4!*(15 - 4)!)

1365

1) 조합된 수(1365가지)의 나열

2) 산술평균값을 구한다 : (P1+P2+P3+P4) / 4

3) 다수추첨 : 빈도(발생횟수)가 최다인 평균값을 구한다


각각의 일이 엑셀을 이용하여 한다고 하여도 수작업으로 한다면
15개의 예비가격중 4개를 선택하여 나열하는 일이 경우의 수가 많기 때문에
상당한 수고가 드는일이고
또 빈도를 세는 일도 만만치 않은 시간과 품이 드는 일이 될것이다

1) 조합된 수의 나열
    - 아래의 엑셀파일을 다운받은후 오픈한다
      
    - "Data" Sheet를 열어 예정가격 15개를 입력한다
    - VBA창을 열고 프로젝트창에서 모듈을 찾아 해당모듈(Module1)을 더블클릭
    - 첫번째 라인(Sub GetRow)에 커서를 위치
    - F5를 눌러 실행(또는 실행메뉴를 눌러 Sub/사용자 정의폼실행)
    - Sheet1을 열어보면 1365개의 조합이 만들어져 있슴을 확인할 수 있다

2) 산술평균값을 구한다 : (P1+P2+P3+P4) / 4
    - Sheet1의 E1 셀 선택
    - 수직Scroll을 이용하여 1365열로 이동
    - 마우스 커서를 E1365에 위치 -> Shift+Click
    - =SUM(A1:D1)/4*90% Ctrl+Enter   
       ※※ 90%까지 입력후 반드시 Ctrl+Enter!!! 
       부가세 포함된 예정가이므로 부가세 10%제외
   
3) 다수추첨 : 빈도(발생횟수)가 최다인 평균값을 구한다
    - 2)가 완료된 상태에서 Ctrl+C
    - Sheet2로 이동하여 A2 셀 선택 -> 마우스 오른쪽 클릭 ->선택하여 붙여넣기 ->
       -> 값에 체크 -> 확인
    - 마우스오른쪽 클릭 ->셀서식 -> 표시형식 ->숫자 -> 소수자릿수 0, 1000단위 체크
       -> 확인
    - 리본메뉴에서 데이타 탭 선택 -> 정렬 (오름차순)

    - 부분합 이용(데이타 탭) 
       . 셀 A1에 "발생횟수"라고  입력
       .  데이타탭의 부분합 클릭
       . 사용할 함수에서 개수 선택 -> 확인
       . 부분합 그룹선택에서 2번째 선택 - > 셀 A1에  "예상가격" 입력 
       . 발생횟수 최다인 것을 발생횟수 열에서 찾는다
    
    - 부분합결과물을 다른 쉬트로 복사한후 데이타 정렬하여 찾기
      . 결과물 Selection
      . Ctrl+G -> 옵션 -> '화면에 보이는 셀만 ' 체크 -> 확인 
      . Ctrl+C -> Sheet3으로 이동 -> 셀 A1선택 -> Ctrl+V
      . 데이타 선택 -> 열B로 정렬 -> 최다 발생횟수 확인

    - 발생횟수의 분포를 확인하기 위한 차트 그리기
       . Sheet2(부분합 쉬트)로 이동 -> A열 전체선택 -> Ctrl+F -> 바꾸기 탭 선택
          -> 찾을내용 '개수' 입력 -> 확인
       . 셀 A1 선택
       . 삽입메뉴에서 차트 선택 - > 분산형 4번째(직선및표식이있는분산형) 선택
       . 차트가 생성되면 해당차트위에 커서위치 -> 오른쪽마우스 클릭 -> 데이터선택
       . 최종데이타로 이동하여 커서위치하고 Shift+Click -> 데이터원본 선택 창에서 확인
       . 분포에서 최다발생횟수 확인
   
      
    


앞의 글에 소개드린 프로그램을 혹시 보신분들중에
소스 중간중간 나와있는 이상한 표현들로 어려움을 겪으신 분들을 위해
유틸리티 하나 소개해드릴까 한다

수식(Expression)이 일반숫자, 수의 상징적인 표현(예를 들어 x, y) 그리고 연산기호(+, -등)를 이용하여 숫자해를 구하는 문제를 간결하게 표현하기 위하여 고안된 체계라면

정규식(Regular Expression)은 텍스트(문자열)의 패턴/반복형태를 표현하기 위하여 상징적인 표현(Metacharacter 예를 들어 *, ?, .)과 일반문자들(literal, normal text characters)로
구성되는 텍스트 표현형식이라고 할수있겠다

여기에서 Regular는 정규로 번역이 되어있는데  반복적인 주기를 갖고있는 어떤 규칙을 형용하기 위한 단어이다

텍스트가 어떤 규칙을 가지고 반복될때 이 텍스트를 처리하기 위해서 정규식을 이용하면
아주 간결하게 표현이 가능하고 이 때문에 많은 프로그램언어가 이를 지원하고 있다

그런데 사실 이 정규식은 처음 보게되면 좀 암호같아서 그 의미를 이해하기가 어렵다
그리고 또 정규식을 만들어서 그 결과를 확인해보기 전에는 어덯게 처리될지 짐작이
어려운 경우도 많다

다음에 소개하는 유틸리티 프로그램은 
정규식 작성과 연습, 확인 그리고 오류의 발견및 수정에 아주 유용한 툴이다

Kodos --  http://kodos.sourceforge.net/

아래 화면 실제 사용예다

연재물의 연재회차와 제목을 주어진 텍스트에서 추출하려는 정규식을 테스트해보려고 한다
<938> 夫子之得邦家者인댄 所謂立之斯立하며  -- 이게 원하는 결과물이다
해당 텍스트를 Search String 에 입력한다(또는 Copy && Paste)
정규식을 Regular Expression Pattern에 입력
아래에 있는 Match 또는 Match All 탭을 눌러 결과 확인(결과가 파란글자로 나타난다)

간혹 데이타 입력시 셀크키를 넘는 데이타 입력시 어떻게 칸은 늘리지 않고 보이게할까 
고민한 적이 있었는데 ...

Alt + Enter

1) 셀범위지정
    - 마우스 왼쪽버튼 누른채로 끌기(가장 일반적이고 많이 사용)
    - Shift누르고 화살표(원하는방향으로)
    - Shift 누르고 커서 위치한 곳에서 왼쪽마우스버튼 Click
      (여러페이지에 걸쳐있는 데이타지정시 사용하면 편리)

2) 값 입력

3) Ctrl+Enter