열이 동일한 Excel에서 두 테이블을 병합하려면 어떻게합니까?


11

Excel에는 SQL 데이터베이스에서 테이블로 데이터를 가져온 다음 해당 데이터를 기반으로 보고서를 생성하는 스프레드 시트가 있습니다. 불행히도이 SQL 데이터베이스의 데이터가 불완전하며 스프레드 시트에 수동으로 입력 된 결과 행에 추가 행을 포함시키고 싶습니다.

Excel이 SQL 데이터베이스에서 새 데이터를 가져올 때마다 삭제되기 때문에 추가 행을 테이블에 수동으로 삽입 할 수는 없습니다. 대신 새 시트에 동일한 열 머리글로 별도의 테이블을 만들고 거기에 데이터를 입력 한 다음 다른 시트에서 세 번째 테이블을 만들어 테이블의 행을 결합하여 SQL에서 데이터를 가져옵니다. 데이터를 수동으로 입력하는 테이블. 어떻게하면됩니까? (또는 다른 방법으로, 내가 놓친 더 좋은 방법이 있습니까?)


예:

Table 1 (From Database):

  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Foo  | 12    |
  | Mary   | 1/6/13  | Foo  | 7     |
  | Mary   | 1/6/13  | Bar  | 5     |
  | John   | 1/6/13  | Foo  | 5     |
  | John   | 1/13/13 | Foo  | 13    |

-

Table 2 (Entered Manually): 
  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Baz  | 3     |
  | Mary   | 1/6/13  | Baz  | 2     |
  | John   | 1/13/13 | Baz  | 5     |

-

Result:
  | Person | Week Of | Task | Hours |
  | Bob    | 1/6/13  | Foo  | 12    |
  | Mary   | 1/6/13  | Foo  | 7     |
  | Mary   | 1/6/13  | Bar  | 5     |
  | John   | 1/6/13  | Foo  | 5     |
  | John   | 1/13/13 | Foo  | 13    |
  | Bob    | 1/6/13  | Baz  | 3     |
  | Mary   | 1/6/13  | Baz  | 2     |
  | John   | 1/13/13 | Baz  | 5     |

수동으로 추가 한 데이터가 SQL 데이터 아래에 있으면 괜찮습니까? 또는 날짜별로 정렬해야합니까? Excel은 기존 SQL 데이터 행 바로 아래에있는 행을 덮어 쓰지 않습니다. 그러나 두 데이터 유형을 모두 정렬해야 할 경우 전체가 더 복잡합니다.
nixda

글쎄, 나는 그것들이 정렬되는 것을 선호하지만 완전히 필요하지는 않습니다. 중요한 것은 피벗 테이블 및 기타 Excel 도구를 사용하여 수동 및 자동으로 채워진 테이블을 포함하여 전체 데이터 세트를 분석 할 수 있다는 것입니다. 또한 SQL에서 새 데이터를 자동으로 계속 가져올 수 있어야합니다.
Ajedi32

이 행동이 해결책일까요? 후 첫 번째 쿼리 이후 두 번째 쿼리 . 물론 통합 문서를 열면 Excel에서 SQL을 자동으로 업데이트합니다.
nixda

그것은 내가 생각하는 작동합니다. 차라리 단일 테이블에 데이터를 가지고 있으므로 필터링, 정렬 등을 수행 할 수 있지만 이전에 말했듯이 완전히 필요하지는 않습니다.
Ajedi32

어쩌면 우리는 정렬 문제에 대한 해결책을 찾을 수 있습니다. 그러나 첫 번째 단계에서는 새 통합 문서에서 SQL을 처음 쿼리하십시오. 그런 다음 바로 아래에 수동 항목을 추가하십시오. 이제 두 번째 (이상) 쿼리로 테스트하십시오. 덮어 쓰지 않습니다. 표준 동작입니다. 특별한 일이 없습니다.
nixda

답변:


2

VBA가없는 순수한 Excel 솔루션이 있습니다. INDEX 함수를 사용하여 값이 소진되고 오류 조건이 발생할 때까지 SQL 데이터의 행과 열에서 스텝 다운합니다. IFERROR 함수는 오류를 포착하고 두 번째 INDEX 함수를 사용하여 해당 값이 소진되고 오류 조건이 발생할 때까지 수동으로 입력 한 데이터의 행과 열에서 단계적으로 내려갑니다. 두 번째 IFERROR 함수는 오류를 포착하고 대시 ( "-")를 반환합니다. 수식이 올바른 결과를 얻으려면 리본을 통해 SQL 데이터를 새로 고쳐야합니다.

