大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C#技巧 > C#调用Excel VBA宏

C#调用Excel VBA宏

关键词:ExcelVBAC#  阅读(1035) 赞(18)

[摘要]本文是对C#调用Excel VBA宏的讲解,对学习C#编程技术有所帮助,与大家分享。

近日的一系列工作是做网站的营运维护,因此做了大量的支持工具。有Excel中写VBA的,也有直接C#做的工具。有时需要在C#中执行Excel VBA宏,甚至有时还需要在执行了VBA宏之后,获取返回值再进行相应的处理。为了使用方便,我写了一个执行Excel VBA宏的帮助类。放在博客里做个备份也希望对有类似需求的朋友有所帮助。
帮助类仅提供了一个方法:RunExcelMacro 参数说明: string excelFilePath Excel文件路径 stringmacroName 宏名称 object[] parameters 宏参数组 out object rtnValue 宏返回值 bool isShowExcel 执行时是否显示Excel

补充说明:VBA宏需如下图写在模块中,才能被此方法识别。写在ThisWorkBook中不能被识别。

执行Excel VBA宏帮助类,注释比较详细,不再累赘代码过程。最核心部分其实就是通过反射方式调用Excel VBA宏,oBook.Save()这句话也很重要,否则即使执行了VBA宏调用,也不会保存Excel更改后的内容:

Java代码
  1. 1usingSystem;
  2. 2usingSystem.Collections.Generic;
  3. 3usingSystem.Text;
  4. 4usingExcel=Microsoft.Office.Interop.Excel;
  5. 5usingMicrosoft.Office.Core;
  6. 6usingSystem.IO;
  7. 7
  8. 8namespaceDoVBAMacro
  9. 9{
  10. 10///<summary>
  11. 11///执行ExcelVBA宏帮助类
  12. 12///</summary>
  13. 13publicclassExcelMacroHelper
  14. 14{
  15. 15///<summary>
  16. 16///执行Excel中的宏
  17. 17///</summary>
  18. 18///<paramname="excelFilePath">Excel文件路径</param>
  19. 19///<paramname="macroName">宏名称</param>
  20. 20///<paramname="parameters">宏参数组</param>
  21. 21///<paramname="rtnValue">宏返回值</param>
  22. 22///<paramname="isShowExcel">执行时是否显示Excel</param>
  23. 23publicvoidRunExcelMacro(
  24. 24stringexcelFilePath,
  25. 25stringmacroName,
  26. 26object[]parameters,
  27. 27outobjectrtnValue,
  28. 28boolisShowExcel
  29. 29)
  30. 30{
  31. 31try
  32. 32{
  33. 33#region检查入参
  34. 34
  35. 35//检查文件是否存在
  36. 36if(!File.Exists(excelFilePath))
  37. 37{
  38. 38thrownewSystem.Exception(excelFilePath+"文件不存在");
  39. 39}
  40. 40
  41. 41//检查是否输入宏名称
  42. 42if(string.IsNullOrEmpty(macroName))
  43. 43{
  44. 44thrownewSystem.Exception("请输入宏的名称");
  45. 45}
  46. 46
  47. 47#endregion
  48. 48
  49. 49#region调用宏处理
  50. 50
  51. 51//准备打开Excel文件时的缺省参数对象
  52. 52objectoMissing=System.Reflection.Missing.Value;
  53. 53
  54. 54//根据参数组是否为空,准备参数组对象
  55. 55object[]paraObjects;
  56. 56
  57. 57if(parameters==null)
  58. 58{
  59. 59paraObjects=newobject[]{macroName};
  60. 60}
  61. 61else
  62. 62{
  63. 63//宏参数组长度
  64. 64intparaLength=parameters.Length;
  65. 65
  66. 66paraObjects=newobject[paraLength+1];
  67. 67
  68. 68paraObjects[0]=macroName;
  69. 69for(inti=0;i<paraLength;i++)
  70. 70{
  71. 71paraObjects[i+1]=parameters[i];
  72. 72}
  73. 73}
  74. 74
  75. 75//创建Excel对象示例
  76. 76Excel.ApplicationClassoExcel=newExcel.ApplicationClass();
  77. 77
  78. 78//判断是否要求执行时Excel可见
  79. 79if(isShowExcel)
  80. 80{
  81. 81//使创建的对象可见
  82. 82oExcel.Visible=true;
  83. 83}
  84. 84
  85. 85//创建Workbooks对象
  86. 86Excel.WorkbooksoBooks=oExcel.Workbooks;
  87. 87
  88. 88//创建Workbook对象
  89. 89Excel._WorkbookoBook=null;
  90. 90
  91. 91//打开指定的Excel文件
  92. 92oBook=oBooks.Open(
  93. 93excelFilePath,
  94. 94oMissing,
  95. 95oMissing,
  96. 96oMissing,
  97. 97oMissing,
  98. 98oMissing,
  99. 99oMissing,
  100. 100oMissing,
  101. 101oMissing,
  102. 102oMissing,
  103. 103oMissing,
  104. 104oMissing,
  105. 105oMissing,
  106. 106oMissing,
  107. 107oMissing
  108. 108);
  109. 109
  110. 110//执行Excel中的宏
  111. 111rtnValue=this.RunMacro(oExcel,paraObjects);
  112. 112
  113. 113//保存更改
  114. 114oBook.Save();
  115. 115
  116. 116//退出Workbook
  117. 117oBook.Close(false,oMissing,oMissing);
  118. 118
  119. 119#endregion
  120. 120
  121. 121#region释放对象
  122. 122
  123. 123//释放Workbook对象
  124. 124System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook);
  125. 125oBook=null;
  126. 126
  127. 127//释放Workbooks对象
  128. 128System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks);
  129. 129oBooks=null;
  130. 130
  131. 131//关闭Excel
  132. 132oExcel.Quit();
  133. 133
  134. 134//释放Excel对象
  135. 135System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel);
  136. 136oExcel=null;
  137. 137
  138. 138//调用垃圾回收
  139. 139GC.Collect();
  140. 140
  141. 141#endregion
  142. 142}
  143. 143catch(Exceptionex)
  144. 144{
  145. 145throwex;
  146. 146}
  147. 147}
  148. 148
  149. 149///<summary>
  150. 150///执行宏
  151. 151///</summary>
  152. 152///<paramname="oApp">Excel对象</param>
  153. 153///<paramname="oRunArgs">参数(第一个参数为指定宏名称,后面为指定宏的参数值)</param>
  154. 154///<returns>宏返回值</returns>
  155. 155privateobjectRunMacro(objectoApp,object[]oRunArgs)
  156. 156{
  157. 157try
  158. 158{
  159. 159//声明一个返回对象
  160. 160objectobjRtn;
  161. 161
  162. 162//反射方式执行宏
  163. 163objRtn=oApp.GetType().InvokeMember(
  164. 164"Run",
  165. 165System.Reflection.BindingFlags.Default|
  166. 166System.Reflection.BindingFlags.InvokeMethod,
  167. 167null,
  168. 168oApp,
  169. 169oRunArgs
  170. 170);
  171. 171
  172. 172//返回值
  173. 173returnobjRtn;
  174. 174
  175. 175}
  176. 176catch(Exceptionex)
  177. 177{
  178. 178//如果有底层异常,抛出底层异常
  179. 179if(ex.InnerException.Message.ToString().Length>0)
  180. 180{
  181. 181throwex.InnerException;
  182. 182}
  183. 183else
  184. 184{
  185. 185throwex;
  186. 186}
  187. 187}
  188. 188}
  189. 189}
  190. 190}
  191. 191

