Hola,
necesito buscar para cada archivo excel de una ListBox si contiene una cierta palabra. Lo hago mediante ejecutar una macro VBA para cada archivo excel que obtiene de la listbox. El único problema que tengo, es que consigo ejecutar la macro VBA pero nose como hacerlo para obtener los parámetros de retorno de esta macro. Necesito obtener de la llamada a la macro un booleano para saber si ha encontrado o no la palabra.
Mi código es:
private void Buscar_Click(object sender, EventArgs e)
{
// Comprovación que hay una palabra a buscar
if (Cadena.Text.Length == 0)
{
MessageBox.Show("Introduce la palabra buscar");
return;
}
// Creamos un archivo de texto para ir escribiendo los archivos excel que contienen la palabra
FileStream fs = File.Create(@"C:\Users\mgrau\Desktop\encontrados.t xt");
StreamWriter writer = new StreamWriter(fs);
int nItems = Llista.Items.Count;
// Comprovación que hay archivos en la lista para buscar
if (nItems == 0)
{
MessageBox.Show("No hay archivos Excel!");
return;
}
string path;
// Para cada archivo a buscar, nos conectamos con Excel y ejecutamos la Macro
for (int i = 0; i < nItems; ++i)
{
path = Llista.Items[i].ToString();
object oMissing = System.Reflection.Missing.Value;
Excel.ApplicationClass oExcel = new Excel.ApplicationClass();
oExcel.Visible = true;
Excel.Workbooks oBooks = oExcel.Workbooks;
Excel._Workbook oBook = null;
oBook = oBooks.Open(path, oMissing, oMissing,
oMissing, oMissing, oMissing, oMissing, oMissing, oMissing,
oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);
// ejecución de la Macro
RunMacro(oExcel, new Object[] { "Buscar", Cadena.Text });
// Salimos de Excel y limpiamos
oBook.Close(false, oMissing, oMissing);
System.Runtime.InteropServices.Marshal.ReleaseComO bject(oBook);
oBook = null;
System.Runtime.InteropServices.Marshal.ReleaseComO bject(oBooks);
oBooks = null;
oExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComO bject(oExcel);
oExcel = null;
// Escribimos el archivo en un fixchero de texto (cuando la macro retorne el booleano sólo lo escribirá si ha encontrado la palabra)
writer.WriteLine(path);
}
// Cerramos el archivo
writer.Close();
}
// Ejecución de la MAcro
// Probablemente hay que modificar algun elemento de esta función
private void RunMacro(object oApp, object[] oRunArgs)
{
oApp.GetType().InvokeMember("Run",
System.Reflection.BindingFlags.Default |
System.Reflection.BindingFlags.InvokeMethod,
null, oApp, oRunArgs);
}
Muchas gracias por avanzado.
Saludos.
Marc