본문 바로가기

엑셀VBA21

[엑셀VBA/초보자] xla 파일 (5일차) xlsm, xlam열심히 코드를 짯다면, 코드를 관리해야 한다. 엑셀에서 vba 코드를 포함한 문서를 저장하려고 하면, xlsm 파일 확장자가 가장 눈에 띈다. Excel Macro-Enabled Workbook 이라고 적혀있다.이때가 중요하다. 유혹을 뿌리치고, 눈을 밑으로 잠시 내리다 보면, xlam 파일이 보인다. 앞선 글의 내용에서 밝혔든 어떤 vba든간에, 해당 파일(workbook)에서만 맞춰서 작업이 된 것이거나, 어떤 상황에서든 사용할 수 있는 것 둘 중 하나다.   예를 들어, 1번 시트의 데이터를 2번시트의 요약테이블로 정리를 해주는 vba라면, xlsm 확장자를 고르는 게 맞겠고, 전체 시트를 개별 pdf로 추출해주는 vba라면 xlam 확장자를 고르는게 낫다.  xlam 파일 활용x.. 2024. 8. 21.
[엑셀VBA/초보자] 코드 실행과 디버깅 (4일차) 엑셀VBA코드 실행코드를 작성했으니, 실행을 해야한다. 앞서 얘기한 것처럼 function프로시저는 함수처럼 입력하여 사용하는 것이므로, 따로 실행방법은 필요가 없을 것이기 때문에 sub프로시저에 한정해서 이야기 한다. sub프로시저는 VBE 창에서 실행하는 방법과 엑셀창에서 실행하는 방법이 있다. VBE창에서 실행VBE창에서 RUN(실행?) 메뉴를 보면, Run Sub/UserForm 이라는 항목이 있다. 마우스 커서를 원하는 sub프로시저 위에 두고, 단축키 F5를 눌러주면 해당하는 프로시저 전체가 실행된다.   VBA는 코드를 기재된 순서대로 순차적으로 읽어 내려오는 구조를 가진다. 그래서, 한줄씩 과정을 확인해가면서 실행할 수 있는데, F8키를 누를때마다 한줄씩 실행이 되고, 아래 그림처럼 실행되.. 2024. 8. 7.
[엑셀VBA/초보자] 테스트 코드 [2일차] 코드 작성하기코드를 작성하기 전에 내가 작성한 코드가 특정 WORKBOOK(엑셀파일)에서만 실행되는 코드인지, 켜져있는 모든 WORKBOOK(엑셀파일)에서 실행될 수 있는 코드인지 그 범위를 생각해두어야 한다. 그 답은 본인만 알고 있을 것이다. 특정 WORKBOOK에서만 실행하기사전에 작성된 문서의 형태와 틀에 맞게 코드를 작성한 경우, 해당 코드는 다른 문서에서 실행하게 되면 원치 않는 결과를 낳게 될 것이니, 리본메뉴에 실행메뉴를 만든다던지 하는 것은 의미가 없다. 이 때는 내가 작성한 코드(프로시저 또는 함수)를 실행하는 버튼을 이미지 또는 버튼 컴포넌트로 특정 시트 영역에 넣어두는 편이 나을 것이다. TAKE #1아래와 같은 WORKBOOK > WORKSHEET가 있다고 하자. 내가 하고자 하는.. 2024. 8. 6.
[엑셀VBA/초보자] 에디터 훑어보기 [1일차] 애증의 VBA 코드언제쯤이었던가, 꽤 오래전 한 유튜브에서 VBA기초강좌 1편을 봤는데, 그걸 보자마자 든 생각은, '어렵지 않구나'라는 생각이었다. VBA는 한줄한줄씩 코드를 읽어내려가는 구조이기 때문에, 개발을 한번도 해보지 않은 사람이 사용하기 편하다. 하지만, VBA를 구글에서 검색해보면, XX년에 없어져야할 언어, 배우지말아야할 언어에 항상 상위권을 두고 있지만, 그런 컨텐츠를 본지도 어언 10여년이 되어가고 있으니, 그들의 말이 틀렸었다고 자신있게 말할 수 있다. 앞으로 이 글에 끄적거릴 내용들은 남을 위해서가 아니라 나를 위해서 적어두는 것이다. 유튜브에 메모차원에서 몇 가지 엑셀 영상을 올려놨는데, 공공의 공간이므로 나름 최대한 공손하게 멘트를 적었으나, 댓글이 달리는 것을 보면.... 참.. 2024. 8. 1.
[엑셀VBA] 엑셀용량이 비정상적으로 커졌을 때, 엑셀용량이 비정상적으로 커졌을 때아주 가끔, 엑셀용량이 비정상적으로 커진 파일들을 보게된다. 몇가지 경우의 수가 있겠지만, 구글링을 통해 여기까지 왔다면, 오빠두엑셀에서 찍어준 몇가지는 시도해봤으리라.  엑셀 파일 크기 줄이기, 모든 해결방법 총정리 :: 엑셀 위키 - 오빠두엑셀엑셀 파일 크기 줄이기, 모든 해결책 총정리 엑셀 파일크기 줄이기 목차 바로가기 내용 요약 이번 포스트에서는 기존 24.1MB 파일을 최대 2.63MB 까지, 약 90% 가량, 파일 크기를 줄일 수 있는 ;엑셀www.oppadu.com 위에 기술된 경우를 제외하고, 용량도 늘지만, 짜증나는 경우는 다음과 같다.- style이 몇 백개 되는 경우- 이름관리자에서 선언된 이름이 몇 백개 되는 경우- 원치 않는 사용영역(UsedRang.. 2023. 12. 13.
[엑셀VBA] 버전, 언어 확인 엑셀 버전, 언어 확인사용중인 오피스 버전이나, 언어는 아래 코드를 통해 확인이 가능하다. debug.Print application.Version' 16.0debug.Print Application.LanguageSettings.LanguageID(msoLanguageIDUI)' 1033 ' 1033 = English (United States)' 1042 = Korean' 1041 = Japanese' 1049 = Russian' 1036 = French' 1031 = German' 1034 = Spanish' 2052 = Chinese (PRC)' 1028 = Chinese (Taiwan)   사용중인 언어가 영어인경우, ARIAL 폰트를, 한글인 경우, 맑은 고딕 폰트를 적용하는 코드는 아래와 같.. 2023. 9. 12.
[엑셀VBA] ARRAY 안에 찾는 값이 있는지 확인(contain) 엑셀VBA ARRAY가 CONTAINS 메쏘드를 가지고 있는지 확실하지 않다. 시도해 봤는데, 잘 되지 않아, 대안을 찾았다.코드는 다음과 같으며, if 이하를 참고하면 된다.   Sub arrTest()Dim mArr(3)mArr(0) = 1mArr(1) = 2mArr(2) = 3mArr(3) = 4targetNo = "1"If UBound(Filter(mArr, targetNo)) > -1 Then    MsgBox "is in array"Else: MsgBox "is not in array"End IfEnd Sub msgbox 결과 : is in array 특별할 건 하나도 없다. 끝. 2023. 5. 2.
[엑셀VBA] 날짜간 차이 표시(datediff) 첫번째 날짜 : 오늘날짜두번째 날짜 : 원하는 날짜첫번째 날짜와 두번째 날짜의 차이를 구하고 싶다면 아래와 같은 수식을 작성할 수 있다. Sub datediff_func()    Dim date1 As Date    Dim date2 As Date    date1 = Now 'now    date2 = #1/15/2023# 'end date of service        Debug.Print DateDiff("d", date1, date2)End Sub DateDiff의 첫번째 argument는 interval로서, 아래와 같은 옵션이 있고, 쌍따옴표를 써서, String type으로 기재를 해줘야 한다.    더 구체적인 설명은 아래 도움말을 참고할 수 있다.  DateDiff function (Vi.. 2022. 12. 19.
[엑셀VBA] 참조표(테이블)을 이름정의에 사용하기 위한 배열로 변환 얼마 전에, 이름정의에 배열로 참조표(테이블)을 넣어서, 사용하는 방법에 대한 글을 적은 적이 있다. 한번 해놓으면 편하게 사용할 수 있지만, 단점은 아무래도, 따옴표와 컴마, 그리고 세미콜론까지 입력이 용이하지 않은 창에 수기로 타자를 치기가 어렵다는 점이겠다.   [엑셀] 등급 찾아서 넣기 : 이름정의에서 배열 사용#2(VLOOKUP)이름정의에서 배열상수를 넣어서, 별도의 참조테이블을 사용하지 않는 방법을 얼마전 글에서 적은 적이 있다. 이를 사용하여 점수별 등급을 손쉽게 넣을 수 있다. 이는 VLOOKUP의 마지막 상수(RANGEsunnybong.tistory.com  VBA로 간단하게 테이블을 배열 텍스트로 변환하는 코드이다.테이블 영역을 선택하면 txt파일이 생기고, 이를 클립보드에 복사하는 과.. 2022. 11. 9.
[엑셀VBA] 정의된 이름 편하게 확인하기 이름정의로 정의된 이름 확인하기이름정의 기능은 잘쓰면 아주 유용하지만, 어설프게 사용한다면, 꼬여서 상당히 골치가 아파질 수 있는 기능이다. 정의된 이름 관련 리본 메뉴는 수식 탭에서 확인할 수 있다. 직관적으로 찾기 좀 애매한 위치에 있다.   정의된 이름 관리정의된 이름은 "수식에서 사용" 버튼을 통해 수식안에 넣을 수 있고, "이름관리자"에서 편집 혹은 삭제가 가능하다.    또는, 주소창에서 등록된 이름을 확인, 이동할 수 있고,   F5키를 눌러 해당 영역으로 이동할 수도 있다.   정의된 이름 좀 편하게 확인 가능?그럼에도 이름이 여러개 만들어지다 보면, 프로그래밍하다가 변수명이 뭐였는지 잘 기억이 안나는 것처럼, 꼬이게 된다.그래서 아래와 같이 등록된 이름을 확인할 수 있는 창을 만들어 보았.. 2022. 11. 7.
[엑셀VBA] 엑셀함수를 텍스트로 넣기 엑셀VBA의 사용자 함수는 다른 사람과 공유하기가 어렵다.이번에 하고자 하는 것은 반복 사용되는 엑셀함수를 매크로로 만들어 두는 것이다. 말이 좀 애매한데...아래와 같은 표가 있다고 하자    예를 들어 올해(21년) 실적과 전년(20년) 실적의 성장율을 구한다고 하자. 시트에서 함수를 쓴다면,=(올해실적 - 전년실적) / 전년실적이라는 함수를 작성해야 한다. 괄호치기도 그렇고, 전년실적을 두번 찍어주는 것이 귀찮다.   아래 기능이 되었으면 한다.- 매크로로, 올해실적과 전년실적 셀을 선택하면, 해당 함수가 기재된다.- 자동완성을 써야할 가능성이 높으므로, 상대참조가 먹도록 한다.  마찬가지로, 달성율과 RATE함수를 활용한 CAGR을 구해본다.(옆 창은 만든 매크로를 모아놓은 사용자폼이다.)    .. 2021. 8. 9.
[엑셀VBA] 영역선택, 이름관리자를 VBA에서 사용 엑셀VBA에서 영역선택, 이름관리자를 VBA에서 사용1부터 16까지 16행의 값이 들어가 있다고 하자VBA에서 해당 영역을 지정하는 방식을 알아본다.    알고 있는 방법은 크게 3가지로,range로 영역을 지정하는 방법,currentRegion이나 usedrange를 활용하는 방법,워크시트의 이름관리자를 활용하는 방법이다. 대충 영역 내 셀 개수를 세는 프로시저를 작성해보면 아래와 같고, 결과는 모두 16이 나올 것이다.    이때, 셀이 하나 추가가 된다면, 어떻게 될까?셀이 하나 추가되어도 기존 영역을 물고 있다면, 곤란하다고 할 수 있다.3가지 방법 중 동적으로 작동하는 방식은 뭘까?    약간 코드를 수정하고 실행해 보자    영역을 세팅해 놓는 range는 당연히, 그대로 16이고,curren.. 2021. 4. 16.