Visual C++ 2005 또는 Visual C++ .NET 및 MFC를 통해 배열을 사용하여 일정 범위의 데이터를 채우거나 가져오도록 Excel을 자동화하는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 308407 - 이 문서가 적용되는 제품 보기.
이 문서는 이전에 다음 ID로 출판되었음: KR308407
이 문서의 Microsoft C# .NET 버전에 대한 내용은 302096을 참조하십시오.
이 문서의 Microsoft Visual Basic .NET 버전에 대한 내용은 302094를 참조하십시오.
참고 Microsoft Visual C++ 2005, Microsoft Visual C++ .NET 2003 및 Microsoft Visual C++ .NET 2002에서는 Microsoft .NET Framework에서 제공하는 관리 코드 모델과 기본 Microsoft Windows의 비관리 코드 모델을 모두 지원합니다. 이 문서에 나와 있는 정보는 Visual C++의 비관리 코드에만 적용됩니다.
모두 확대 | 모두 축소

이 페이지에서

요약

이 문서에서는 Visual C++ 2005 또는 Visual C++ .NET을 통해 배열을 사용하여 여러 셀 범위에 값을 채우고 가져오도록 Excel을 자동화하는 방법을 단계별로 설명합니다.

Excel용 자동화 클라이언트 만들기

