Ver Mensaje Individual
  #1 (permalink)  
Antiguo 21/12/2009, 07:07
negu
 
Fecha de Ingreso: diciembre-2009
Mensajes: 52
Antigüedad: 15 años, 2 meses
Puntos: 0
parametros de respuesta al ejecutar VBA desde C#

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