블로그 이미지
이비그치면

태그목록

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

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

엑셀 VBA(EXCEL VBA)로 만든 사다리 타기

2011. 12. 16. 18:08 | Posted by 이비그치면
소스파일을 첨부한다 
VBA 프로그래밍에 관심있는 분은 참조하시길 바란다

 
  몇십라인밖에 되지 않는 간단한 소스이고 설명을 붙여놓아서

이해하기에는 그렇게 어렵지 않은 VBA 프로그램이다

사용방법 

다운받은 소스를 클릭하여 열면 보안경고가 뜨는데 옵션을 누르고

"이콘텐츠 사용"  선택하고 확인 버튼 누른후 Sheet2로 이동

참가요원옆의 셀에 참가인원수를 입력하고 엔터후

만들기 버튼을 누르면 인원수만큼 그려진다

사다리 상단에 옵션버튼이 있는데 선택을 하고

Go! 버튼을 누르면 된다

아래가 실행후의 그림이다



 

Excel2007 테이블(Table,표)에서 행(row) 추가

2011. 11. 22. 18:40 | Posted by 이비그치면
엑셀2007의 새롭게 향상된 표기능중 요약행, 계산된 열기능등을 이용하면 행이 추가되거나 할 때 별도로 수식행을 복사하거나 채우기 할 필요가 없다

다음은 VBA를 이용하여 테이블에  행을 추가하고 추가된 row의 특정셀에 값을 넣는 방법이다

Sub test()
Dim oNewRow as ListRow
Set  oNewRow =Activesheet.ListObjects("표1").ListRows.Add(AlwaysInsert:=True)
oNewRow.Range.Cells(1,1).Value = "777" 
End Sub

 

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 -> 데이터원본 선택 창에서 확인
       . 분포에서 최다발생횟수 확인
   
      
    

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

Alt + Enter
이전 1 2 3 4 5 다음