엑셀 Power Query 열 이름이 바뀔 때 오류 해결: 동적 열 선택·언피벗

엑셀 Power Query 쿼리가 처음에는 정상적으로 새로고침되다가 원본 파일의 열 이름이나 열 개수가 바뀐 뒤 다음과 같은 오류를 표시할 수 있습니다.

Expression.Error
테이블의 열을 찾을 수 없습니다.

The column '열 이름' of the table wasn't found.

오류가 나지 않더라도 새로 추가된 월별 열이 결과에 포함되지 않거나, 삭제된 열을 참조하는 변경된 유형 단계에서 새로고침이 멈출 수 있습니다.

이런 문제를 해결하려면 모든 열을 무조건 무시하도록 바꾸기보다 먼저 해당 열이 반드시 필요한 열인지, 없어도 되는 선택 열인지, 매번 이름이 바뀌는 데이터 열인지를 구분해야 합니다.


엑셀 Power Query에서 원본 열 추가와 삭제에 따라 동적 열 처리 방법을 구분하는 대표 개념 이미지
원본 열이 바뀌면 고정된 열 선택·형식 변환·이름 변경 단계에서 오류가 발생하거나 새 열이 누락될 수 있습니다. 위 이미지는 Power Query 동적 열 처리 구조를 설명하기 위한 대표 개념 이미지입니다.

이 글은 Microsoft의 Power Query M 함수인 Table.ColumnNames, Table.SelectColumns, Table.RemoveColumns, Table.RenameColumns, Table.TransformColumnTypes, Table.UnpivotOtherColumns와 MissingField 공식 문서를 기준으로 작성했습니다. 예제의 테이블명과 열 이름은 실제 원본 구조에 맞게 변경해야 합니다.

새로고침이 깨지는 단계부터 확인합니다

Power Query 편집기 오른쪽의 적용된 단계를 위에서 아래로 하나씩 선택하면 어느 단계부터 오류가 시작되는지 확인할 수 있습니다.

원본 열이 바뀌었을 때 주로 문제가 되는 단계는 다음과 같습니다.

  • 제거된 열
  • 선택한 열 또는 다른 열 제거됨
  • 이름을 바꾼 열
  • 변경된 유형
  • 다시 정렬된 열
  • 병합 후 확장된 열
  • 특정 열만 지정한 피벗 해제 단계

예를 들어 다음 코드는 원본에 할인액 열이 항상 있다고 가정합니다.

let
    Source =
        Excel.CurrentWorkbook(){[Name="tblSales"]}[Content],

    ChangedType =
        Table.TransformColumnTypes(
            Source,
            {
                {"주문일", type date},
                {"고객명", type text},
                {"매출액", type number},
                {"할인액", type number}
            },
            "ko-KR"
        )
in
    ChangedType

원본에서 할인액 열이 삭제되거나 이름이 바뀌면 Table.TransformColumnTypes는 해당 열을 찾지 못해 오류를 발생시킬 수 있습니다.

이때 할인액이 반드시 필요한 열인지, 없어도 되는 선택 열인지에 따라 수정 방법이 달라집니다.

필수 열이 없다면 오류를 숨기지 않습니다

주문일, 고객명, 매출액처럼 이후 계산에 반드시 필요한 열을 MissingField.Ignore로 무시하면 쿼리는 계속 실행될 수 있지만 결과의 의미가 달라질 수 있습니다.

필수 열은 현재 원본에 존재하는지 확인하고, 누락됐다면 어떤 열이 없는지 설명하는 오류를 발생시키는 편이 적절합니다.

let
    Source =
        Excel.CurrentWorkbook(){[Name="tblSales"]}[Content],

    RequiredColumns =
        {"주문일", "고객명", "매출액"},

    CurrentColumns =
        Table.ColumnNames(Source),

    MissingColumns =
        List.Difference(
            RequiredColumns,
            CurrentColumns
        ),

    CheckedSource =
        if List.Count(MissingColumns) > 0 then
            error
                "필수 열 누락: " &
                Text.Combine(MissingColumns, ", ")
        else
            Source,

    SelectedColumns =
        Table.SelectColumns(
            CheckedSource,
            RequiredColumns
        ),

    ChangedType =
        Table.TransformColumnTypes(
            SelectedColumns,
            {
                {"주문일", type date},
                {"고객명", type text},
                {"매출액", type number}
            },
            "ko-KR"
        )
