Cómo usar MFC para automatizar Excel y rellenar un rango con una matriz

Seleccione idioma Seleccione idioma
Id. de artículo: 186120 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo se muestra cómo automatizar Microsoft Excel y rellenar un rango de varias celdas con una matriz de valores.

Más información

Para rellenar un rango de varias celdas sin rellenar las celdas uno a uno, debe crear una variante bidimensional SAFEARRAY que pasar a Excel llamando a la función EstablecerValor para el objeto Range. Los pasos siguientes ilustran este proceso.

Notas para automatizar Microsoft Excel 2000 y 2002

El código de ejemplo en este artículo utiliza contenedores de clase generados a partir de la biblioteca de objeto Excel 97 (Excel 8.olb). Con pequeñas modificaciones, este código puede aplicarse a un cliente de automatización que utiliza contenedores de clase para Excel 2000 (Excel9.olb) o en Excel 2002 (Excel.olb). Para obtener información adicional acerca de cómo utilizar el código de ejemplo descrito en este artículo con Microsoft Excel 2000 o 2002 biblioteca de tipo, haga clic en el número de artículo siguiente para ver en Microsoft Knowledge Base:
224925INFORMACIÓN: Bibliotecas de tipos para Office pueden cambiar con la nueva versión

Pasos para crear proyectos

  1. Siga los pasos 1 al 12 en el siguiente artículo en Microsoft Knowledge Base para crear un proyecto de ejemplo que utiliza la interfaz IDispatch interfaces y funciones miembro definidas en la biblioteca de tipo Excel8.olb:
    178749Cómo crear un proyecto de automatización mediante MFC y una biblioteca de tipos
  2. Para el cuadro de diálogo creado en los pasos 4 y 5 de de artículo primario 178749, agregue los siguientes controles con propiedades como especificado. También agregar las variables miembro correspondientes:
                                      Member                Member
          Control   Name              Variable Type         Variable Name
          -----------------------------------------------------------------
          Edit      IDC_STARTINGCELL  m_sStartingCell       CString
          Edit      IDC_NUMROWS       m_iNumRows            short
          Edit      IDC_NUMCOLS       m_iNumCols            short
          CheckBox  IDC_STRING        m_bFillWithStrings    BOOL
    					
  3. En la parte superior del archivo AutoProjectDlg.cpp, agregue la siguiente línea:
          #include "excel8.h"
    					
  4. Agregue el código siguiente a CAutoProjectDlg:: OnRun () en el archivo AutoProjectDlg.cpp.

    Código de ejemplo

          // OLE Variant for Optional.
          COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    
          _Application objApp;
    
          _Workbook objBook;
          Workbooks objBooks;
          Worksheets objSheets;
          _Worksheet objSheet;
          Range range;
    
          if(!UpdateData(TRUE))
          {
             return;
          }
    
          // Instantiate Excel and start a new workbook.
          objApp.CreateDispatch("Excel.Application");
          objBooks = objApp.GetWorkbooks();
          objBook = objBooks.Add(VOptional);
          objSheets = objBook.GetWorksheets();
          objSheet = objSheets.GetItem(COleVariant((short)1));
    
          //Get the range where the starting cell has the address
          //m_sStartingCell and it's dimensions are m_iNumRows x m_iNumCols.
          range = objSheet.GetRange(COleVariant(m_sStartingCell),
                                    COleVariant(m_sStartingCell));
          range = range.GetResize(COleVariant(m_iNumRows),
                                  COleVariant(m_iNumCols));
    
          //*** Fill the range with an array of values.
    
          //Create the SAFEARRAY.
          COleSafeArray saRet;
          DWORD numElements[2];
          numElements[0]= m_iNumRows;   //Number of rows in the range.
          numElements[1]= m_iNumCols;   //Number of columns in the range.
    
          if(m_bFillWithStrings)
          {
             saRet.Create(VT_BSTR, 2, numElements);
          }
          else
          {
             saRet.Create(VT_R8, 2, numElements);
          }
    
          //Fill the SAFEARRAY.
          long index[2];
          long iRow;
          long iCol;
    
          for(iRow=0;iRow<=m_iNumRows-1;iRow++)
          {
             for(iCol=0;iCol<=m_iNumCols-1;iCol++)
             {
                index[0] = iRow;
                index[1] = iCol;
                if(m_bFillWithStrings)      //Fill with Strings.
                {
                   VARIANT v;
                   CString s;
                   VariantInit(&v);
                   v.vt = VT_BSTR;
                   s.Format("r%dc%d", iRow, iCol);
                   v.bstrVal = s.AllocSysString();
                   saRet.PutElement(index, v.bstrVal);
                   SysFreeString(v.bstrVal);
                   VariantClear(&v);
                }
                else                     //Fill with Numbers.
                {
                   double d;
                   d = (iRow*1000) + iCol;
                   saRet.PutElement(index, &d);
                }
             }
          }
    
          //Set the range value to the SAFEARRAY.
          range.SetValue(COleVariant(saRet));
          saRet.Detach();
    
          //Return control of Excel to the user.
          objApp.SetVisible(TRUE);
          objApp.SetUserControl(TRUE);
    					
  5. Compile y ejecute el proyecto.
  6. Especifique los valores siguientes para los controles en el cuadro de diálogo:
          Control               Contents
          ------------------------------
          IDC_STARTINGCELL      A1
          IDC_NUMROWS           10
          IDC_NUMCOLS           5
          IDC_STRING            True
    						
    haga clic en Aceptar.

    Resultados: Se genera un nuevo libro y se rellenan las celdas a1: E10 de la primera hoja de cálculo con los valores de cadena.
  7. Especifique los valores siguientes para los controles en el cuadro de diálogo:
          Control               Contents
          ------------------------------
          IDC_STARTINGCELL      C3
          IDC_NUMROWS           2
          IDC_NUMCOLS           9
          IDC_STRING            False
    						
    haga clic en Aceptar.

    Resultados: Se genera un nuevo libro y C3:K4 de celdas de la primera hoja se rellenan con valores numéricos.

Referencias

Para obtener más información acerca de cómo automatizar Microsoft Excel mediante MFC, vea los artículos siguientes en Microsoft Knowledge Base:
186122Cómo usar MFC para automatizar Excel y obtener una matriz desde un rango

184663Cómo incrustar y automatizar una hoja de cálculo Microsoft Excel con MFC

179706Usar MFC para automatizar Excel y crear o formato de un libro nuevo

178781Cómo automatizar Excel con MFC y funciones de hoja de cálculo

178783Cómo usar MFC para crear un gráfico de Microsoft Excel

Propiedades

Id. de artículo: 186120 - Última revisión: martes, 23 de enero de 2007 - Versión: 4.2
La información de este artículo se refiere a:
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise
  • Microsoft Visual C++ 5.0 Professional
  • Microsoft Visual C++ 6.0 Professional
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 97 Standard Edition
Palabras clave: 
kbmt kbautomation kbcode kbhowto kbinterop KB186120 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 186120

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com