본문 바로가기
카테고리 없음

[EXCEL] VBA 중급 1 - 다른 이름으로 저장하기(+ 열려있는 모든 파일 저장하고 닫는 법,연속 생성 견적서)

by KEI NETWORK 2020. 5. 24.

안녕하세요.

오늘은 매크로 작성시 알아두면 꼭 도움이 되는 "저장"을 알아보도록 하겠습니다.

분명 아래 기초 강의까지 모두 따라왔다면,

어느정도 매크로를 많이 작성 하실 수 있을 겁니다.

(필터를 아직 안알려드려서 많이 활용 못하실래나..ㅠ)

근데 가만히 내가 하는 일을 생각해 보면...

엑셀 파일을 그냥 "저장" 혹은 "다른 이름으로 저장"하는 그 행위를!!

많이 하시지 않나요??

그냥 "저장"은 당연히 필수고, 다름이름으로 저장도 백업용으로도 많이합니다.

그렇다면 매크로가 작동하고 마지막에 저장도 알아서 한다면,

훨씬 편하지 않을까요?

데이터가 날라갈까봐 발을 동동 구르시지 않아도 됩니다ㅎㅎㅎ

총 3가지를 알려드립니다.

Save, SavaAs, Dialogs 띄우기

그럼 바로 시작하겠습니다.


Save 메서드

- Save의 경우 Workbook(엑셀파일) 개체에 속해 있으며, 사용과 동시에 파일이 저장됩니다.

- 바로 예제를 활용하면서 익혀 볼껀데요. 가장 간단한 활용은 단순히 내가 작성한 매크로 코드 혹은 타인이 작성한 매크로 코드 맨 뒤에 ThisWorkbook.save 를 적어보세요.(별도의 문법? 구문이 없어요)

sub ~~() 코드 코드 ... ... ThisWorkbook.Save End Sub

- 위 와 같이 코드를 넣고 실행시키면 자동으로 엑셀파일이 저장 됩니다.

- 하지만 Save 메서드의 주의점이 있습니다.

우리가 일반 엑셀 파일을 새로 만든다고 가정해 봅시다.

아핫 따끈한 엑셀파일이다!!

여기서 새로 만든 파일을 그냥 저장해보세요! (단축키: Ctrl + s 다 아시죠?!ㅎ)

 

???

그럼 "다름 이름으로 저장"이 나옵니다. 뭐 평소에 알던 사실이니 그리 놀랍지는 않습니다.

이걸 말로 정리해 보자면,

엑셀에서 그냥 "저장"하는 행위는 "이미 저장된 파일"에 수정된 내용을 덮어씌우는 것이 "저장" 입니다.

새로 작성한 파일에 저장을 실행하면 자동으로 "다름 이름으로 저장"이 나오는 거구요!

∴ 제가 말씀드리고 싶은 주의점은, 신규 엑셀 파일과 관련있는 소스 코드를 작성하신다면, 차라리 SaveAs를 사용하세요!

모르고 만약 새로운 파일에 save메서드를 쓰면요? 별거 없어요..

예를 누르면 저장은 되나 일반 엑셀포맷(.xlsx)로 되서 다음부터 매크로가 동작안해요..

당연히 에러 메시지가 나옵니다^^;;

- 근데 많이 보실 상황은 아니긴한데 그래도 내용은 짚고 넘어갔구요, 조금 더 발전된 예제를 봐볼께요!!

많이 사용하게 되실 VBA 소스코드 중 한 개 입니다.

현재 파일 제외하고 모든 엑셀파일 저장/닫기 매크로

Option Explicit Sub AllClose() '현재 파일을 제외한 열려있는 모든 엑셀파일 저장 및 닫기 매크로 Application.ScreenUpdating = False '화면 업데이트 끄기 Dim ef As Workbook '변수 선언 For Each ef In Workbooks 'Workbooks는 열려있는 엑셀파일 모두를 가리킴니다. If ef.Name <> ThisWorkbook.Name Then '열려있는 파일 이름이 현재 파일이름과 다르다면 ef.Save '저장 ef.Close '닫기 End If Next 'Application.Quit '만약 현재 파일까지 닫고 싶다면 주석 해제 Application.ScreenUpdating = True End Sub

- 언제 많이 쓰이냐면, 어려운 계산이나 대량의 데이터로 매크로 작동시, 메모리 사용을 줄이고 혹시라도 오류로 다른 열려있는 엑셀파일이 저장도 못한채 날라가는 현상을 방지하기 위해 잘 씁니다. 응용해도 좋구요!


SaveAs 메서드

- "다름 이름으로 저장" 하는 메서드 입니다.

- Save 메서드와 다른 점은 한 번도 저장하지 않은 파일을 저장하거나 백업용 복사본을 만들 때 자주 사용합니다.

문법

Workbook.SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AddToMru, TextCodePage, TextVisualLayout, Local)

· FileName : 경로\파일 이름 & ".확장자명"

(ex - C:\Users\user\Google 드라이브\blog_Excel_lecture\saveAs\Test1.xlsx )

· FileFormat : 파일 형식 지정(아래 표 확인 - 이외에도 많으나, 쓸일 없어요!)

내장 상수

