• 최초 작성일: 2000-11-12
  • 최종 수정일: 2026-09-30
  • 조회수: 10 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 상대주소와 절대주소 맘대로 바꾸기

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

이번 시간에는 질문 하나를 살펴봅니다.

안녕하세요? 오랜만에 질문하나 드립니다.
Vlookup 함수나 다른 파일을 참고할 때 절대주소를 사용하게 되지 않습니까?
보통 한 개의 셀에서 작업을 할 때, F4키를 누르면 절대주소에서 상대주소로,
또는 상대주소에서 절대주소로 바뀌는데 특정 범위 내에서 이것을 한꺼번에
바꾸어 줄 수는 없을까요?

아시면 한수 부탁드립니다. 안녕히 계세요.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

상대주소와 절대주소 맘대로 바꾸기

핵심 요약: 주소 형태 일괄 변환

ConvertFormula의 toabsolute 인수를 xlRelative, xlAbsolute, xlAbsRowRelColumn, xlRelRowAbsColumn으로 바꿔 수식의 주소 형태를 일괄 변환합니다.

  • 1단계: RefEdit 컨트롤에 초기 범위를 표시하고 사용자가 범위를 지정합니다.
  • 2단계: 지정한 범위가 유효한지 확인하고 오류가 있으면 다시 선택하게 합니다.
  • 3단계: 선택한 옵션에 맞는 인수로 ConvertFormula를 실행합니다.

Step 1: 어떤 결과를 원하는가

기본적으로 "수작업으로 가능한 것이면 자동화 할 수 있다"라고 생각하시면 아마도 틀림이 없을 것입니다. 버튼을 누르시면 대화상자가 나타나는데 원하는 주소형태를 지정해 보세요.

아래와 같은 표의 수식(예: =$C24*1.03)의 주소 형태를 선택한 범위 전체에서 한꺼번에 바꿔 보겠습니다.

지점명목표판매달성율
강동10001030.01.030
강서11501270.751.105
강남15001650.01.100
강북13501377.01.020

이번 강좌에서는 이것을 만들어 보도록 하지요.

Step 2: 유저폼 만들기

(1) VB Editor 상태에서 아래의 그림과 같은 유저폼을 하나 삽입합니다. 아시겠지만, 1개의 RefEdit 컨트롤과 Lagel, 4개의 캡션버튼, 1개의 Frame, 2개의 Command Button 등이 사용되었습니다.

RefEdit 컨트롤, 옵션 버튼 네 개, OK와 Close 버튼을 배치한 유저폼
아이엑셀러
옵션주소 형태예
상대주소A1A1
절대주소$A$1$A$1
혼합주소 1행 절대, 열 상대A$1
혼합주소 2행 상대, 열 절대$A1

Step 3: 초기값 정의하기

(2) 컨트롤이 없는 빈 공간을 더블클릭 한 다음, 이벤트 선택 목록상자에서 Initialize 이벤트를 선택하고 코드를 작성합니다.

Private Sub UserForm_Initialize()
    Range("Start").Select
    RefEdit1.Text = Selection.CurrentRegion.Address
    '//이것은 유저폼이 호출될 때, RefEdit1 컨트롤의 초기값을 설정하기 위한 것입니다.
    '//즉, 현재 셀이 위치한 주변 영역(CurrentRegion)의 주소를 RefEdit 컨트롤에 표시합니다.
End Sub

Step 4: OK 버튼 코드 작성하기

(3) Shift + <F7>키를 눌러 대화상자를 다시 불러온 다음, OK 버튼을 더블클릭하고 해당 코드를 작성합니다.

