Instead of writing to a csv in the first place, I decided to write to an .xlsx file with multiple sheets using something like this:
public class test
{
object missing = Type.Missing;
public test()
{
Excel.Application XL = new Excel.Application();
oXL.Visible = false;
Excel.Workbook WB = XL.Workbooks.Add(missing);
Excel.Worksheet Sheet = WB.ActiveSheet as Excel.Worksheet;
oSheet.Name = "First sheet";
oSheet.Cells[1, 1] = "Written on first sheet";
Excel.Worksheet Sheet2 = WB.Sheets.Add(missing, missing, 1, missing)
as Excel.Worksheet;
Sheet2.Name = "Second sheet";
Sheet2.Cells[1, 1] = "Written on second sheet";
string fileName = @"C:\temp\SoSample.xlsx";
oWB.SaveAs(fileName, Excel.XlFileFormat.xlOpenXMLWorkbook,
missing, missing, missing, missing,
Excel.XlSaveAsAccessMode.xlNoChange,
missing, missing, missing, missing, missing);
oWB.Close(missing, missing, missing);
oXL.UserControl = true;
oXL.Quit();
}
}
And I then created the with the workbook with the following code:
private void button1_Click(object sender, System.EventArgs e)
{
Excel.Application oExcel;
Excel.Workbook oBook;
VBIDE.VBComponent oModule;
Office.CommandBar oCommandBar;
Office.CommandBarButton oCommandBarButton;
String sCode;
Object oMissing = System.Reflection.Missing.Value;
// Create an instance of Excel.
oExcel = new Excel.Application();
// Add a workbook.
oBook = oExcel.Workbooks.Add(@"C:\Users\user\Downloads\test.xlsm");
// Create a new VBA code module.
oModule = oBook.VBProject.VBComponents.Add(VBIDE.vbext_ComponentType.vbext_ct_StdModule);
sCode =
//paste in your macro here, with each line followed by a new line
"Sub TestMacro()\r\n" +
"Columns(\"D:D\").Select\r\n" +
"Selection.Copy\r\n" +
"Columns(\"F:F\").Select\r\n" +
"ActiveSheet.Paste\r\n" +
"Application.CutCopyMode = False\r\n" +
"ActiveSheet.Range(\"$F$1:$F$542\").RemoveDuplicates Columns:=1, Header:=xlNo\r\n" +
"Range(\"F1\").Select\r\n" +
"ActiveCell.FormulaR1C1 = \"Unique Query\"\r\n" +
"Range(\"F2\").Select\r\n" +
"End Sub";
// Add the VBA macro to the new code module.
oModule.CodeModule.AddFromString(sCode);
// Make Excel visible to the user.
oExcel.Visible = true;
// Set the UserControl property so Excel won't shut down.
oExcel.UserControl = true;
// Release the variables.
oModule = null;
oBook = null;
oExcel = null;
// Collect garbage.
GC.Collect();
}
I was then able to run the macro just created with the code I originally posted.