C# 运行 一个带参数的 excel 宏
C# running a excel macro with parameters
我正在尝试以编程方式打开 excel 工作簿和 运行 接受在命令行中输入的参数的宏。到目前为止,我可以打开工作簿并执行宏,但我在传递参数时遇到问题。
我目前的代码:
public void runTemplate(string templateName, string sourceFile, string destinationFile, string ITPath, string date)
{
string template = templateName + "!DoTheImport";
Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
ExcelApp.DisplayAlerts = false;
object misValue = System.Reflection.Missing.Value;
ExcelApp.Visible = false;
Microsoft.Office.Interop.Excel.Workbook ExcelWorkBook = ExcelApp.Workbooks.Open(sourceFile);
RunMacro(ExcelApp, new Object[] { template });
ExcelWorkBook.SaveCopyAs(destinationFile);
ExcelWorkBook.SaveCopyAs(ITPath);
ExcelWorkBook.Close(false, misValue, misValue);
ExcelApp.Quit();
if (ExcelWorkBook != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelWorkBook); }
if (ExcelApp != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp); }
}
private void RunMacro(object oApp, object[] oRunArgs)
{
oApp.GetType().InvokeMember("Run", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, oApp, oRunArgs);
}
我的宏看起来像:
Sub DoTheImport(sDate As String)
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;\filePath\DecisionsByRegion-" + sDate + ".txt",
Destination:=Range("$A") _)
.Name = "test"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 437
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = True
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
Columns("A:G").EntireColumn.AutoFit
Columns("H").EntireColumn.Delete
End Sub
正如我所说,这对于执行宏来说效果很好(sDate 最初是 Now() 在子程序中被格式化为字符串,而不是如图所示传入),但我正在尝试使用 'date'变量被传递到 运行Template 并将其作为 sDate 传递到我的宏中。我试过简单地将它添加到参数对象 RunMacro(ExcelApp, new Object[] { template, date });
中,但这引发了错误。
虽然我无法使用现有方法传递多个变量,但我找到了一种执行宏的替代方法,它允许我根据需要传递参数。
public void runTemplate(string templateName, string sourceFile, string destinationFile, string ITPath, string date)
{
string sDate = date;
Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
ExcelApp.DisplayAlerts = false;
object misValue = System.Reflection.Missing.Value;
ExcelApp.Visible = false;
Microsoft.Office.Interop.Excel.Workbook ExcelWorkBook = ExcelApp.Workbooks.Open(sourceFile);
ExcelApp.Run("DoTheImport", sDate);
ExcelWorkBook.SaveCopyAs(destinationFile);
ExcelWorkBook.SaveCopyAs(ITPath);
ExcelWorkBook.Close(false, misValue, misValue);
ExcelApp.Quit();
if (ExcelWorkBook != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelWorkBook); }
if (ExcelApp != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp); }
}
我删除了 RunMacro 方法并简单地使用 ExcelApp.Run("DoTheImport", sDate);
来执行宏。这个方法允许我将参数传递到宏中,可以通过添加'ByVal'参数传递机制在宏中访问:
Sub DoTheImport(ByVal sDate As String)
我正在尝试以编程方式打开 excel 工作簿和 运行 接受在命令行中输入的参数的宏。到目前为止,我可以打开工作簿并执行宏,但我在传递参数时遇到问题。
我目前的代码:
public void runTemplate(string templateName, string sourceFile, string destinationFile, string ITPath, string date)
{
string template = templateName + "!DoTheImport";
Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
ExcelApp.DisplayAlerts = false;
object misValue = System.Reflection.Missing.Value;
ExcelApp.Visible = false;
Microsoft.Office.Interop.Excel.Workbook ExcelWorkBook = ExcelApp.Workbooks.Open(sourceFile);
RunMacro(ExcelApp, new Object[] { template });
ExcelWorkBook.SaveCopyAs(destinationFile);
ExcelWorkBook.SaveCopyAs(ITPath);
ExcelWorkBook.Close(false, misValue, misValue);
ExcelApp.Quit();
if (ExcelWorkBook != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelWorkBook); }
if (ExcelApp != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp); }
}
private void RunMacro(object oApp, object[] oRunArgs)
{
oApp.GetType().InvokeMember("Run", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, oApp, oRunArgs);
}
我的宏看起来像:
Sub DoTheImport(sDate As String)
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;\filePath\DecisionsByRegion-" + sDate + ".txt",
Destination:=Range("$A") _)
.Name = "test"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 437
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = True
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
Columns("A:G").EntireColumn.AutoFit
Columns("H").EntireColumn.Delete
End Sub
正如我所说,这对于执行宏来说效果很好(sDate 最初是 Now() 在子程序中被格式化为字符串,而不是如图所示传入),但我正在尝试使用 'date'变量被传递到 运行Template 并将其作为 sDate 传递到我的宏中。我试过简单地将它添加到参数对象 RunMacro(ExcelApp, new Object[] { template, date });
中,但这引发了错误。
虽然我无法使用现有方法传递多个变量,但我找到了一种执行宏的替代方法,它允许我根据需要传递参数。
public void runTemplate(string templateName, string sourceFile, string destinationFile, string ITPath, string date)
{
string sDate = date;
Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
ExcelApp.DisplayAlerts = false;
object misValue = System.Reflection.Missing.Value;
ExcelApp.Visible = false;
Microsoft.Office.Interop.Excel.Workbook ExcelWorkBook = ExcelApp.Workbooks.Open(sourceFile);
ExcelApp.Run("DoTheImport", sDate);
ExcelWorkBook.SaveCopyAs(destinationFile);
ExcelWorkBook.SaveCopyAs(ITPath);
ExcelWorkBook.Close(false, misValue, misValue);
ExcelApp.Quit();
if (ExcelWorkBook != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelWorkBook); }
if (ExcelApp != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp); }
}
我删除了 RunMacro 方法并简单地使用 ExcelApp.Run("DoTheImport", sDate);
来执行宏。这个方法允许我将参数传递到宏中,可以通过添加'ByVal'参数传递机制在宏中访问:
Sub DoTheImport(ByVal sDate As String)