한 번에 하나씩 셀을 채우지 않고 여러 셀 범위를 채우려면 범위 개체의 속성을 2차원 배열로 설정하면 됩니다. 마찬가지로 Value 속성을 사용하여 한 번에 여러 셀에 대한 2차원 배열 값을 가져올 수 있습니다. 다음 단계는 2차원 배열을 사용하여 데이터를 설정하고 검색하기 위한 절차입니다.
  1. Microsoft 기술 자료의 다음 문서에서 "자동화 클라이언트 만들기" 절의 단계에 따라 기본 자동화 클라이언트를 만듭니다.
    307473 HOWTO: Visual C++ .NET에서 형식 라이브러리를 사용하여 Office 자동화
    3단계에서 두 번째 단추와 확인란을 폼에 추가합니다. 단추의 ID를 IDC_GETVALUES로 바꾸고 캡션을 Get Values로 바꿉니다. 확인란의 ID를 IDC_CHECK로 바꾸고 캡션을 Fill with Strigns로 바꿉니다.

    Office XP에서 Excel 2002를 자동화하고 있으면 이 문서의 4단계에서 "Microsoft Excel 10.0 Object Library"를 선택합니다. Excel 2002의 기본 위치는 C:\Program Files\Microsoft Office\Office10\Excel.exe입니다. Microsoft Office Excel 2003을 자동화하고 있는 경우에는 "Microsoft Excel 11.0 Object Library"를 선택합니다. Excel 2003의 기본 위치는 C:\Program Files\Microsoft Office\Office11\Excel.exe입니다. 다음과 같은 Microsoft Excel 인터페이스를 선택하십시오.
    • _Application
    • _Workbook
    • _Worksheet
    • Range
    • Workbooks
    • Worksheets
    6단계에서 Autoprojectdlg.h의 #pragma once 지시문 바로 다음에 아래의 #include 문을 추가합니다.
    #include "CApplication.h"
    #include "CRange.h"
    #include "CWorkbook.h"
    #include "CWorkbooks.h"
    #include "CWorksheet.h"
    #include "CWorksheets.h"
    					
  2. 다음 두 개의 공용 멤버 변수를 CAutoProjectDlg 클래스에 추가합니다.
    CApplication oExcel;
    CWorkbook oBook;
    					
  3. 대화 상자에서 IDC_CHECK를 마우스 오른쪽 단추로 누르고 변수 추가를 누릅니다. 변수 이름을 m_bFillWithStrings로 지정하고 마침을 누릅니다.
  4. 대화 상자에서 실행을 두 번 누르고 다음 코드를
    void CAutoProjectDlg::OnBnClickedRun()
    {
    	// TODO: Add your control notification handler code here
    }
    					
    아래의 코드로 대체합니다.
    void CAutoProjectDlg::OnBnClickedRun()
    {
    	CWorkbooks oBooks;
    	CWorksheets oSheets;
    	CWorksheet oSheet;
    	CRange oRange;
    	COleVariant covOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
    
    	// If you have not created Excel, create a new instance.
    	if (oExcel.m_lpDispatch == NULL) {
    		oExcel.CreateDispatch("Excel.Application");
    	}
    	// Show Excel to the user.
    	oExcel.put_Visible(TRUE);
    	oExcel.put_UserControl(TRUE);
    
    	// Add a new workbook and get the first worksheet in that book.
    	oBooks = oExcel.get_Workbooks();
    	oBook = oBooks.Add(covOptional);
    	oSheets = oBook.get_Worksheets();
    	oSheet = oSheets.get_Item(COleVariant((short)1));
    
    	// Get a range of data.
    	oRange = oSheet.get_Range(COleVariant("A1"),covOptional);
    	oRange = oRange.get_Resize(COleVariant((short)5),COleVariant((short)5));
    
    	COleSafeArray saRet;
    	DWORD numElements[2];
    	numElements[0] = 5;
    	numElements[1] = 5;
    
    	long index[2];
    	// Create a BSTR or double safe array.
    	if (m_bFillWithStrings.GetCheck())
    		saRet.Create(VT_BSTR,2,numElements);
    	else
    		saRet.Create(VT_R8,2,numElements);
    
    	// Fill the array with data.
    	for (int iRow = 1; iRow <= 5; iRow++) {
    		for (int iCol = 1; iCol <= 5; iCol++) {
    			index[0]=iRow-1;
    			index[1]=iCol-1;
    			if (m_bFillWithStrings.GetCheck()) {
    				CString szTemp;
    				szTemp.Format("%d|%d",iRow,iCol);
    				BSTR bstr = szTemp.AllocSysString();
    				saRet.PutElement(index,bstr);
    				SysFreeString(bstr);
    			} else {
    				double d = iRow * iCol;
    				saRet.PutElement(index,&d);
    			}
    		}
    	}
    	// Send the array to Excel.
    	oRange.put_Value(covOptional,COleVariant(saRet));
    }
    					
    참고 Visual C++ 2005에서는 공용 언어 런타임 지원 컴파일러 옵션(/clr:oldSyntax)을 추가해야 이전 코드 예제를 성공적으로 컴파일할 수 있습니다. 공용 언어 런타임 지원 컴파일러 옵션을 추가하려면 다음과 같이 하십시오.
    1. 프로젝트를 누르고 ProjectName 속성을 누릅니다.

      참고 ProjectName은 프로젝트 이름의 자리 표시자입니다.
    2. 구성 속성을 확장하고 일반을 누릅니다.
    3. 오른쪽 창의 공용 언어 런타임 지원 프로젝트 설정에서 공용 언어 런타임 지원, 이전 구문(/clr:oldSyntax)을 선택합니다.
    4. 적용을 누르고 확인을 누릅니다.
    공용 언어 런타임 지원 컴파일러 옵션에 대한 자세한 내용은 다음 MSDN(Microsoft Developer Network) 웹 사이트를 참조하십시오.
    http://msdn.microsoft.com/library/kor/default.asp?url=/library/kor/vccore/html/vcrefeecomcompilation.asp
    위의 단계는 문서 전체에 적용됩니다.
  5. 대화 상자로 돌아가서 Get Values를 두 번 누릅니다. 다음 코드를
    void CAutoProjectDlg::OnBnClickedGetvalues()
    {
    	// TODO: Add your control notification handler code here
    }
    					
    아래 코드로 대체합니다.
    void CAutoProjectDlg::OnBnClickedGetvalues()
    {
    	CWorksheets oSheets;
    	CWorksheet oSheet;
    	CRange oRange;
    	COleVariant covOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
    
    	// Make sure that Excel has been started.
    	if (oExcel.m_lpDispatch == NULL) {
    		AfxMessageBox("Excel has not been started.  Press button1 to start Excel.");
    		return;
    	}
    	// Get the first worksheet.
    	oSheets = oBook.get_Worksheets();
    	oSheet = oSheets.get_Item(COleVariant((short)1));
    	// Set the range of data to retrieve
       	oRange = oSheet.get_Range(COleVariant("A1"),COleVariant("E5"));
    
    	// Get the data.
    	COleSafeArray saRet(oRange.get_Value(covOptional));
    
            long iRows;
            long iCols;
            saRet.GetUBound(1, &iRows);
            saRet.GetUBound(2, &iCols);
    
    	CString valueString = "Array Data:\r\n";
    	long index[2];
    	// Loop through the data and report the contents.
    	for (int rowCounter = 1; rowCounter <= iRows; rowCounter++) {
    		for (int colCounter = 1; colCounter <= iCols; colCounter++) {
    			index[0]=rowCounter;
    			index[1]=colCounter;		   
    			COleVariant vData;
    			saRet.GetElement(index,vData);
    			CString szdata(vData);
                valueString += szdata;
    			valueString += "\t";		
    		}
    		valueString += "\r\n";
    	}
    	AfxMessageBox(valueString,MB_SETFOREGROUND,NULL);
    }
    					