다음 공식을 사용하여 Sheet1의 SQL 데이터에 대해 동적 명명 된 범위 SQLDB를 작성 하십시오.

=OFFSET(Sheet1!$A$2,0,0,COUNTA(Sheet1!$A:$A)-1,COUNTA(Sheet1!$1:$1))

다음 공식을 사용하여 Sheet2에 수동으로 입력 한 데이터에 대해 두 번째 동적 이름 범위 EXCELRNG를 작성 하십시오.

=OFFSET(Sheet2!$A$1,1,0,COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet2!$1:$1))

이러한 명명 된 범위는 변수 이름이 두 시트 각각의 행 1에 입력되었다고 가정합니다.

Sheet3의 1 행에 변수 이름을 입력하십시오 (A1 셀에서 시작).

Sheet3의 A2 셀에 다음 수식을 입력하십시오 .

=IFERROR(INDEX(SQLDB,ROWS(A$2:A2),COLUMN(A2)),IFERROR(INDEX(EXCELRNG,ROWS(A$2:A2)-ROWS(SQLDB),COLUMN(A2)),"-"))

변수 이름 열에서 수식을 복사 한 다음 수식 결과가 모두 대시 ( "-")가 될 때까지 행을 아래로 내립니다.

다음 단계로 분석 및 구성을 위해 다른 시트에 피벗 테이블을 만들 수 있습니다.

다시 첫 번째 단계는 이름 지정된 범위의 이름 관리자 입력 상자에 다음 공식을 삽입하여 RESULTRNG와 같은 동적 이름 지정된 범위를 작성하는 것입니다.

=OFFSET(Sheet3!$A$1,0,0,COUNTA(Sheet1!$A:$A)+COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet1!$1:$1))

그런 다음 RESULTRNG를 분석하려는 테이블로 설정하여 새 시트에 피벗 테이블을 만듭니다. 그러면 Sheet3의 수식 테이블에서 후행 대시가 필터링됩니다.

