2017-02-21 14 views
1

私は、最初のパラメータとして関数自体を呼び出すExcelマクロを呼び出そうとしています。 C#Excel interopを使用してこれを行うにはどうすればよいですか?Interopを介してExcelマクロを実行する:関数呼び出しを引数として渡すにはどうすればよいですか?

のは、私は簡単にこのようにエクセルの内部で呼び出すことができ

Sub ValidateSheet(version As Integer, displayNoErrorsBox As Boolean) 

エクセル

でこのサブルーチンを持っているとしましょう:

Call Validation.ValidateSheet(Data.GetVersion, False) 

Data.GetVersionはもちろん、整数を返します。

私はinterop経由でどのように呼びますか?渡されるすべてのパラメータはオブジェクトです。関数呼び出しを文字列として渡すことができるかどうかはわかりません。これは確かに動作しません:

m_Application.Run("Validation.ValidateSheet", "Data.GetVersion", "False"); 

これは可能ですか?このトピックで見つけることができるすべてのチュートリアルと投稿は、文字列をマクロに渡すだけです。

+2

:私はこれをやっている

m_Application.Run("Validation.ValidateSheet", "Data.GetVersion", false); 

を'Validation.ValidateSheet(Data.GetVersion、False)'が実行するものです。パラメータは、呼び出されたプロシージャに渡される前に評価されます。あなたのC#コードで 'Data'オブジェクトを取得し、' .GetVersion'を呼び出して、それを最初のパラメータとして渡す必要があります。 – Comintern

+0

右。私はすべてのことInteropへの初心者であることを期待し、論理的で簡単です。 Dataオブジェクトについて少し具体的にすることはできますか?名前空間を調べると、飛び出さない:https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel(v=office.15).aspx – Drakestar

+0

手がかりがない。 'Data'という名前のExcelクラスやインタフェースはなく、GetVersionメンバには(少なくともExcel 2013では)何もありません。 VBAコードを調べる必要があります。 FWIWでは、 'Application.Run'に' Validation'を渡すことはできません - それはオブジェクトです。 – Comintern

答えて

1

だけコメントからの提案を使用して明示的に最初のマクロと呼ばれます。だから、

、代わりにこのしよう:そのため、「私はこのテーマに見つけることができるすべてのチュートリアルと記事は、単に文字列を渡す」理由がある

string version = m_Application.Run("Data.GetVersion"); 
m_Application.Run("Validation.ValidateSheet", version, false); 
-1

これを試してください。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using Excel = Microsoft.Office.Interop.Excel; 

namespace WindowsFormsApplication2 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      //~~> Define your Excel Objects 
      Excel.Application xlApp = new Excel.Application(); 

      Excel.Workbook xlWorkBook; 

      //~~> Start Excel and open the workbook. 
      xlWorkBook = xlApp.Workbooks.Open("E:\\Users\\Siddharth Rout\\Desktop\\book1.xlsm"); 

      //~~> Run the macros by supplying the necessary arguments 
      xlApp.Run("ShowMsg", "Hello from C# Client", "Demo to run Excel macros from C#"); 

      //~~> Clean-up: Close the workbook 
      xlWorkBook.Close(false); 

      //~~> Quit the Excel Application 
      xlApp.Quit(); 

      //~~> Clean Up 
      releaseObject(xlApp); 
      releaseObject(xlWorkBook); 
     } 

     //~~> Release the objects 
     private void releaseObject(object obj) 
     { 
      try 
      { 
       System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
       obj = null; 
      } 
      catch (Exception ex) 
      { 
       obj = null; 
      } 
      finally 
      { 
       GC.Collect(); 
      } 
     } 
    } 
} 

https://social.msdn.microsoft.com/Forums/Lync/en-US/2e33b8e5-c9fd-42a1-8d67-3d61d2cedc1c/how-to-call-excel-macros-programmatically-in-c?forum=exceldev

+0

違反はありませんが、実際に質問とコメントのスレッドを読みましたか?あなたのコピー/ペーストの答えは全く質問に答えることはありません、それはちょうどいくつかの文字列パラメータを渡します。 – Drakestar

関連する問題