マクロを実行しようとしています。WorkSheet02のWorkSheet01からMacro01と呼びましょう。
Microsoft.Office.Interop.Excel名前空間を使用してWorkSheet01を開きました。
public void Main_CodedStep()
{
// Object for missing (or optional) arguments.
object oMissing = System.Reflection.Missing.Value;
// Create an instance of Microsoft Excel
Excel.ApplicationClass oExcel = new Excel.ApplicationClass();
// Make it visible
oExcel.Visible = true;
// Open Worksheet01.xlsm
Excel.Workbooks oBooks = oExcel.Workbooks;
Excel._Workbook oBook = null;
oBook = oBooks.Open("C:\\Users\\Admin\\Documents\\Worksheet01.xlsm", oMissing, oMissing,
oMissing, oMissing, oMissing, oMissing, oMissing, oMissing,
oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);
}
次に、自動化されたスクリプトを使用してレポートをプルします。このレポートは、相互運用機能ではなく、IEのダウンロードプロンプトを介して開かれます。
問題は、C#を介してマクロを実行しようとしたときに発生します(別の新しいExcel.ApplicationClass()を作成したため、コンパイルされただけで、これは私の失敗の1つだと思います)。
public void FirstMacro_CodedStep()
{
// Create an instance of Microsoft Excel
Excel.ApplicationClass oExcel = new Excel.ApplicationClass();
Console.WriteLine("ApplicationClass: " + oExcel);
// Run the macro, "First_Macro"
RunMacro(oExcel, new Object[]{"Worksheet01.xlsm!First_Macro"});
//Garbage collection
GC.Collect();
}
private void RunMacro(object oApp, object[] oRunArgs)
{
oApp.GetType().InvokeMember("Run", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, oApp, oRunArgs);
}
このメソッドを実行すると、Worksheet02ではなくWorksheet01のWorksheet01からマクロが実行されます。また、マイドキュメントでワークシートを探していたので、移動して何が起こるかを確認しました。
要約:
リソース:
http://support.Microsoft.com/kb/30668
http://msdn.Microsoft.com/en-us/library/Microsoft.office.interop.Excel.aspx
それを試してみたい人のために、これをあなたのusingディレクティブに追加してください:
using System.Reflection;
using Microsoft.Office.Core; //Added to Project Settings' References from C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14 - "office"
using Excel = Microsoft.Office.Interop.Excel; //Added to Project Settings' References from C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14 - "Microsoft.Office.Interop.Excel"
共有したい解決策を見つけました。まず、Worksheet01を開いた部分を削除しました。次に、自動化されたスクリプトで.CSVをマイドキュメントに保存しました。次に、Worksheet01を開く必要のあるコードを使用して、ダウンロードしたファイルを開きました。この時点で重要なのは、Worksheet01がWorksheet02とともにDocumentsフォルダーにあることです。最後に、コードを使用して、Worksheet02で実行されるWorksheet01からマクロを実行しました。
public void WebTest_CodedStep()
{
// Object for missing (or optional) arguments.
object oMissing = System.Reflection.Missing.Value;
// Create an instance of Microsoft Excel
Excel.ApplicationClass oExcel = new Excel.ApplicationClass();
// Make it visible
oExcel.Visible = true;
// Define Workbooks
Excel.Workbooks oBooks = oExcel.Workbooks;
Excel._Workbook oBook = null;
// Get the file path
string path = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
path = path + "\\Worksheet02.csv";
//Open the file, using the 'path' variable
oBook = oBooks.Open(path, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);
// Run the macro, "First_Macro"
RunMacro(oExcel, new Object[]{"Worksheet01.xlsm!First_Macro"});
// Quit Excel and clean up.
oBook.Close(false, oMissing, oMissing);
System.Runtime.InteropServices.Marshal.ReleaseComObject (oBook);
oBook = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject (oBooks);
oBooks = null;
oExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject (oExcel);
oExcel = null;
//Garbage collection
GC.Collect();
}
private void RunMacro(object oApp, object[] oRunArgs)
{
oApp.GetType().InvokeMember("Run", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, oApp, oRunArgs);
}
このC#VSTOコードを実行してVBAマクロを呼び出しました。これは、私が使用する構文です。
this.Application.Run("mymacro");
編集:
マクロはワークブック全体です。マクロを実行する前に、Sheet2をアクティブなワークシートにする必要があります。例:
foreach (Worksheet worksheet in workbook.Sheets.ComLinq<Worksheet>())
{
if (worksheet.Name == "Sheet2") worksheet.Activate();
}