이것은 RESULTRNG 수식이 Sheet1 및 Sheet2의 총 행 수 (Sheet2의 헤더 제외)와 Sheet1의 총 열 수를 계산하고 후행 행의 대시를 제외하고 해당 수를 기반으로 범위를 설정하기 때문에 작동합니다 ( 또는 Sheet3 수식 표에 나와 있습니다.


이렇게하면 결합 된 테이블이 고정 크기 일 필요는 없습니까? 그리고 테이블을 필요한 것보다 크게 만들면 결합 된 테이블의 데이터를 처리하는 피벗 테이블을 만들려고해도 문제가되지 않습니까? (표의 일부 값은 '-'문자이므로?) 아니면 이러한 문제를 해결할 방법이 있습니까?
Ajedi32

(Btw, 나는 일반적으로 사용자가 작업을 시작하기 전에 매크로를 활성화 할 필요가 없기 때문에 이와 같은 순수한 Excel 솔루션을 선호합니다.)
Ajedi32

수식이 두 테이블의 모든 데이터를 캡처했는지 확인하려면 약간의 유지 관리가 필요합니다. 대시를 피하려면 수식을 대시가 아닌 데이터를 반환 한 위치로만 복사해야합니다.
chuff

병합되지 않은 병합 된 테이블의 행 ( '-'문자로 채워짐) 만 포함하는 다른 명명 된 범위를 만들 수 있습니까? 그렇게하면 피벗 테이블을 설정하여 해당 범위에서 데이터를 가져올 수 있으며 대시에 대해 걱정할 필요가 없습니다.
Ajedi32

대시를 제외하고 피벗 테이블을 만드는 방법을 설명하기 위해 대답을 확장했습니다. "대시없는"테이블을 넣으려고하면 소스 데이터의 행 수가 변경 될 때마다 새 테이블의 크기가 수동으로 조정되지 않으면 대시 셀에 # N / A가있는 대시 문제가 다른 시트로 전송됩니다.
chuff

5

나는 그것을하는 방법을 찾았습니다. 이 솔루션은 약간 까다롭기 때문에 두 테이블에 별도의 시트가 있어야하지만 그 외에는 내가 원하는 것을 거의 수행해야합니다. (여기서 조인과 같은보다 복잡한 작업을 수행 할 가능성도 많이 있습니다.)

리본의 데이터 탭으로 이동하여 "다른 소스에서"및 "Microsoft 쿼리에서"를 클릭하십시오. 그런 다음 Excel 파일을 클릭하고 현재 작업중인 파일을 선택한 다음 확인을 클릭하십시오. 그런 다음 취소를 누르고 Microsoft Query에서 계속 편집 할 것인지를 승격하면 "예"를 누르십시오. 여기에서 SQL 버튼을 클릭하고 스프레드 시트의 시트에 사용자 지정 SQL 쿼리를 작성할 수 있습니다. 나의 경우에는:

SELECT *
FROM `'Sheet1$'` `'Sheet1$'`
UNION ALL
SELECT *
FROM `'Sheet2$'` `'Sheet2$'`

참고 : 저 에게이 방법은 파일을 닫았다가 다시 연 후에 작동을 멈 춥니 다. 어쨌든 내 컴퓨터에 문제가 있거나 다른 사람이 작동시킬 수 있도록 여기에 게시하고 있습니다.


1
두 개의 다른 통합 문서를 연결하는 것이 좋습니다. 바로 내가 필요한 것입니다. 감사합니다!
dave

이 방법은 저에게 매우 효과적입니다. 쿼리를 실행 한 다음 단순히 데이터를 복사하여 Excel에 붙여 넣습니다. 그러나 데이터에서 중복 행을 제거한다는 점에 유의해야합니다.이 답변을 약간 편집해도 괜찮습니다.
Some_Guy

실제로 이것이 나에게 일어났기 때문에 추가하여 총 판매량을 얻기 위해 피봇 테이블을 만들기 전에 많은 판매 데이터를 1 개의 스프레드 시트로 병합하는 데 거의 사용했습니다. 놓쳤다.
Some_Guy

@Some_Guy 대신 UNION ALL을 사용하십시오.
Ajedi32

3

VBA 솔루션에 관심이 있다면 다음을 수행 할 수있었습니다.

  • SQL Server에서 가져 오는 데이터의 동적 명명 된 범위를 설정하십시오. 이름 관리자를 열고 새 이름 (예 : "SQLDB")을 입력 한 후 참조 입력 상자에 다음 공식을 복사하십시오. 가져온 데이터가 Sheet1에 있다고 가정했습니다.

    =OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),COUNTA(Sheet1!$1:$1))
    
  • 수동 데이터가 입력되는 범위에 대해 다른 명명 된 범위를 설정하십시오. EXCELRNG라는 이름을 사용하고 이름이 Sheet2에 있다고 가정했습니다. 명명 된 범위는 행 2에서 시작하여 헤더 행을 제외합니다. 여기에서 공식은 참조하는 시트를 제외하고 첫 번째 공식과 동일합니다.

    =OFFSET(Sheet2!$A$1,1,0,COUNTA(Sheet2!$A:$A)-1,COUNTA(Sheet2!$1:$1))
    
  • 다음은 SQL 테이블에 연결하는 데 사용한 첫 번째 설정입니다. 대화 상자는 리본의 데이터 탭에서 연결을 선택하여 액세스합니다. 백그라운드 새로 고침을 비활성화하면 Excel 시트의 데이터 새로 고침이 완료 될 때까지 VBA 매크로가 일시 중지됩니다. 워크 시트를 열 때 연결을 새로 고치는 것이 필요하지 않을 수도 있지만 매크로가 실행되기 전에 인증이 수행되도록하고 싶었습니다.

연결 설정

  • 다음은 두 번째 설정입니다. 데이터 탭의 속성 섹션에 있습니다 (가져온 SQL 테이블의 셀이 선택된 상태). "새 데이터에 대해 전체 행 삽입, 사용하지 않는 셀 삭제"옵션을 선택했지만 실제로 "셀 삽입 ..."옵션에 문제가 발생하지 않았습니다.

연결 속성

  • 마지막으로 이것은 VBA 코드입니다. 삽입하려면 개발자 탭에서 Visual Basic을 선택하십시오. 왼쪽의 목록에서 워크 시트 이름을 강조 표시하십시오. "VBA 프로젝트 (시트 이름)"로 표시됩니다. 그런 다음 화면 상단의 메뉴 표시 줄에서 모듈 삽입을 선택하고 새 모듈에 코드를 붙여 넣습니다. 통합 된 테이블을 시트 3에 넣었습니다. 매크로는 새 테이블을 정렬하지 않지만 추가하기는 어렵지 않습니다.

    Sub StackTables()
    
       Dim Rng1 As Range, Rng2 As Range
    
       Set Rng1 = ThisWorkbook.Names("SQLDB").RefersToRange
       Set Rng2 = ThisWorkbook.Names("EXCELRNG").RefersToRange
    
       ' refresh the SQL table
       ThisWorkbook.Connections(1).Refresh
    
       ' clear the consolidated table range  
       Sheet3.Cells.ClearContents
    
       ' copy the SQL data into the consolidation range
       Rng1.Copy
       Sheet3.Range("A1").PasteSpecial xlPasteValues
    
       'copy the manually entered data into the consolidate range
       Rng2.Copy
       Sheet3.Range("A1").Offset(Rng1.Rows.Count, 0).PasteSpecial xlPasteValues
       Application.CutCopyMode = False
    
       Sheets("Sheet3").Activate
       ActiveSheet.Range("A1").Select
    
    End Sub
    