Private Sub btnOK_Click()
    Dim i As Integer
    Dim Msg As String
    Dim rngCell As Range
    Dim rngTarget As Range
    On Error Resume Next
    Set rngTarget = Range(RefEdit1.Text)
    '//변수들을 지정하고, RefEdit1 컨트롤에 들어있는 (영역)값을 rngTarget 오브젝트 변수에
    '//담습니다.

    If Err <> 0 Then
        Msg = "유효하지 않은 범위입니다." & vbCr
        Msg = Msg & "범위를 다시 선택하세요"
        MsgBox Msg, , "범위 선택 오류//Exceller"
        RefEdit1.SetFocus
        Exit Sub
        '//Range 오브젝트가 아닌 것을 선택하거나 하는 등의 에러가 발생했을 경우, 범위를
        '//다시 지정하도록 합니다.

    End If

    On Error GoTo 0
    Select Case True
    '//4개의 옵션 버튼 중에서 어떤 것이 선택되었는지 확인해서 셀의 주소형태를 그에 맞게
    '//바꾸어 줍니다.

        Case optRel
        '//선택된 영역의 주소를 상대주소로 바꾸어 주는 부분입니다. ConvertFormula 메서드를
        '//사용합니다.

            For Each rngCell In rngTarget
                If rngCell.HasFormula Then rngCell.Formula = Application.ConvertFormula(Formula:=rngCell.Formula, _
                    fromreferencestyle:=xlA1, toreferencestyle:=xlA1, toabsolute:=xlRelative)
            Next rngCell
            MsgBox "모두 상대주소 형태로 바꾸었습니다", , "작업 완료//Exceller"

        Case optAbs
        '//절대주소로 바꾸어 주는 부분입니다. Toabsolute 요소를 xlAbsolute로 지정해 주면
        '//됩니다.
            For Each rngCell In rngTarget
                If rngCell.HasFormula Then rngCell.Formula = Application.ConvertFormula(Formula:=rngCell.Formula, _
                    fromreferencestyle:=xlA1, toreferencestyle:=xlA1, toabsolute:=xlAbsolute)
            Next rngCell
            MsgBox "모두 절대주소 형태로 바꾸었습니다", , "작업 완료//Exceller"

        Case optCol
        '//혼합주소(행방향은 절대주소, 열방향은 상대주소)로 바꾸어 주기 위한 부분입니다.

            For Each rngCell In rngTarget
                If rngCell.HasFormula Then rngCell.Formula = Application.ConvertFormula(Formula:=rngCell.Formula, _
                    fromreferencestyle:=xlA1, toreferencestyle:=xlA1, toabsolute:=xlAbsRowRelColumn)
            Next rngCell
            MsgBox "모두 혼합주소 형태(A$1)로 바꾸었습니다", , "작업 완료//Exceller"

        Case optRow
        '//혼합주소(행방향은 상대주소, 열방향은 절대주소)로 바꾸어 주기 위한 부분입니다.

            For Each rngCell In rngTarget
                If rngCell.HasFormula Then rngCell.Formula = Application.ConvertFormula(Formula:=rngCell.Formula, _
                    fromreferencestyle:=xlA1, toreferencestyle:=xlA1, toabsolute:=xlRelRowAbsColumn)
            Next rngCell
            MsgBox "모두 혼합주소 형태($A1)로 바꾸었습니다", , "작업 완료//Exceller"
    End Select

End Sub

Close 버튼에는 유저폼을 닫는 코드를 연결합니다.

Private Sub btnClose_Click()
    Unload Me
End Sub

Application.ConvertFormula는 수식의 참조 스타일(A1/R1C1)과 절대·상대 여부를 바꾸어 주는 메서드입니다. 다만 수식에 이름 정의나 다른 시트 참조가 섞여 있으면 결과를 확인해 보는 것이 좋으며, 작업 전에 파일을 백업해 두는 것을 권장합니다.

마무리

생활하다 보면, "혹시 이러이러한 일이 Excel 또는 VBA를 통해서 가능할까요?" 이러한 질문을 자주 받습니다.

Exceller에게 있어 작업 가능여부 판단기준은 "손으로 작업이 가능한가" 여부입니다. 그래서 Exceller가 주로 하는 답변은, "그러면 그것을 수작업을 통해서는 어떤 식으로 해결하고 계십니까?" 라고 제일 먼저 물어봅니다.

명확하고, 구체화된 문제점은 (특별한 경우를 제외하고는) 반드시 해결가능합니다. 마찬가지로 아무리 쉬운 문제라도 이를 구체화시키지 않으면(또는 못하면) 그만큼 해결이 어려워 집니다. 막연한 문제는 막연한 해결책을 낳을 뿐이지요.

다음 시간에 또…

정리 — 주소 형태 변환 핵심

구분 사용한 코드 역할
범위 지정 RefEdit1.Text RefEdit 컨트롤에서 범위 읽기
상대주소 toabsolute:=xlRelative A1 형태
절대주소 toabsolute:=xlAbsolute $A$1 형태
혼합주소 xlAbsRowRelColumn / xlRelRowAbsColumn A$1, $A1 형태
오류 처리 If Err <> 0 Then 잘못된 범위 다시 선택

자주 묻는 질문 (FAQ)

Q1. 수식의 절대·상대주소를 한꺼번에 바꿀 수 있나요?

Application.ConvertFormula의 toabsolute 인수를 지정해 범위의 각 셀 수식을 순환하며 변환할 수 있습니다.

Q2. RefEdit 컨트롤은 무엇인가요?

유저폼에서 사용자가 시트의 범위를 마우스로 지정할 수 있게 해 주는 컨트롤입니다.

Q3. 작업 가능 여부는 어떻게 판단하나요?

손으로 작업이 가능한지를 기준으로 삼고, 수작업 과정을 구체화하면 자동화할 수 있습니다.

마치며

명확하고 구체화된 문제는 반드시 해결할 수 있으며, 수작업 과정이 곧 자동화의 출발점입니다.