1. 아별툴
  2. 아별툴 패밀리
  3. 엑셀 질문하기
  4. 엑셀 강좌
  5. 엑셀 팁
  6. 엑셀 자료실
  7. 엑셀 연구과제
  8. 엑셀 북마크
  9. 관련 프로그램 소개

[10/19일 수정] 엑셀 매크로 수정하기...

조회 수 8293 추천 수 4 2003.09.29 02:07:58
▶ 매크로를 자동기록한뒤 도구모음에서 Visual Basic을 추가한뒤
Visual Basic Editor를 실행시킨다.
소스 코드를 찾아서.. 적당히 수정한다.

이때.. 상대 셀 참조는 다음과 같다.
    ActiveCell.Offset(0, 1).Range("A1").Select
A1셀을 기준으로 해서 현재 선택된 셀에서 세로로 이동 하지 않고 오르쪽으로 1칸 이동 후 셀을 선택하라는 의미다.
    ActiveCell.Offset(2, 0).Range("A1").Select
위의 건 무엇이겠는가? 세로로 2칸 아래로 이동하라는 의미다.

그런 다음 도구모음에 컨트롤 도구 상자를 추가한다.
버튼을 엑셀 시트상에 만들고 디자인 모드에서 더블 클릭하면 명령을 입력할 수 있다.
자동기록했던 명령을 써준다. 이때 뒤에 ()는 필요없다.
만약
Sub BGupDown()
'
' BGupDown Macro
' h9이(가) 2003-09-29에 기록한 매크로
'
' 바로 가기 키: Ctrl+Shift+Q
'
    ActiveCell.FormulaR1C1 = "BG"
    ActiveCell.Offset(0, 1).Range("A1").Select
    ActiveCell.FormulaR1C1 = "UP ~ DOWN"
    ActiveCell.Offset(2, 0).Range("A1").Select
End Sub

이런 명령을 기록했다면 그냥 BGupDown이라고 써주면 버튼에 명령이 할당된다.

Private Sub BGupDown_Click()
   BGupDown
End Sub

이제 디자인 모드에서 빠져나오면 버튼이 활성화 된다.
(디자인 모드를 빠져나오는 방법은 visual basic도구상자에 맨 위에 위치한 자와 연필이 함께 있는 아이콘을 비 활성화 시키는 것이다.)

▶ 대화상자 나타내기
    양식변경확인 = MsgBox("현재양식이 통지서 인쇄프로그램용 양식입니다. " & Chr(10) & "新연명부양식으로 변경하시겠습니까?", 36, "양식변경여부 확인")
    If (양식변경확인 = vbYes) Then
    신연명부양식
    End If

-----> 설명 : & Chr(10) &이 부분을 보면 &는 문자열을 연결해준다는 의미고, Chr(10)은 Visual Basic에서 개행문자를 의미한다. 즉, 한줄 내려쓴다는 말이다. 뒷 부분에 숫자 36이 있는데, 이것은 yes버튼과 no버튼만 창에 나타내겠다는 말이다.
if조건문에서 yes를 눌렀을때의 이벤트를 정의한다. 만약 no를 눌렀을때를 정의하고 싶으면 '양식변경확인 = vbYes' 부분을 '양식변경확인 = vbNo' 로 고쳐주면 된다.

▶ 파일 열기 창 보여주기
    open_name = Application.GetOpenFilename
    Workbooks.Open FileName:=open_name, _
        ReadOnly:=True

----> 설명 : 그냥 외워야하는 부분이다.(매크로 기록을 하면 자동으로 기록된다. 읽기전용 옵션을 제외하고) ReadOnly:=True 옵션은 읽기 전용으로 문서를 읽는다는 의미이다.
    Workbooks.Open FileName:=open_name, _
        ReadOnly:=True
이 부분에서 첫줄에 언더바(_)가 있는데, 이것은 소스가 길어질때 아래와 이어진다는 의미이다.
그래서 다시 쓰면
    Workbooks.Open FileName:=open_name, ReadOnly:=True
와 똑같은 의미이다. 소스를 보기좋게 할때 종종 쓰이는 기법이다.

▶ 매크로 에러시 대처하기.. 메시지창 띄우기..
    On Error GoTo a:

If (xx = "some") Then
a:      b = MsgBox("동2000을 실행시키십시오."): End
End If

▶ 문서가 열릴때마다 자동으로 실행되게 하기..
(function 이름을 Auto_Open으로 해주면 된다. 여기서 쓰인 기능은 상태표시줄을 변경해주는 기능이다.)
Sub Auto_Open() '시작될때마다 자동으로 실행되는 함수입니다.
    Application.StatusBar = "단축키:칸넓이조절(Ctrl+I),인쇄환경(Ctrl+M),셀합치기(Ctrl+Shift+S),셀삽입(Ctrl+Shift+Z),목록정렬(Ctrl+J)"
