|
첫번째 질문 답변
---------------------
아마 매크로기록기로 기록된 매크로인 것 같은데,
아무 의미 없는 군동작이 많이 기록되어 있고
오류 발생 가능성을 활짝 열어 놓고 있는 코드가 되어 버렸네요
매크로 기록기로 기록한 코드는 잘 살펴서
군동작은 삭제하고, Range나 WorkSheet, Workbook 등의
활성화 또는 선택 등과 같은 부분은 잘 분석해서
일반화시켜 주어야 합니다.
각 명령에 주석으로 설명하니 참고 바랍니다.
Sub 매크로1()
'' Range("C2:C99").Select -> 군동작
Sheets("Sheet1").Select
Range("A1:K52").Select
' Select 메소드는 동일 계층의 개체에 대해서 중복 실행되는 경우
' 가장 최종 지정된 개체에 대한 것만 유용하게 됩니다.
' Range("C2:C99")에 대한 선택은 Range("A1:K52").Select에 의해서
' 무효가 되어 버리고
' Sheet1에 있는 A1:K52 영역만 선택됩니다.
' 즉, 첫번째 명령은 삭제해야 합니다.
' 단, 예외의 경우로서
' 처음 매크로1에 진입할 당시에 활성 시트가
' 두번째 명령으로 지정된 Sheet1이 아니었고
' 그 활성시트의 C2:C99 영역 선택 상태를
' 나중에 프로그램 어디에선가 이용할 생각이라면 달라지기는 하지만
' 그런 경우라도, 첫번째 명령은 바로 그 이용되기 직전에 선택해 주는 것이
' 프로그램을 나중에 이해하기 쉽고, 따라서 필요에 따라 고치기도 쉽습니다.
' 한편, Range("A1:K52")와 같이 주소를 직접 지정하는 방식은
' 매크로 기록기로 기록할 경우에는 이렇게 기록이 되지만
' 경우에 따라 이 주소가 달라질 수도 있으므로
' 매크로의 활용 목적(용도)에 따라서는 이 부분을
' Cells 개체를 이용하여 행, 열 번호를 변수로 처리해 주거나
' 또는 미리 범위에 이름을 지정해 놓고
' Range("DATA") 등과 같이 바꾸어 주는 것이 '일반화'입니다.
Selection.Copy
Workbooks.Add
' 오류 발생의 가능성이 99%인 명령어입니다.
' 일단 이 명령어로 통합문서를 추가하면 통상 "통합 문서1"이라는 이름이
' 자동으로 붙게 되지만, 이게 항상 그런 것은 아니라는 게 문제이지요.
' 시스템이 자동으로 붙여주는 이름은 불안한 이름입니다.
' 예전에, 우리 나라가 못먹고 못살던 시절이나 식민지 시절에
' 아이를 낳으면 이 아이가 죽을지 살지 모르니까 그냥 대충
' "개똥이"라고 이름을 지어 놓고 한 3년 그냥 키웠죠
' 세 살 먹도록 살아 나면 그제서야 정식 이름을 지어주고 출생신고를 했다나요
' "통합 문서1"이란 이름은 바로 "개똥이"식 이름입니다.
' 게다가, 이 명령이 실행되는 순간에 이미 그런 이름의 통합문서가 열려 있는 상태였다면
' 여기서 만들어진 이름은 "통합 문서2"라는 이름을 갖게 됩니다.
' 따라서, 새 통합문서를 생성해서 그것을 대상으로 어떤 작업을 할 거라면
' 그냥 생성만 하고 놔두지 말고 정식으로 출생신고를 해야 합니다.
' 물론 이름을 제대로 지어 주어야지요.
' 맨 아래에 있는 저장 명령을 순서를 바꾸어 바로 지금 써야합니다.
ChDir "C:\Users\Zeus\Desktop\VBA테스트"
ActiveWorkbook.SaveAs Filename:="C:\Users\Zeus\Desktop\VBA테스트\123.xlsx", _
FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
' 방금 생성한 통합문서를 "123.xlsx"로 저장함.
' 흔히, 파일의 저장은 그 파일을 완성한 다음에 저장하는 것이라고 생각하는데
' 이 생각은 잘못된 것입니다.
' 파일을 저장하는 것은 작업 내용의 영구보존이라는 기능 외에
' 이 파일을 사용할테니 작업공간을 주기억장치 및 보조기억장치에 준비하라는
' 일종의 출생신고와 같습니다.
' 따라서, 파일은 생성하자마자 정식 이름과 경로를 지정하여
' 저장(등록=출생신고)부터 하는 것이 올바른 순서입니다.
'' Windows("무주군_Probe장애관리현황_Ver1.0.xls").Activate -> 군동작
'' Windows("통합 문서1").Activate '( 디버그시 에러 체크되는 부분)
' 역시 동일 계층의 Windows 개체에 대해 Activate 메소드가 연달아 실행되어
' 먼저 실행한 명령은 무시되어 버립니다.
' 그리고, 첨자 오류는 바로 "통합 문서1"이라는 문서가 현재 열려 있지 않기 때문입니다.
' 그 원인에 대한 가능성은 위에서 설명한 바와 같습니다.
' 이 이름이 정식 이름이 아니고 "개똥이"식의 임시 이름이기 때문에,
' 상황에 따라 오류가 날 수도 있고 괜찮을 수도 있습니다.
' 위에 예시한 바와 같이 방금 전 추가 생성했던 통합문서의 정식 이름을 제대로 지정해야 합니다.
Windows("123.xlsx").Activate
' 이와 같이 수정해야 하지요.
' (현재 열려 있는 상태이므로 경로는 지정할 필요 없고 파일 이름만 지정함)
ActiveSheet.Paste
Workbooks.Add
' 여기에 새로 추가생성한 통합문서 역시 마찬가지입니다.
' 이게 언제나 "통합 문서2"라는 이름을 가지지는 않을 수 있습니다.
' 위에 설명한 것과 마찬가지로, 다음과 같이 명령어 순서를 바꾸어야 합니다.
ActiveWorkbook.SaveAs Filename:="C:\Users\Zeus\Desktop\VBA테스트\testfile2.xlsx" _
, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
'' Windows("통합 문서1").Activate -> 군더더기 명령
'' Windows("통합 문서2").Activate -> 오류 가능성 99% 명령
Windows("testfile2.xlsx").Activate ' 수정한 명령
ActiveSheet.Paste
Application.CutCopyMode = False
'' ChDir "C:\Users\Zeus\Desktop\VBA테스트" -> 앞 쪽으로 이사 간 명령
'' ActiveWorkbook.SaveAs Filename:="C:\Users\Zeus\Desktop\VBA테스트\testfile2.xlsx" _
'' , FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
' 파일 이름은 앞에서 이미 저장했으므로,
' 데이터를 복사해서 완성된 파일은 이제는 SaveAs가 아닌 Save 명령으로 저장만 하면 됩니다.
ActiveWorkbook.Save
ActiveWindow.Close
'' ActiveWorkbook.SaveAs Filename:="C:\Users\Zeus\Desktop\VBA테스트\123.xlsx", _
'' FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
' 이하 동문
ActiveWorkbook.Save
ActiveWindow.Close
End Sub
=============================================
추가 질문 답변
---------------------------------------------
파일 이름이 현재 활성화된 셀에 있다면
ActiveWorkbook.SaveAs Filename:= ActiveCell, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
(사실 ChDir 명령으로 작업디렉토리를 변경해 놓았기 때문에, 파일 이름만 지정해도 됩니다.)
파일 이름이 B3 셀에 있다면
ActiveWorkbook.SaveAs Filename:= Range("B3"), ... 또는
ActiveWorkbook.SaveAs Filename:= Cells(3, 2), ...
|
|