in
    ChangedType

이 코드의 처리 순서는 다음과 같습니다.

  1. Table.ColumnNames로 현재 원본의 열 이름을 가져옵니다.
  2. List.Difference로 필수 열 중 누락된 열을 찾습니다.
  3. 누락된 필수 열이 있으면 열 이름을 포함한 오류를 발생시킵니다.
  4. 필수 열이 모두 있을 때만 열 선택과 형식 변환을 실행합니다.
필수 열 누락을 오류로 처리해야 하는 경우

매출액 없이 합계를 계산하면 안 되는 경우
주문번호가 없어 중복 여부를 판별할 수 없는 경우
날짜 열이 없어 월별 집계 기준을 만들 수 없는 경우
고객 식별 열이 없어 다른 테이블과 병합할 수 없는 경우

선택 열은 없을 때 null 열을 만들 수 있습니다

할인액이나 비고처럼 일부 파일에는 있고 일부 파일에는 없는 열이라도 최종 결과 테이블의 열 구조를 일정하게 유지해야 할 수 있습니다.

이때 Table.SelectColumns의 세 번째 인수에 MissingField.UseNull을 지정하면 없는 열을 null 값으로 추가할 수 있습니다.

let
    Source =
        Excel.CurrentWorkbook(){[Name="tblSales"]}[Content],

    SelectedColumns =
        Table.SelectColumns(
            Source,
            {
                "주문일",
                "고객명",
                "매출액",
                "할인액"
            },
            MissingField.UseNull
        ),

    ChangedType =
        Table.TransformColumnTypes(
            SelectedColumns,
            {
                {"주문일", type date},
                {"고객명", type text},
                {"매출액", type number},
                {"할인액", type number}
            },
            "ko-KR"
        )
in
    ChangedType

원본에 할인액 열이 없으면 결과에는 할인액 열이 생성되고 각 행의 값은 null이 됩니다.

이 방식은 최종 열 구성을 고정해야 하는 보고서나 다른 쿼리와 추가·병합할 때 유용합니다. 다만 원본에 새로 생긴 다른 열은 Table.SelectColumns 목록에 없으므로 결과에서 제외됩니다.

없어도 되는 제거 대상 열은 MissingField.Ignore를 사용합니다

원본에 있을 때만 제거하면 되는 임시 열이나 메모 열이라면 Table.RemoveColumnsMissingField.Ignore를 지정할 수 있습니다.

let
    Source =
        Excel.CurrentWorkbook(){[Name="tblSales"]}[Content],

    RemovedOptionalColumns =
        Table.RemoveColumns(
            Source,
            {
                "임시열",
                "작성자메모",
                "불러오기순서"
            },
            MissingField.Ignore
        )
in
    RemovedOptionalColumns

세 열 중 일부가 원본에 없어도 제거 단계에서 오류가 발생하지 않습니다. 존재하는 열만 제거합니다.

MissingField.Ignore를 모든 단계에 넣지 마세요

이 옵션은 없어도 되는 열을 처리할 때 사용합니다. 업무상 필수인 열까지 무시하면 원본 구조가 잘못됐는데도 빈 결과나 불완전한 결과가 만들어질 수 있습니다.

열 이름 변경도 선택 열에만 Ignore를 적용합니다

공급처마다 같은 의미의 열을 서로 다른 이름으로 제공하는 경우에는 표준 이름으로 변경할 수 있습니다.

let
    Source =
        Excel.CurrentWorkbook(){[Name="tblSales"]}[Content],

    RenamedColumns =
        Table.RenameColumns(
            Source,
            {
                {"거래처명", "고객명"},
                {"판매금액", "매출액"},
                {"할인금액", "할인액"}
            },
            MissingField.Ignore
        )
in
    RenamedColumns

원본에 이전 열 이름이 없으면 해당 이름 변경만 건너뜁니다.

하지만 원본에 이미 고객명 열이 있는데 거래처명고객명으로 변경하려 하면 동일한 열 이름이 겹칠 수 있습니다. MissingField.Ignore는 이전 열이 없는 경우를 처리하는 옵션이지, 중복되는 새 열 이름을 자동으로 합치는 기능은 아닙니다.

현재 존재하는 열에만 형식 변환을 적용합니다

