나눔터  
  HOME > 나눔터 > 묻고답하기 > 엑셀
엑셀
엑셀에 대한 질문과 답변을 올려주세요. 단, 취지에 맞지 않는 글은 운영자가 삭제합니다.
 "000 님, 도와주세요", "부탁 드립니다.", "급합니다!" 등과 같이 막연한 제목을 달지 말아주세요.
[필독] 빠르고 정확한 답변을 얻는 16가지 Tip !
[필독] 저작권법 개정에 따른 이용안내
작성자:  

 조삿갓 (choga21)

추천:  2
파일:     조회:  7626
제목:   [RE]아래첨자 사용이 잘못되었습니다.
     
  첫번째 질문 답변
---------------------
아마 매크로기록기로 기록된 매크로인 것 같은데,
아무 의미 없는 군동작이 많이 기록되어 있고
오류 발생 가능성을 활짝 열어 놓고 있는 코드가 되어 버렸네요

매크로 기록기로 기록한 코드는 잘 살펴서
군동작은 삭제하고, 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), ... 
 
[불량 게시물 신고]  
        
  

작성일 : 2018-05-23(21:27)
최종수정일 : 2018-05-23(21:27)
 


 ◎ 관련글

  제 목   작성자   날짜
아래첨자 사용이 잘못되었습니다. zeussi 2018-05-23
[RE]아래첨자 사용이 잘못되었습니다. 조삿갓 2018-05-23