자동화 클라이언트 테스트

  1. F5 키를 눌러 예제 프로그램을 빌드하고 실행합니다.
  2. 실행을 누릅니다. 프로그램이 새로운 통합 문서에서 Excel을 시작하여 첫 번째 워크시트의 A1:E5 셀을 배열의 숫자 데이터로 채웁니다.
  3. Get Values를 누릅니다. 프로그램이 A1:E5 셀의 데이터를 새로운 배열로 가져와서 그 결과를 메시지 상자에 표시합니다.
  4. Fill With Strings를 선택하고 실행을 눌러 A1:E5 셀을 문자열 데이터로 채웁니다.
  5. Get Values를 눌러 메시지 상자에 문자열 값을 표시합니다.

문제 해결

TypeLib의 클래스 추가 마법사의 파일 옵션을 사용하여 Excel 개체 라이브러리의 클래스 래퍼를 추가한 경우 해당 개체 라이브러리를 탐색하면 오류 메시지가 나타날 수 있습니다. 이 문제를 방지하려면 파일을 탐색하는 대신 개체 라이브러리의 전체 경로와 파일 이름을 입력합니다. 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
311408 FIX: 형식 라이브러리의 MFC 클래스를 추가할 때 'Read-Only' 경고가 나타난다
예제 응용 프로그램을 빌드할 때 다음과 같은 오류 메시지가 나타나면 CRange.h의 "Variant DialogBox"를 "Variant _DialogBox"로 변경하십시오.
경고 C4003: 'DialogBoxA' 매크로의 실제 매개 변수가 부족합니다.
이 오류의 원인에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
311407 BUG: MFC 클래스 마법사가 Windows API와 COM 인터페이스 메서드 간의 이름 충돌을 해결하지 않는다

참조

자세한 내용은 다음 MSDN(Microsoft Developer Network) 웹 사이트를 참조하십시오.
Visual Studio를 사용한 Microsoft Office 개발(Microsoft Office Development with Visual Studio)
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx(영문)
배열을 사용하여 이전 버전의 Visual Studio에서 Excel 데이터를 설정하고 검색하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
186120 MFC를 사용하여 Excel을 자동화하고 배열로 범위를 채우는 방법
186122 MFC를 사용하여 Excel 2000 및 Excel 2002를 자동화하고 Excel 2000 및 Excel 2002의 범위에서 배열을 구하는 방법
247412 Visual Basic에서 Excel로 데이터를 전송하는 방법




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.

속성

기술 자료: 308407 - 마지막 검토: 2007년 1월 17일 수요일 - 수정: 6.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
키워드:?
kbhowtomaster kbautomation KB308407

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com