이것은 매우 견고한 솔루션처럼 보입니다. 그래도 몇 가지 질문이 있습니다. 이 매크로를 유발하는 요인은 무엇입니까? 데이터 연결을 새로 고칠 때 자동으로 실행되거나 별도의 버튼을 눌러 수동으로 실행해야합니까? 둘째, 이것은 테이블과 함께 작동합니까? (테이블 형식이 아닌 범위 만이 아닙니다.) 그렇다면 테이블 자체에서 정렬을 처리 할 수 ​​없습니까? (제안대로 VBA 매크로 대신 정렬을 수행합니까?)
Ajedi32

1
그대로, 개발자 탭에서 매크로를 선택한 다음 매크로를 선택하고 실행하여 매크로를 실행합니다. 두 가지 대안 : 리본의 사용자 정의 단추에이를 지정하고이를 사용하여 실행하십시오. 또는 Worksheet_Activate 이벤트에 매크로 코드로 포함하십시오. 연결 시트를 선택할 때마다 실행됩니다. 정렬이 가능한 테이블에 대해 작동합니다. 그러나 데이터가 추가 될 때 테이블이 자동으로 사용되는지 여부는 확실하지 않습니다.
chuff

3

다음 은 테이블 작업을 위해 특별히 설계된 @chuff의 "Pure Excel"솔루션 버전입니다 . (IE 병합하려는 두 데이터 소스는 테이블입니다.)

이 방법과 그의 답변에 게시 된 하나의 커프의 주요 차이점은 병합하는 두 데이터 세트에 대해 명명 된 범위를 정의 할 필요가 없다는 것입니다.이 데이터 세트는 테이블이며 이미 자체 명명 된 범위를 가지고 있기 때문입니다. 계속해서 첫 번째 테이블 Table1과 두 번째 테이블의 이름을 지정하십시오 Table2.

이제 새 시트의 왼쪽 상단 모서리에 새 테이블을 만들고 다른 두 테이블과 동일한 열 이름을 지정하십시오. 그런 다음 방금 만든 시트의 A2 셀에 다음 수식을 입력하십시오.

=IFERROR(INDEX(Table1,ROWS(A$2:A2),COLUMN(A2)), IFERROR(INDEX(Table2,ROWS(A$2:A2)-ROWS(Table1),COLUMN(A2)), "-"))

그런 다음이 수식을 모든 테이블 열에 복사 한 다음 수식 결과가 모두 대시 ( "-")가 될 때까지 행을 아래로 내립니다. 참고 :이 새 테이블을 정렬하면 각 셀의 내용이 실제로 동일하므로 모두 동일한 수식을 포함하므로 아무 것도 수행하지 않습니다.

빈 셀을 표시해야 할 때 병합 된 테이블의 열에 0이 표시되면 다음과 같이 대체 함수를 사용하여 해당 열의 수식을 래핑 할 수 있습니다.

=SUBSTITUTE(<old expression here>, 0, "")

이 새 테이블의 데이터를 사용하는 피벗 테이블을 만들려면 명명 된 범위를 만들어야합니다. 먼저 테이블 이름을 지정하십시오 Table3. 이제 공식 탭으로 이동하여 "이름 정의"를 클릭하십시오. 참조에 이름을 지정하고 값에 대해 다음 방정식을 입력하십시오 ( "참조").

=OFFSET(Table3[#All],0,0,ROWS(Table1)+ROWS(Table2)+1)

그런 다음이 명명 된 참조를 피벗 테이블의 범위로 사용할 수 있습니다.


0

한 번만 결과를 원하면 두 개의 테이블을 병합하는 웹 사이트가 있습니다. https://office-tools.online/table/merge/

웹 페이지에 표를 붙여 넣고 관련 매개 변수를 선택합니다. 사용 방법을 나타내는 내장 예제의 스크린 샷은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.