End Sub

▶ 문서가 닫일때마다 자동으로 실행되게 하기..
(function 이름을 Auto_Close으로 해주면 된다. 여기서 쓰인 기능은 상태표시줄을 공백으로 돌려준다.)

Sub Auto_Close()

    팝업메뉴제거
    팝_잔산화제거
    Application.StatusBar = ""
End Sub

▶ 다이얼로그 시트를 화면에 보여주는 요령.
여기서 주목해야 할것은 Else부분에 End 부분이다. 현재 function을 종료 시킬 경우에는 End만 써준다.
    If DialogSheets("Config").Show Then
        Sheets("전산관리법").Select
        저장여부 = MsgBox("중대설정의 변경내용을 저장하십시오", 36, "저장 권고창")
        If (저장여부 = vbYes) Then
            ActiveWorkbook.Save
        End If
    Else
        Sheets("전산관리법").Select
        End
    End If

▶ 특정 셀을 선택한 상태에서 자동채우기 하는 기법이다. 잔머리를 굴린 결과다.. 이것은 본인이 생각한 것이고 더 좋은 방법이 있을 수 있다. 설명은 다음 기회에.. ㅎㅎ

Sub 자동채우기()
'    Range("F2").Select
'    ActiveCell.FormulaR1C1 = "=IF(RC[1]=R[-1]C[1],R[-1]C+1,1)"
    ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveCell.FormulaR1C1 = "=ROWS(Database)"
    data_rows = ActiveCell.Value
    ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveCell.FormulaR1C1 = "=COLUMN()"
    data_cols = ActiveCell.Value
    ActiveCell.Offset(-2, 0).Range("A1").Select
    Selection.AutoFill Destination:=Range(Cells(2, data_cols), Cells(data_rows, data_cols)), Type:=xlFillDefault
End Sub

▶ Not 비교 연산자와 조건분기문..
Not비교 연산자는 <>이다. ElseIf를 반복해서 사용할 수있음을 주목하자.
끝나는 부분은 End If이다.
If (flag <> "") Then
--------
ElseIf
--------
Else
--------
End If

▶ 전역변수 설정하는 법
가장 위쪽에 써주면 된다. Sub----End Sub에 들어가지 않는다. 그러면 모든 Sub함수에서 호출해서 사용가능하다.

    Const menuname As String = "예비군업무전산화"

▶ 도구 모음을 추가하는 법..
시간날때 자세히 설명하기로 하자..

Sub 팝메뉴_전산화()
    
    Dim PopMenu As CommandBar
    Dim btnMutiPivot As CommandBarButton
    Dim btnJunPyun As CommandBarButton
    Dim btnSJAlign As CommandBarButton
    
    Set PopMenu = CommandBars.Add
    
팝_잔산화제거
    
    PopMenu.Name = menuname
    PopMenu.Position = msoBarTop

    With PopMenu.Controls

        Set btnMutiPivot = .Add(msoControlButton)
        With btnMutiPivot
            .Style = msoButtonIconAndCaption
            .Caption = "전투편성명부제작"
            .FaceId = 36
            .TooltipText = "전투편성명부 제작"
            .Visible = True
            .OnAction = "전투편성명부"
        End With

        Set btnSJAlign = .Add(msoControlButton)
        With btnSJAlign
            .Style = msoButtonIconAndCaption
            .Caption = "목록정렬"
            .FaceId = 37
            .TooltipText = "한눈에 알아보기 쉽게 목록을 정렬한다."
            .Visible = True
            .OnAction = "목록정렬"
        End With
        
        Set btnJunPyun = .Add(msoControlButton)
        With btnJunPyun
            .Style = msoButtonIconAndCaption
            .Caption = "메신저콜입력양식"
            .FaceId = 50
            .TooltipText = "메신저콜입력양식으로 변경한다."
            .Visible = True
            .OnAction = "팝_메신저콜입력"
        End With
        
        Set btnMutiPivot = .Add(msoControlButton)
        With btnMutiPivot
            .BeginGroup = True
            .Style = msoButtonIconAndCaption
            .Caption = "칸넓이자동조절"
            .FaceId = 43
            .TooltipText = "화면에 보이는 칸만 셀넓이를 자동 조절합니다."
            .Visible = True
            .OnAction = "보이는칸만"
        End With
        
        Set btnJunPyun = .Add(msoControlButton)
        With btnJunPyun
            .Style = msoButtonIconAndCaption
            .Caption = "계급연차 분류"
            .FaceId = 44
            .TooltipText = "계급/연차를 구간별로 분류한다."
            .Visible = True
            .OnAction = "분류판단"
        End With
    
        Set btnSJAlign = .Add(msoControlButton)
        With btnSJAlign
            .Style = msoButtonIconAndCaption
            .Caption = "소속/직책별 정렬"
            .FaceId = 53
            .TooltipText = "소속 직책별로 정렬한다."
            .Visible = True
            .OnAction = "소속직책별정렬"
        End With
        

    End With

    PopMenu.Visible = True

