2015-09-05 4 views
1

У меня есть следующий макросДобавить макрос в Excel файл

Sub test() 
    Dim xsheet As Worksheet 
    For Each xsheet In ThisWorkbook.Worksheets 
     xsheet.Select 
     With xsheet.UsedRange 
      .Value = .Value 
     End With 
    Next xsheet  
End Sub 

Есть ли способ, чтобы добавить его, чтобы преуспеть файл и выполнить его с помощью C#?

Любая помощь была бы наиболее оценена.

+0

https://msdn.microsoft.com/en-us/library/office/ee814737(v=office.14).aspx –

+0

http://stackoverflow.com/questions/19508569/error-when-calling-excel -macro-from-c-sharp – Ralph

ответ

1

1) Вот код, я использую, который работает для Excel с помощью .Net ссылочный: Microsoft.Office.Interop.Excel V14 (не ActiveX COM Reference):

using System; 
using Microsoft.Office.Interop.Excel; 

namespace ConsoleApplication1 
{ 
class Program 
{ 
static void Main(string[] args) 
{ 
    RunVBATest(); 
} 

public static void RunVBATest() 
{ 
    Application oExcel = new Application(); 
    oExcel.Visible = true; 
    Workbooks oBooks = oExcel.Workbooks; 
    _Workbook oBook = oBooks.Open("C:\\temp\\Book1.xlsm"); 

    // Run the macro. 
    RunMacro(oExcel, new Object[] { "TestMsg" }); 
    //Run a macro with parameters   
    //RunMacro(oExcel, new Object[] { "ShowMsg", "Hello from C# Client", "Demo to run Excel macros from C#" }); 

    // Quit Excel and clean up 
    oBook.Saved = true; 
    oBook.Close(false); 
    oExcel.Quit(); 
    System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook); 
    System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks); 
    System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel); 
} 

private static void RunMacro(object oApp, object[] oRunArgs) 
{ 
    oApp.GetType().InvokeMember("Run", 
     System.Reflection.BindingFlags.Default | 
     System.Reflection.BindingFlags.InvokeMethod, 
     null, oApp, oRunArgs); 

} 
} 
} 
} 

2) Убедитесь, что вы положили Макрос кода в модуле (файл Global БАС) ..

Public Sub TestMsg() 

MsgBox ("Hello Stackoverflow") 

End Sub 

3) убедитесь, что вы включили Macro безопасности и доверия доступ к объектной модели VBA проекта:

enter image description here

1

Решение по Siddharth Rout извлеченного из этого MSDN issue

Это должно работать:

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("test"); 

      //~~> 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(); 
      } 
     } 
    } 
} 

Если макрос имеет аргументы, позволяет сказать:

Sub ShowMsg(msg As String, title As String) 
    MsgBox msg, vbInformation, title 
End Sub 

Вы должны изменить xlApp.Run("test"); к xlApp.Run("ShowMsg", "Hello from C# Client", "Demo to run Excel macros from C#");

+1

Ха-ха .. Я забыл об этом сообщении: D –

+0

Ну, так как вы здесь, вы должны ответить и получить награду :-p –

+0

Nah. Это все ваше :) –

Смежные вопросы