<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>한셀 매크로 on shlewislee.me</title>
    <link>https://shlewislee.me/ko/series/%ED%95%9C%EC%85%80-%EB%A7%A4%ED%81%AC%EB%A1%9C/</link>
    <description>Recent content in 한셀 매크로 on shlewislee.me</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ko</language>
    <managingEditor>shlewislee@shlewislee.me (shlewislee)</managingEditor>
    <webMaster>shlewislee@shlewislee.me (shlewislee)</webMaster>
    <copyright>Copyright (c) 2026 shlewislee. All Rights Reserved</copyright>
    <lastBuildDate>Mon, 12 Jul 2021 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://shlewislee.me/ko/series/%ED%95%9C%EC%85%80-%EB%A7%A4%ED%81%AC%EB%A1%9C/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>📎 한셀 매크로로 일하기 (2)</title>
      <link>https://shlewislee.me/ko/blog/hancell_macro_2/</link>
      <pubDate>Mon, 12 Jul 2021 00:00:00 +0000</pubDate><author>shlewislee@shlewislee.me (shlewislee)</author>
      <guid>https://shlewislee.me/ko/blog/hancell_macro_2/</guid>
      <description>&lt;p&gt;한셀이랑 엑셀의 매크로는 거의 차이가 없다. 유일한 큰 차이는 디버깅이 어렵다는 것이다. 한셀은 에러 문구가 모호하고, 군대 특성상 검색도 힘들다. 다행인 점은 &lt;strong&gt;스크립트 편집기를 켠 상태에서 오류가 나면 오류가 난 라인을 표시해준다&lt;/strong&gt;는 점이다. 스크립트 편집기를 켜면 스크립트 실행속도가 처절하게 느려지지만, 가장 좋은 디버깅 방법이다.&lt;/p&gt;&#xA;&lt;h2 id=&#34;sub-main&#34;&gt;Sub main()&lt;/h2&gt;&#xA;&lt;p&gt;VBA는 기본적으로 모듈 내의 Sub로 시작하게된다. 스크립트 편집기에서 좌측 사이드바 중 추가하고싶은 문서에 오른쪽 클릭을 하면 모듈 추가를 할 수 있다. 모듈 내에는 다음처럼 Sub 프로시져를 만들 수 있다.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>한셀이랑 엑셀의 매크로는 거의 차이가 없다. 유일한 큰 차이는 디버깅이 어렵다는 것이다. 한셀은 에러 문구가 모호하고, 군대 특성상 검색도 힘들다. 다행인 점은 <strong>스크립트 편집기를 켠 상태에서 오류가 나면 오류가 난 라인을 표시해준다</strong>는 점이다. 스크립트 편집기를 켜면 스크립트 실행속도가 처절하게 느려지지만, 가장 좋은 디버깅 방법이다.</p>
