C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[60189] C++/CLI 엑셀 오토메이션 !!!! 도와주세요 !!!!
김석 [] 3776 읽음    2010-02-09 09:21
C++/CLI 엑셀 오토메이션을 공부하고 있습니다.

제가 하려는 것은 윈도우 Form 에서 버튼을 누르면 지정된 엑셀 파일이 열리고,

열린파일의 sheet 내부에 있는 커맨드 버튼을 누르면 버튼이 클릭되었다는 메시지 박스가 뜨게 하고 싶습니다.

현재 윈도우 Form 에서 버튼을 누르면 지정된 엑셀 파일이 열리지만, 그 후 아래와 같은 에러가 발생합니다.

C#으로 만든 코드를 C++/CLI로 바꿔서 코딩하고 있는대 쫌 힘드내요..

  C++/CLI로 이게 가능한가요?? 가능하다면 방법을 조금 알려주시면 감사하겠습니다.

고수님들의 많은 조언 부탁드립니다. 쫌 급합니다 !!!!
소스와 에러 화면 캡쳐해서 첨부합니다. 도와주세요 !!!!


------------------------------------------------------------------------------------------------
처리되지 않은 'System.InvalidCastException' 형식의 예외가 ExcelTest.exe에서 발생했습니다.

추가 정보: 'System.__ComObject' 형식의 COM 개체를 인터페이스 형식 'Microsoft.Vbe.Interop.Forms.CommandButton'(으)로 캐스팅할 수 없습니다. 해당 인터페이스를 지원하지 않습니다. (예외가 발생한 HRESULT: 0x80004002 (E_NOINTERFACE)) 오류로 인해 IID가 '{04598FC4-866C-11CF-AB7C-00AA00C08FCF}'인 인터페이스의 COM 구성 요소에서 QueryInterface를 호출하지 못했으므로 이 작업을 수행할 수 없습니다.
------------------------------------------------------------------------------------------------
 

#pragma once

#define Excel   Microsoft::Office::Interop::Excel
#define MSForms Microsoft::Vbe::Interop::Forms
namespace ExcelTest {

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace Excel;
using namespace MSForms;
delegate void runExcel();

/// <summary>
/// Form1에 대한 요약입니다.
///
/// 경고: 이 클래스의 이름을 변경하면 이 클래스가 의존하는
///          모든 .resx 파일과 관련된 관리되는 리소스 컴파일러 도구의
///          '리소스 파일 이름' 속성도 변경해야 합니다. 그렇지 않은 경우
///          디자이너는 이 폼과 관련된 지역화된 리소스와
///          올바르게 상호 작용할 수 없습니다.
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
  Form1(void)
  {
   InitializeComponent();
   //
   //TODO: 생성자 코드를 여기에 추가합니다.
   //
  }

protected:
  /// <summary>
  /// 사용 중인 모든 리소스를 정리합니다.
  /// </summary>
  ~Form1()
  {
   if (components)
   {
    delete components;
   }
  }
private: System::Windows::Forms::Button^  butExcel;
protected:

protected:

private:
  /// <summary>
  /// 필수 디자이너 변수입니다.
  /// </summary>
  System::ComponentModel::Container ^components;

  Excel::Workbook^ workBook;
  Excel::Worksheet^ workSheet;
  //Excel::Range^ range;
  Excel::Application^ app;
  MSForms::CommandButton^ btnExcel;

#pragma region Windows Form Designer generated code
  /// <summary>
  /// 디자이너 지원에 필요한 메서드입니다.
  /// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오.
  /// </summary>
  void InitializeComponent(void)
  {
   this->butExcel = (gcnew System::Windows::Forms::Button());
   this->SuspendLayout();
   //
   // butExcel
   //
   this->butExcel->Location = System::Drawing::Point(104, 100);
   this->butExcel->Name = L"butExcel";
   this->butExcel->Size = System::Drawing::Size(95, 45);
   this->butExcel->TabIndex = 0;
   this->butExcel->Text = L"Run Excel";
   this->butExcel->UseVisualStyleBackColor = true;
   this->butExcel->Click += gcnew System::EventHandler(this, &Form1::butExcel_Click);
   //
   // Form1
   //
   this->AutoScaleDimensions = System::Drawing::SizeF(7, 12);
   this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
   this->ClientSize = System::Drawing::Size(292, 268);
   this->Controls->Add(this->butExcel);
   this->Name = L"Form1";
   this->Text = L"Form1";
   this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
   this->ResumeLayout(false);

  }
  void RunExcel()
  {
 
   app = gcnew Excel::ApplicationClass();
   //runExcel^ run = gcnew ExcelTest::Form1();

   workBook = app->Workbooks->Open("C:\\Test.xls", false, false, 5, "", "",
   false ,Excel::XlPlatform::xlWindows, false,true, false, false, true, false, false);
   app->Visible = true;

   btnExcel = (MSForms::CommandButton^)FindControl("btnExcel");
   btnExcel->Click += gcnew MSForms::CommandButtonEvents_ClickEventHandler(this, &Form1::btnExcel_Click);
  
  }

 
  System::Object^ FindControl(String^ name)
        {
   return FindControl(name, (Excel::Worksheet^)workBook->ActiveSheet);
        }
 
  System::Object^ FindControl(String^ name, Excel::Worksheet^ sheet)
        {
   Excel::OLEObject^ theObject;
   theObject =  (Excel::OLEObject^)sheet->OLEObjects(name);
   return (System::Object^)theObject;
        }

  void btnExcel_Click()
        {

   MessageBox::Show("Button Clicked");

        }




#pragma endregion
private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
    }
private: System::Void butExcel_Click(System::Object^  sender, System::EventArgs^  e) {
    RunExcel();
    }
};
}

+ -

관련 글 리스트
60189 C++/CLI 엑셀 오토메이션 !!!! 도와주세요 !!!! 김석 3776 2010/02/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.