값(확장자)

xlOpenXMLWorkbook

Excel 통합 문서(.xlsx)

xlCSV

CSV 파일(.csv)

xlOpenXMLWorkbookMacroEnabled

매크로 사용 통합 문서 (.xlsm)

xlExcel8

97-2003 버전 엑셀(.xls , 사용을 권장 드리지 않습니다)

xlTextWindows

텍스트 파일로 저장(.txt)

· Password : 파일 열기 암호

· WriteResPassword : 파일 쓰기 암호

· ReadOnlyRecommended : 파일 열때 "읽기 전용 권장 메시지", True면 표시/ False면 표시안함

· CreateBackup : 백업 파일 생성 여부, True면 생성/False면 생성안함

· AddToMru : 최근 사용 목록에 추가여부, True면 추가/False면 추가 안함(기본값)

· TextCodePage : 파일 포맷을 CSV 혹은 텍스트 파일로 저장시, 코드 페이지 설정 가능

· TextVisualLayout : 파일 포맷을 CSV 혹은 텍스트 파일로 저장시, 레이아웃 설정 가능

· Local : 저장 시 로컬 설정 옵션으로 True면(권장) 제어판 설정/ False면(기본값) VBA 언어로 저장


아주 복잡한 것처럼 보입니다.

네, 맞아요.. 맞아요...

그냥 저장하는 창 띄우는거만 알려드릴껄.. 하아..

SaveAs는 코드 작성자가 힘들고 사용자가 정말~~ 편한 방법 입니다.

먼저 예제 한 개 보고, 그냥 사용자에게 떠넘기는 방법을 알려드릴께요ㅜㅜ

왜 사용자가 편한지는 알아야 하니깐요.

예제 - 연속 생성이 가능한 견적서 VBA

- 견적서 파일을 하나 만들어 봤습니다.

다름 이름으로 저장 버튼을 누른다 -> 업체명을 입력 받는다 -> 파일이 다름이름으로 저장된다, 입력받은 업체명은 파일명이 된다 -> 견적서.xlsm 내용은 초기화 된다.

코드는 불편했지만, 만들어 놓으면 더 할 엄~~청 편해 집니다.

소스코드 입니다.

그냥 복사 붙여넣기 하지말고 꼭!

한줄 넣고 실행 시켜보고, 한줄 넣고 실행 시켜보고 하는 식으로 하세요!

그래야지 이해가 되고, 나중에 응용해서 커스텀도 하실 수 있습니다.

Option Explicit Sub saveAsTest() Dim table As Range Dim emptyEx As Workbook Dim fileName As String Dim 업체명 As String Application.ScreenUpdating = False On Error Resume Next 업체명 = InputBox("견적서를 보낼 업체명을 입력해주세요.", "견적서 이름") fileName = ActiveWorkbook.Path & "\" & 업체명 & ".xlsx" Set table = Range("C4").CurrentRegion Set emptyEx = Workbooks.Add '빈 통합문서를 만들어 emptyEx라는 개체에 할당했습니다. table.Copy '복사 emptyEx.Activate '새로 만든 빈 통합문서 활성화 Range("C4").Select ' 활성화된 문서에서 c4셀 선택 ActiveSheet.Paste ' 붙여넣기('c4셀에 선택된 상태로 붙여넣어 집니다.) Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, SkipBlanks:=False, Transpose:=False '너비를 기존파일과 맞추기 위해 너비를 붙여넣음 // 붙여넣기에 대해서는 이후 강의 준비중 Range("C4").Select '포인터 위치 조정 ActiveWorkbook.SaveAs fileName:=fileName, FileFormat:=xlOpenXMLWorkbook '다음이름으로저장 ActiveWorkbook.Close SaveChanges:=False '저장완료이므로 개체변수에 할단된 emptyEx는 저장 없이 닫음 Range("D7:I21").ClearContents ' 기존 견적서 파일의 내용 삭제 On Error GoTo 0 Application.ScreenUpdating = True End Sub


다이얼로그 띄우기

save as 메서드 할만 하셨나요?

많이 배우다 보니, 감이 살아났다는 전제하에 저도 코드를 조금은(?) 자유롭게 적으니깐 좋더라구요..ㅠ

도움이 될 예제를 만들고 싶은데, 힘든...흑..

이렇게 쓸데없는 말을 하는 이유는, 다이얼로그를 정말 간단합니다.

아, 다이얼로그 띄우는게 모냐면,

우리가 흔히 엑셀 작업시에 "다름이름으로 저장"을 하기 위해 단축키 F12를 누르면 아래와 같은 창이 나옵니다.

이창을 띄워 주는게 다이얼로그 띄우기에요 ㅎㅎ

띄우는 방법은 매크로 코드를 열심히 작성하시고, 다 작성하시면 맨 아래에 코드를 추가해주세요.

Application.Dialogs(xlDialogSaveAs).Show

그럼 코드가 모두 실행되고 마지막에 "다른 이름으로 저장"창이 나올꺼에요...ㅎ

간단하죠?

뭐 설정할 껏도 없고, 사용자가 알아서 위치와 이름을 지정하면 되니깐요..ㅎㅎ


감사합니다.

 

댓글