2012-06-26 70 views
4

我處於簡單方法的中間,將我的DataGridView保存到Excel文檔(僅1張)中,並添加了VBA代碼和一個運行VBA代碼的按鈕。以編程方式從C#創建Excel VBA代碼和按鈕#

public void SaveFile(string filePath) 
    { 

     Microsoft.Office.Interop.Excel.ApplicationClass ExcelApp = new Microsoft.Office.Interop.Excel.ApplicationClass(); 
     ExcelApp.Application.Workbooks.Add(Type.Missing); 

     //Change Workbook-properties. 
     ExcelApp.Columns.ColumnWidth = 20; 

     // Storing header part in Excel. 
     for (int i = 1; i < gridData.Columns.Count + 1; i++) 
     { 
      ExcelApp.Cells[1, i] = gridData.Columns[i - 1].HeaderText; 
     } 

     //Storing Each row and column value to excel sheet 
     for (int row = 0; row < gridData.Rows.Count; row++) 
     { 
      gridData.Rows[row].Cells[0].Value = "Makro"; 
      for (int column = 0; column < gridData.Columns.Count; column++) 
      { 
       ExcelApp.Cells[row + 2, column + 1] = gridData.Rows[row].Cells[column].Value.ToString(); 
      } 
     } 

     ExcelApp.ActiveWorkbook.SaveCopyAs(filePath); 
     ExcelApp.ActiveWorkbook.Saved = true; 
     ExcelApp.Quit(); 
    } 

我只實現了DataGridView導出。

編輯:感謝喬爾,我可以用適當的話再次搜索解決方案。我認爲那this may be helpful。你會糾正我還是給我一兩個關於我應該找的東西。

+0

你是說,你要一個宏添加到新的工作簿編程方式(從代碼中此信息)? –

+0

是的。一個新的宏和一個將運行它的按鈕。 – 1GurU9

回答

3

我只是寫了一個小例子增加了一個新的按鈕到現有的工作簿,之後添加一個按鈕被點擊時會被調用宏。

using Excel = Microsoft.Office.Interop.Excel; 
using VBIDE = Microsoft.Vbe.Interop; 
... 

private static void excelAddButtonWithVBA() 
{ 
    Excel.Application xlApp = new Excel.Application(); 
    Excel.Workbook xlBook = xlApp.Workbooks.Open(@"PATH_TO_EXCEL_FILE"); 
    Excel.Worksheet wrkSheet = xlBook.Worksheets[1]; 
    Excel.Range range; 

    try 
    { 
     //set range for insert cell 
     range = wrkSheet.get_Range("A1:A1"); 

     //insert the dropdown into the cell 
     Excel.Buttons xlButtons = wrkSheet.Buttons(); 
     Excel.Button xlButton = xlButtons.Add((double)range.Left, (double)range.Top, (double)range.Width, (double)range.Height); 

     //set the name of the new button 
     xlButton.Name = "btnDoSomething"; 
     xlButton.Text = "Click me!"; 
     xlButton.OnAction = "btnDoSomething_Click"; 

     buttonMacro(xlButton.Name, xlApp, xlBook, wrkSheet); 
    } 
    catch (Exception ex) 
    { 
     Debug.WriteLine(ex.Message); 
    } 
    xlApp.Visible = true; 
} 

在這裏,我們得到了buttonMacro(..)方法

private static void buttonMacro(string buttonName, Excel.Application xlApp, Excel.Workbook wrkBook, Excel.Worksheet wrkSheet) 
{ 
    StringBuilder sb; 
    VBIDE.VBComponent xlModule; 
    VBIDE.VBProject prj; 

    prj = wrkBook.VBProject; 
    sb = new StringBuilder(); 

    // build string with module code 
    sb.Append("Sub " + buttonName + "_Click()" + "\n"); 
    sb.Append("\t" + "msgbox \"" + buttonName + "\"\n"); // add your custom vba code here 
    sb.Append("End Sub"); 

    // set an object for the new module to create 
    xlModule = wrkBook.VBProject.VBComponents.Add(VBIDE.vbext_ComponentType.vbext_ct_StdModule); 

    // add the macro to the spreadsheet 
    xlModule.CodeModule.AddFromString(sb.ToString()); 
} 

找到一個KB文章How To Create an Excel Macro by Using Automation from Visual C# .NET

相關問題