원본의 열을 모두 유지하면서, 미리 정한 열이 실제로 있을 때만 날짜·텍스트· 숫자 형식을 적용하고 싶다면 현재 열 목록과 형식 규칙을 비교할 수 있습니다.

let
    Source =
        Excel.CurrentWorkbook(){[Name="tblSales"]}[Content],

    TypeRules =
        {
            {"주문일", type date},
            {"고객명", type text},
            {"매출액", type number},
            {"할인액", type number},
            {"담당자", type text}
        },

    CurrentColumns =
        Table.ColumnNames(Source),

    ApplicableRules =
        List.Select(
            TypeRules,
            each List.Contains(
                CurrentColumns,
                _{0}
            )
        ),

    ChangedType =
        Table.TransformColumnTypes(
            Source,
            ApplicableRules,
            "ko-KR"
        )
in
    ChangedType

TypeRules에는 적용하고 싶은 전체 규칙을 작성합니다. ApplicableRules는 그중 현재 원본에 실제로 존재하는 열의 규칙만 남깁니다.

따라서 할인액이나 담당자 열이 없는 파일에서도 형식 변환 단계는 실행되고, 원본에 새로 추가된 다른 열도 삭제되지 않습니다.

이 방법은 선택 열에 적합합니다. 주문일이나 매출액처럼 필수인 열은 앞에서 설명한 필수 열 검사와 함께 사용하는 편이 안전합니다.

필수 열 검사와 선택 열 형식 변환을 함께 사용합니다

다음 코드는 주문일·고객명·매출액은 필수로 검사하고, 할인액·담당자는 원본에 있을 때만 형식을 지정합니다.

let
    Source =
        Excel.CurrentWorkbook(){[Name="tblSales"]}[Content],

    RequiredColumns =
        {"주문일", "고객명", "매출액"},

    CurrentColumns =
        Table.ColumnNames(Source),

    MissingRequiredColumns =
        List.Difference(
            RequiredColumns,
            CurrentColumns
        ),

    CheckedSource =
        if List.Count(MissingRequiredColumns) > 0 then
            error
                "필수 열 누락: " &
                Text.Combine(
                    MissingRequiredColumns,
                    ", "
                )
        else
            Source,

    TypeRules =
        {
            {"주문일", type date},
            {"고객명", type text},
            {"매출액", type number},
            {"할인액", type number},
            {"담당자", type text}
        },

    CheckedColumns =
        Table.ColumnNames(CheckedSource),

    ApplicableRules =
        List.Select(
            TypeRules,
            each List.Contains(
                CheckedColumns,
                _{0}
            )
        ),

    ChangedType =
        Table.TransformColumnTypes(
            CheckedSource,
            ApplicableRules,
            "ko-KR"
        )
in
    ChangedType

필수 열이 없으면 어떤 열이 누락됐는지 표시하고 실행을 중단합니다. 선택 열은 존재하는 경우에만 형식을 변환합니다.

누락된 필수 열을 숨기지 않으면서도 파일마다 달라질 수 있는 선택 열을 허용하는 구조입니다.

월별 열이 계속 추가되면 다른 열 피벗 해제를 사용합니다

다음과 같이 월이 열 머리글로 들어 있는 자료를 가정합니다.

상품 지역 1월 2월 3월
제품 A 서울 100 120 130

1월·2월·3월을 직접 선택해 피벗 해제하면 4월 열이 추가됐을 때 기존 단계에 자동으로 포함되지 않을 수 있습니다.

상품과 지역을 기준 열로 남기고 나머지 모든 열을 피벗 해제하면 새로 추가된 월 열도 같은 구조로 변환할 수 있습니다.

let
    Source =
        Excel.CurrentWorkbook(){[Name="tblMonthlySales"]}[Content],

    RequiredColumns =
        {"상품", "지역"},

    CurrentColumns =
        Table.ColumnNames(Source),

    MissingColumns =
        List.Difference(
            RequiredColumns,
            CurrentColumns
        ),

    CheckedSource =
        if List.Count(MissingColumns) > 0 then
            error
                "기준 열 누락: " &
                Text.Combine(MissingColumns, ", ")
        else
            Source,

    UnpivotedColumns =
        Table.UnpivotOtherColumns(
            CheckedSource,
            {"상품", "지역"},
            "월",
            "매출액"
        ),

    ChangedType =
        Table.TransformColumnTypes(
            UnpivotedColumns,
            {
                {"상품", type text},
                {"지역", type text},
                {"월", type text},
                {"매출액", type number}
            },
            "ko-KR"
        )
