드로우홀릭 더베이직
직장인을 위한 실무엑세스 p291의
조회폼으로 조회한 subA의 레코드를
그대로 엑셀로 내보낼수 있나요? 궁금합니다.
답변 감사합니다 말씀하신대로 하여 데이터를 출력을 할 수 있는 것을 확인했습니다.
그런데 몇가지만 더 질문 드리겠습니다.
데이터 레코드 수가 많아서 임시 테이블을 작성하고
CSV로 출력하는게 바람직하다고 생각합니다.
위에서 가르쳐 주신 방법으로 작성된 쿼리에서 '디자인보기>테이블작성' 으로 테이블을 작성했구요
텍스트파일 내보내기 창을 띄워서 CSV파일을 작성했습니다.
그래서 두가지만 질문 드리겠습니다.
1. 위의 방법에서 subA의 내용을 바탕으로 임시로 작성된 쿼리를 VBA 명령으로 '테이블 만들기'를 실행하여
임시데이터 테이블을 작성할 수 있나요?
2. 임시로 작성된 데이터 테이블에 대해 '텍스트파일 내보내기' 창을 VBA로 명령해서 실행 시킬수 있나요?
레코드 수가 많아서 임시 테이블을 작성한다는 것이, 꼭 필요한 것인지 모르겠습니다.
바로 CSV로 내보내든, 테이블을 만들고 내보내든, 해당 연산은 필요한 것이니까요.
오히려 임시 테이블을 만들고 내보내면, 두 번 작업하는 것일 수도 있으니까요.
위 예제에서 'DoCmd.OutputTo acOutputQuery, conQryName, acFormatXLSX' 라는 구문이 있는데, 이것을..
'DoCmd.OutputTo acOutputQuery, conQryName, acFormatTXT' 로 바꿔주면 CSV로 바로 내보내 줍니다.
OutputTo 함수는 레코드 개수 제한이 있으니, 내보낸 다음 제대로 내보냈나 확인하시는 것이 좋겠습니다.
그리고, 어쨌든 질문 주신 것에 대해 답을 드리자면..
1. 임시 데이터 테이블을 만들 때는 다음과 같은 구문을 사용하면 됩니다.
보통 쿼리가 'SELECT [필드명1], [필드명2], ... , [필드명n] FROM [테이블명] 이렇게 됩니다.
이런 쿼리는 데이터를 '추출'하는 쿼리이죠.
그런데, 'SELECT [필드명1], [필드명2], ... , [필드명n] INTO [내보낼_테이블명] FROM [테이블명]' 과 같이 'INTO' 구문을 사용해 주면 임시 테이블로 쿼리 결과를 보내줍니다. '테이블 만들기 쿼리' 이죠.
2. 테이블에 대해서는 DoCmd.TransferText 명령을 이용하면 텍스트 파일로 내보내 줍니다. OutputTo 함수와 TransferText 함수 모두 내보내는 행 수에 제한이 있는 것으로 알고 있는데, TransferText 함수가 더 많은 데이터를 내보낼 수 있습니다.
이런 것을 적용한 예제를 첨부하니, 자세한 것은 소스코드를 살펴보시기 바랍니다.
네, 약간의 VBA코드가 필요하겠지만, 가능합니다.
완성된 예제파일을 첨부해 두었으니 참고 바랍니다.
조회 폼에서 '내보내기' 버튼을 클릭하면, 현재 조회된 데이터를 내보내기 할 것입니다.
현재 조회된 데이터는 suba.Form.RecordSource 속성값을 참조하면 알아낼 수 있지요.
이제 이것을 내보내기만 하면 됩니다.
내보내기를 할 때, 보통은 DoCmd.TransferSpreadSheet 함수를 사용하는데, 이것은 테이블의 데이터만 내보낼 수 있습니다. 따라서 이번 예제처럼, 가변젹인 데이터를 내보내는 데는 적합하지 않지요.
그래서 매 번 달라지는 이런 데이터는 DoCmd.OutputTo 함수를 사용하면 됩니다. 이 함수는 '쿼리'의 결과를 내보낼 수 있습니다.
문제는, 조회가 될 때 마다.. 쿼리를 새로 만들어줘야 한다는 것인데..
내보내기 전용 임시 쿼리를 만들고, 그 임시 쿼리를 그때그때 바꿔주는 방법을 사용하면 됩니다.
다음 소스코드를 살펴보시기 바랍니다.
6행에서, 현재 조회된 데이터의 SQL 구문을 qtmpExport1 쿼리에 지정합니다. CurrentDb.QueryDefs(쿼리이름) 하게되면, 특정 쿼리를 가리킬 수 있습니다. CurrentDb.QueryDefs(쿼리이름).SQL 하게 되면, 이 쿼리의 내용을 완전히 바꿀 수 있죠.
7행에서, OutputTo 를 이용하여 변경한 쿼리를 엑셀로 내보냅니다.
두 줄 정도의 VBA 코드면 충분한데, 이 코드가 담고 있는 개념이나 생각들이 꽤 많아서, 다소 어려울 수 있겠네요.
필요하다면 여기에서 사용된 각종 용어(QueryDefs, RecordSource 등)를 도움말에서 찾아 보시기 바랍니다.