<h2 id="sub-main">Sub main()</h2>
<p>VBA는 기본적으로 모듈 내의 Sub로 시작하게된다. 스크립트 편집기에서 좌측 사이드바 중 추가하고싶은 문서에 오른쪽 클릭을 하면 모듈 추가를 할 수 있다. 모듈 내에는 다음처럼 Sub 프로시져를 만들 수 있다.</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vb" data-lang="vb"><span class="line"><span class="ln">1</span><span class="cl"><span class="k">Sub</span> <span class="nf">main</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">    <span class="c">&#39;Your code here
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="c"></span><span class="k">End</span> <span class="k">Sub</span></span></span></code></pre></div><p>Sub 앞에 Private과 Public을 붙여 다른 모듈에서도 호출 가능할지 아닐지를 정할 수 있다. 실질적으로는 Private을 사용할 일이 없었고, 추가로 붙여주지 않으면 기본적으로 Public이 되기때문에 생략하였다. Sub의 끝에는 꼭 End Sub가 붙어줘야한다. 이렇게 만들어진 하나의 Sub를 Sub 프로시져라고 하고,</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vb" data-lang="vb"><span class="line"><span class="ln">1</span><span class="cl"><span class="k">Sub</span> <span class="nf">main2</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">    <span class="k">Call</span> <span class="n">main</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="k">End</span> <span class="k">Sub</span></span></span></code></pre></div><p>다른 모듈에서도 만들어진 Sub 프로시져를 위와같이 실행시킬 수 있다.</p>
<p><img src="vba_run.png" alt="실행방법"></p>
<p>Sub 프로시져를 실행시키는 방법은 여러가지가 있는데, <strong>입력 - 양식개체 - 명령단추</strong>를 통해 VB스타일의 버튼을 삽입할 수도 있고, 일반 도형에 매크로를 지정해서(도형을 우측클릭하면 매크로를 지정할 수 있다.) 실행하는 방법이 있다. 미관상 도형이 훨씬 낫기때문에 대부분의 경우 도형에 지정해서 사용하였다.</p>
<p>디버그중이 아니거나 다루는 데이터가 많다면 한셀에서는 스크립트 편집기를 꼭 종료한 후 실행해야한다. 특히 데이터가 많다면 팅겨버리는 일이 많다. 스크립트 편집기에서는 일반 IDE처럼 F5로 실행할 수 있다. Sub 단위로 실행하기때문에 어떤 모듈에서 어떤 Sub 프로시져를 실행 할 것인지 선택해주어야한다.</p>
<h2 id="msgbox">MsgBox()</h2>
<p>Python의 print()처럼, 어느부분에서 문제가 발생하는지 확인하는 가장 편한 방법은 MsgBox()이다. 괄호안의 내용을 알림창으로 띄워준다.</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vb" data-lang="vb"><span class="line"><span class="ln">1</span><span class="cl"><span class="k">Sub</span> <span class="nf">main</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">    <span class="n">MsgBox</span><span class="p">(</span><span class="s">&#34;Hello, World!&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="k">End</span> <span class="k">Sub</span></span></span></code></pre></div><p><img src="/img/vba_msgbox.png" alt="msgbox"></p>
<p>이렇게 아주 기본적인 메시지 박스가 뜬다. 이 MsgBox()에도 여러 사용법이 있지만, 지금은 넘어갈 것이다.</p>
<h2 id="변수-선언과-range-객체">변수 선언과 Range 객체</h2>
<p>여타 프로그래밍 언어처럼, VBA에는 값을 바꿀 수 있는 <strong>변수</strong>가 있다. 역시 다른 언어들처럼 변수에는 integer, long, boolean, string 등을 담을 수도 있고, 객체(object)를 담을 수도 있다. VBA는 객체지향형 언어인만큼, 객체의 개념이 중요하다. 객체에 대해서는 <a href="https://jaykim361.tistory.com/629">이 블로그</a>에 잘 설명되어있다.</p>
<p>한셀 문서는 간단하게 <strong>워크북(파일) - (워크)시트 - 범위 - 셀</strong>로 나눌 수 있다(대부분의 경우 범위와 셀은 크게 구분을 할 필요가 없다). 이들은 모두 객체(object)이다. Range는 그중 범위의 객체인데, 다른 워크북의, 다른 시트의 셀 범위까지도 불러올 수 있어 범용성이 매우 뛰어나다. 기본적인 Range의 구성은 다음과같다:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vb" data-lang="vb"><span class="line"><span class="ln">1</span><span class="cl"><span class="k">Sub</span> <span class="nf">main</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">    <span class="k">Dim</span> <span class="n">example</span> <span class="ow">as</span> <span class="n">Range</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">    <span class="k">Dim</span> <span class="n">exampleNum</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">
</span></span><span class="line"><span class="ln">5</span><span class="cl">    <span class="n">exampleNum</span> <span class="o">=</span> <span class="n">0</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">    <span class="k">Set</span> <span class="n">example</span> <span class="o">=</span> <span class="n">Range</span><span class="p">(</span><span class="s">&#34;[filename.xlsx]Sheet1!A1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="k">End</span> <span class="k">Sub</span></span></span></code></pre></div><p>Dim은 변수를 선언할때 쓰이는데, <strong>as Range</strong>를 붙여줌으로서 앞의 변수가 Range 객체임을 명시한다. Set은 객체(object)를 변수에 부여할때만 사용된다. 객체를 사용하는 것이 아니라면, Set은 굳이 사용하지 않아도 된다는 의미이다.</p>
<p>example 변수는 이제 filename.xlsx의 Sheet1 시트의 A1셀을 가르키고있다. 변수에 지정하지 않고 직접 Range()를 사용할 수도 있다.</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vb" data-lang="vb"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="k">Sub</span> <span class="nf">main</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">    <span class="k">Dim</span> <span class="n">example</span> <span class="ow">as</span> <span class="n">Range</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">    <span class="k">Dim</span> <span class="n">exampleNum</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">    <span class="n">exampleNum</span> <span class="o">=</span> <span class="n">0</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">    <span class="k">Set</span> <span class="n">example</span> <span class="o">=</span> <span class="n">Range</span><span class="p">(</span><span class="s">&#34;[filename.xlsx]Sheet1!A1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    <span class="n">MsgBox</span><span class="p">(</span><span class="n">example</span><span class="p">.</span><span class="n">Value</span><span class="p">)</span> <span class="c">&#39;A1 셀의 값을 MsgBox로 출력
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="c"></span>    
</span></span><span class="line"><span class="ln">10</span><span class="cl">    <span class="n">MsgBox</span><span class="p">(</span><span class="n">Range</span><span class="p">(</span><span class="s">&#34;[filename.xlsx]Sheet1!A1&#34;</span><span class="p">))</span> <span class="c">&#39;출력값이 같다.
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="c"></span><span class="k">End</span> <span class="k">Sub</span></span></span></code></pre></div><h2 id="method와-properties">Method와 Properties</h2>
<p>이처럼 Range 객체는 엑셀의 데이터를 조회/수정할때 가장 많이 사용되는 객체이다. Range에는 많은 Method들과 Properties들이 있는데, Method는 Range에 대한 행동(Behavior)같은 개념으로, Range에 변화를 줄때 사용되고, Property는 해당 Range 객체의 특성을 불러올때 사용된다. 일례로 Properties중 하나인 .Value는 해당 Range의 특성인 값을 불러오게된다. Method중 하나인 .Select는 해당 Range를 선택할 수 있게 해준다. 여타 객체지향형 언어처럼, Method는 뒤에 괄호를 붙이게되고, Properties는 붙이지 않는다.</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vb" data-lang="vb"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="k">Sub</span> <span class="nf">main</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">    <span class="k">Dim</span> <span class="n">example</span> <span class="ow">as</span> <span class="n">Range</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">    <span class="k">Dim</span> <span class="n">exampleNum</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">    <span class="n">exampleNum</span> <span class="o">=</span> <span class="n">0</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">    <span class="k">Set</span> <span class="n">example</span> <span class="o">=</span> <span class="n">Range</span><span class="p">(</span><span class="s">&#34;[filename.xlsx]Sheet1!A1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    <span class="n">MsgBox</span><span class="p">(</span><span class="n">example</span><span class="p">.</span><span class="n">Row</span><span class="p">)</span> <span class="c">&#39;Properties중 하나인 Row(행 번호)를 불러온다.
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="c"></span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">    <span class="n">example</span><span class="p">.</span><span class="n">Select</span><span class="p">()</span> <span class="c">&#39;A1셀을 선택한다. 괄호가 붙는다. 
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="c"></span><span class="k">End</span> <span class="k">Sub</span></span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>📎 한셀 매크로로 일하기 (1)</title>
      <link>https://shlewislee.me/ko/blog/hancell_macro_1/</link>
      <pubDate>Sun, 11 Jul 2021 00:00:00 +0000</pubDate><author>shlewislee@shlewislee.me (shlewislee)</author>
      <guid>https://shlewislee.me/ko/blog/hancell_macro_1/</guid>
      <description>&lt;p&gt;몇몇 특별한 보직이 아니라면 군대에서 일하면서 코딩과 가장 가까운 경험은 한셀의 매크로 스크립트일것이다. 엑셀 VBA에서 몇몇 기능이 빠진, 좀 더 불편한 물건인데, 기본적으로 가능성은 무궁무진하다보니 애용하게된다. 행정병으로 근 1년가까이 근무하면서 매크로덕을 많이 보았다. 아마 전공자든 나처럼 취미로하든, 엑셀 매크로를 공부해볼 일은 거의 없었을 것이라고 생각한다. 애초에 엑셀에서 VBA를 쓴다는 것 부터 처음 알게되었다. 전공자라면 VBA가 워낙 간단해서 굳이 이 시리즈가 아니더라도 이정도 사용법은 충분히 생각해낼 수 있을 것이라고 생각한다. &lt;strong&gt;한셀 매크로로 일하기&lt;/strong&gt; 시리즈는 비전공자를 대상으로 군대에서 많이 쓰일법한 여러가지 프로그램(?)들을 만들어보면서 내가 스스로 배운 한셀과 한셀 매크로로 조금 더 편하게 일하는 방법을 소개해보려 한다.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>몇몇 특별한 보직이 아니라면 군대에서 일하면서 코딩과 가장 가까운 경험은 한셀의 매크로 스크립트일것이다. 엑셀 VBA에서 몇몇 기능이 빠진, 좀 더 불편한 물건인데, 기본적으로 가능성은 무궁무진하다보니 애용하게된다. 행정병으로 근 1년가까이 근무하면서 매크로덕을 많이 보았다. 아마 전공자든 나처럼 취미로하든, 엑셀 매크로를 공부해볼 일은 거의 없었을 것이라고 생각한다. 애초에 엑셀에서 VBA를 쓴다는 것 부터 처음 알게되었다. 전공자라면 VBA가 워낙 간단해서 굳이 이 시리즈가 아니더라도 이정도 사용법은 충분히 생각해낼 수 있을 것이라고 생각한다. <strong>한셀 매크로로 일하기</strong> 시리즈는 비전공자를 대상으로 군대에서 많이 쓰일법한 여러가지 프로그램(?)들을 만들어보면서 내가 스스로 배운 한셀과 한셀 매크로로 조금 더 편하게 일하는 방법을 소개해보려 한다.</p>
<p>VBA는 분명히 쉬운언어이고, 엑셀(한셀) 매크로는 그중에서도 언어 자체가 어려울 부분이 없다시피하기때문에 빠르게 배울 수 있었지만, 아주 기초적인 프로그래밍 언어에 대한 이해는 필요한 것 같다. 특히 객체지향형인만큼 Python을 조금이라도 배워둔 상태에서 배웠기때문에 빨리 배울 수 있었던 것 같다. 최대한 자세하게 설명해보겠지만, 이 시리즈는 프로그래밍 시리즈가 아니라 실전 한셀(엑셀이랑 다른점은 없지만)이기때문에 필요 이상의 설명은 하지 않을 것이다.</p>
<h2 id="시작하기-전에">시작하기 전에</h2>
<p><img src="/img/hancell_script_editor.PNG" alt="한셀 스크립트 편집기"></p>
<p>먼저 매크로는 <em>스크립트 편집기</em>라는 창에서 만들게되는데, SW자료실을 찾아보면 **Notepad++**가 있다. Atom, VSCode를 기대할 순 없다. (VBA자체가 워낙 단순해서 그닥 필요성을 못느끼게 되기도 한다.) Notepad++에서 만들고 붙여넣는 식이 훨씬 편하다. 한셀 매크로가 워낙 에러가 잦고 자주 팅기기도해서 한참 만들다가 전부 날려먹는 일이 많았다. 팅기는걸 보고 디버깅을 해야할때도 많다.</p>
<p>매크로는 일반적인 수식이랑 어떤점이 다를까? 데이터 색인, 조회등은 수식만으로도 충분하다. 하지만 1) 데이터 양이 엄청 많다면 2) 데이터의 입력, 수정을 해야할 경우엔 매크로가 필요하다. 조건을 만족하는 값을 찾아주는 것은 수식으로 충분하지만, 조건의 만족하는 값을 수정하는 것은 기본 기능으로는 불가능하다. 매크로 녹화기능도 단순작업은 반복할 수 있겠지만, 거의 모든 경우에는 의미가 없다.</p>
<p>매크로가 유용하게 쓰인 일례로 마일리지(또는 상벌점)이 있다. 우리 중대에서는 마일리지 제도가 있었는데, 마일리지 적립 내역을 기록하면서 사용할때마다 차감을 해야했다. 연속적인 기록을 하고 조회하는 것은 기본 엑셀의 기능으로도 충분하지만, 차감은 조금 까다롭다. 적립/사용하려는 사람이 몰려들면 직접 로그를 작성하는 것 마냥 기록하는 것은 훨씬 불편할 것이다. 마일리지 기록 관리를 맡게 된 후, 적잖은 개발기간 끝에(몇일은 걸린 듯 하다) 매크로를 사용해 한 시트에서 로그 확인/적립/사용을 모두 할 수 있었다.</p>
<p>정해진 형식의 문서에 각기 다른 값을 넣고 인쇄해야하는 작업이 있었는데, 데이터 값이 매우 많다면 매크로가 유용할 수 있다. 보통 표 형식의 인쇄물을 만들때면 아무리 다른 값이 많아도 한글로 만들곤 하는데, 한글은 단축키등에 익숙하다해도 사용자가 편집하는데에 스프레드시트 프로그램보다는 느릴 수 밖에 없다. 고정된 형식에 값만 바꿔넣어 인쇄하는 것이라면, 매크로를 만들어 인쇄하는 것이 시간을 정말 많이 줄여줄 수 있다.</p>
<p>매크로는 형식 수정에는 그닥 유용하지 않았다. 형식은 오류도 잦았고, 생각대로 되지 않는 경우가 많았다. 또한 한셀 자체가 안정성이 비교적 떨어지고, PC성능에도 한계가 있어 일정 크기 이상의 문서에서는 사용하기 힘들었다.</p>
<p>나는 전공자가 아니라, 이 시리즈에서 설명할 방법들은 알고리즘에대한 이해에서 도출된 방법보다는 실전에서 써먹기위해 생각해낸 방법들이 대부분이다. 그닥 쓸일은 없었지만 정렬정도는 도움이 됐던 것 같다. Naming Convention은 거의 지키지 않았고, 대부분의 경우에 camelCase를 사용했다. 추가로 책 <a href="http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&amp;ejkGb=KOR&amp;barcode=9788979149357"><em>엑셀 매크로 VBA 바이블</em></a>의 도움을 많이 받았다.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