in
    ChangedType

원본에 4월·5월 열이 추가되면 상품과 지역을 제외한 열이 모두 매출액 열의 행으로 변환됩니다.

예상하지 않은 열도 함께 피벗 해제될 수 있습니다

Table.UnpivotOtherColumns는 기준 열을 제외한 모든 열을 변환합니다. 원본에 비고, 작성자, 파일명 같은 열이 새로 추가되면 그 열도 월별 데이터처럼 변환될 수 있습니다. 기준 열 이외의 열이 모두 측정값 열이라는 원본 구조에서 사용해야 합니다.

새 열이 생겼는데 결과에 보이지 않는 경우

원본 단계에서 새 열이 확인되는데 최종 결과에 나타나지 않는다면 이후 적용된 단계 중에서 열 목록을 고정한 부분을 확인합니다.

Table.SelectColumns를 사용한 경우

지정한 열만 결과에 남기므로 새 열은 자동으로 제외됩니다.

Table.SelectColumns(
    Source,
    {"주문일", "고객명", "매출액"}
)

결과 스키마를 고정하려는 목적이라면 정상적인 동작입니다. 새 열도 유지해야 한다면 열을 선택하는 단계가 필요한지 다시 판단해야 합니다.

다른 열 제거를 사용한 경우

Power Query 화면에서 특정 열만 선택하고 다른 열 제거를 사용하면 선택한 열 목록이 M 코드에 고정됩니다. 이후 원본에 추가된 열은 결과에서 제외될 수 있습니다.

확장할 열 목록이 고정된 경우

쿼리 병합 후 테이블 열을 확장할 때 확장 대상 열 이름이 코드에 목록으로 저장됩니다. 병합된 테이블에 새 열이 생겨도 기존 확장 목록에 포함되지 않으면 결과에 나타나지 않을 수 있습니다.

새 열이 반드시 필요하다면 확장 단계의 열 목록을 다시 확인합니다. 반대로 보고서 결과의 열 구성을 고정해야 한다면 기존 목록을 유지하는 것이 맞을 수 있습니다.

열 이름의 공백과 보이지 않는 문자도 확인합니다

화면에는 같은 열 이름처럼 보여도 앞뒤 공백이나 줄 바꿈 문자가 포함돼 있으면 M 코드에서 서로 다른 이름으로 인식될 수 있습니다.

원본 열 이름을 일괄 정리해야 한다면 Table.TransformColumnNames와 텍스트 정리 함수를 사용할 수 있습니다.

let
    Source =
        Excel.CurrentWorkbook(){[Name="tblSales"]}[Content],

    CleanedColumnNames =
        Table.TransformColumnNames(
            Source,
            each Text.Trim(
                Text.Clean(_)
            )
        )
in
    CleanedColumnNames

이 코드는 열 이름의 앞뒤 공백을 제거하고 제어 문자를 정리합니다.

다만 공백 제거 결과 서로 다른 두 열의 이름이 같아질 가능성이 있다면 원본 머리글을 먼저 확인해야 합니다. 이름 정리만으로 서로 다른 열을 자동 병합하지 않습니다.

동적 처리와 고정 스키마 중 무엇이 필요한지 결정합니다

필수 열이 사라지면 결과를 만들면 안 됨
Table.ColumnNames와 List.Difference로 누락된 열을 확인한 뒤 명확한 오류를 발생시킵니다.
선택 열이 없더라도 최종 열 구조는 유지해야 함
Table.SelectColumns와 MissingField.UseNull을 사용합니다.
임시 열이 있을 때만 제거하면 됨
Table.RemoveColumns와 MissingField.Ignore를 사용합니다.
존재하는 선택 열에만 형식을 적용하고 싶음
Table.ColumnNames와 List.Select로 현재 존재하는 열의 형식 규칙만 남깁니다.
월·일자·항목 열이 계속 추가됨
고정된 기준 열을 남기고 Table.UnpivotOtherColumns로 나머지 열을 행 구조로 변환합니다.
새 열을 결과에 포함하면 안 됨
Table.SelectColumns로 허용된 열만 선택해 고정된 출력 스키마를 유지합니다.

내용 확인에 사용한 Microsoft 공식 자료

공식 문서 확인일: 2026년 7월 28일

Post a Comment

다음 이전