示例三个VBA宏方法:

Java代码
  1. 1SubgetTime()
  2. 2
  3. 3Sheet1.Cells(1,1)=Now
  4. 4
  5. 5EndSub
  6. 6
  7. 7
  8. 8SubgetTime2(titleAsString)
  9. 9
  10. 10Sheet1.Cells(2,1)=title&":"&Now
  11. 11
  12. 12EndSub
  13. 13
  14. 14FunctiongetTime3(titleAsString)AsString
  15. 15
  16. 16getTime3=title&":"&Now
  17. 17
  18. 18EndFunction
  19. 19

对应的三个使用方法 1 不带参数的宏调用(兼演示执行过程显示Excel文件) 2 带参数的宏调用(兼演示执行过程不显示Excel文件) 3 有返回值的宏调用

Java代码
  1. 1privatevoidbtnExe_Click(objectsender,EventArgse)
  2. 2{
  3. 3try
  4. 4{
  5. 5//返回对象
  6. 6objectobjRtn=newobject();
  7. 7
  8. 8//获得一个ExcelMacroHelper对象
  9. 9ExcelMacroHelperexcelMacroHelper=newExcelMacroHelper();
  10. 10
  11. 11//执行指定Excel中的宏,执行时显示Excel
  12. 12excelMacroHelper.RunExcelMacro(
  13. 13@"E:\csharp_study\DoVBAMacro\test.xls",
  14. 14"getTime2",
  15. 15newObject[]{"现在时刻"},
  16. 16outobjRtn,
  17. 17true
  18. 18);
  19. 19
  20. 20//执行指定Excel中的宏,执行时不显示Excel
  21. 21excelMacroHelper.RunExcelMacro(
  22. 22@"E:\csharp_study\DoVBAMacro\test.xls",
  23. 23"getTime2",
  24. 24newObject[]{"现在时刻"},
  25. 25outobjRtn,
  26. 26false
  27. 27);
  28. 28
  29. 29//执行指定Excel中的宏,执行时显示Excel,有返回值
  30. 30excelMacroHelper.RunExcelMacro(
  31. 31@"E:\csharp_study\DoVBAMacro\test.xls",
  32. 32"getTime3",
  33. 33newObject[]{"现在时刻"},
  34. 34outobjRtn,
  35. 35true
  36. 36);
  37. 37
  38. 38MessageBox.Show((string)objRtn);
  39. 39
  40. 40}
  41. 41catch(System.Exceptionex)
  42. 42{
  43. 43MessageBox.Show(ex.Message);
  44. 44}
  45. 45}


相关评论