End Sub

'Sub Auto_Open()
'    중대설정실행
'    If (Application.Version = 9) Then
'        Application.AltStartupPath = "C:Program FilesDong2000Codatamacro"
'    End If
'End Sub

Sub 팝_잔산화제거()

    Dim mnuUser As CommandBarControl
    
    On Error Resume Next
    CommandBars(menuname).Delete
    For Each mnuUser In CommandBars("Menu Bar").Controls
        If mnuUser.Caption = menuname Then mnuUser.Delete
    Next

End Sub

▶ 도구모음을 제거하는 법

Sub 팝업메뉴제거()

    Dim mnuUser As CommandBarControl
    
    On Error Resume Next
    CommandBars(menuname).Delete
    For Each mnuUser In CommandBars("Menu Bar").Controls
        If mnuUser.Caption = menuname Then mnuUser.Delete
    Next

End Sub










댓글 '2'

[레벨:4]현대자동차

2012.03.05 12:57:24
*.29.96.161

어렵네요...

profile

[레벨:30]아별

2012.03.05 13:13:34
*.104.126.21

하하.. 이글은 제가 VBA 베이비 시절에 작성했던 글이군요.. ^^

군대에서 행정병으로 근무할때 업무를 전산화했던 소스들을 정리한 것이네요..

(코드가 비효율적인 것도 많고 하네요.. 다이얼시트는 현재 사용하지 않고 있지요.. ^_^;;)


그땐 나름 연대장 표창도 받고 그랬었는데.. ㅎㅎ

그때 작성했던 프로그램을 지금 보면.. 아주 엉망입니다. ^_^;;

문서 첨부 제한 : 0Byte/ 2.00MB
파일 제한 크기 : 2.00MB (허용 확장자 : *.*)
List of Articles
번호 제목 글쓴이 날짜 조회 수sort
공지 기타 엑셀 VBA 간단한 팁 모아놓기.. +_+ [레벨:30]아별 2007-01-24 33981
64 기타 오피스2010 64bit(64비트)를 위한 API Declare 방법 _ 윈도우 도움말 file [레벨:30]아별 2017-04-21 39470
63 [펌] Visual Basic (비쥬얼 베이직) 함수 정리 imagefile [레벨:30]아별 2009-11-27 20130
62 시트에서 콤보박스 활용하기 file [레벨:30]a☆ 2005-11-12 16755
61 메시지 박스 대용으로 Shape 사용하기 file [레벨:30]아별 2009-05-07 16074
60 기타 [펌] 엑셀 VBA 총정리 _ Excel 개체 모델 참조 등 image [2] [레벨:30]아별 2010-03-09 16017
59 [VBA] 전역변수 설정하기. Public 문, Private 문 imagefile [레벨:30]아별 2008-07-01 14081
58 엑셀에서 사용하는 언어 확인하기. file [1] [레벨:30]아별 2009-06-03 13815
57 기타 [펌] VBA 공부를 시작하시는분들에게 추천하는 강의자료 imagefile [4] [레벨:30]아별 2011-03-21 13779
56 기타 [Excel VBA] 피벗테이블(PivotTable)을 VBA로 컨트롤해보자.. [레벨:30]아별 2008-12-19 12183
55 엑셀에서 달력 집어 넣기.. [1] [레벨:30]a☆ 2004-10-21 11578
54 [엑셀VBA] 자동필터를 매크로로 구현하기 [레벨:30]아별 2008-08-28 11262
53 엑셀2007에서 셀의 색상을 RGB로 뽑아내기 file [레벨:30]아별 2009-10-06 10235
52 엑셀의 유저폼 관련 [1] [레벨:30]a☆ 2004-10-21 10090
51 엑셀에서 줄바꿈에 대해서.. 줄바꿈하기 제거하기 등등.. [레벨:30]a☆ 2004-11-15 10050
50 기타 [링크] VBA로 파일을 다루는 방법에 대한 강좌들을 모아놓은 겁니다. [레벨:30]아별 2010-03-03 9977
49 기타 오피스2010 64bit(64비트)를 위한 API Declare 방법 file [2] [레벨:30]아별 2011-10-05 9340
48 [엑셀VBA] 네이버 지식인 답변 _ 엑셀 쿼리를 이용해서 펀드 기준가 데이터를 읽어오기. file [레벨:30]아별 2008-04-30 9158
47 기타 VBA _ 레지스트리 다루기 ( registry control ) imagefile [레벨:30]아별 2011-03-19 8794
» [10/19일 수정] 엑셀 매크로 수정하기... [2] [레벨:30]a☆ 2003-09-29 8293