En este artículo se muestra cómo automatizar Microsoft Excel y rellenar un rango de varias celdas con una matriz de valores.
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:
224925
(http://support.microsoft.com/kb/224925/EN-US/
)
INFORMACIÓN: Bibliotecas de tipos para Office pueden cambiar con la nueva versión
Pasos para crear proyectos
- 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:
178749
(http://support.microsoft.com/kb/178749/EN-US/
)
Cómo crear un proyecto de automatización mediante MFC y una biblioteca de tipos
- Para el cuadro de diálogo creado en los pasos 4 y 5 de de artículo primario 178749
(http://support.microsoft.com/kb/178749/EN-US/
)
, 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
- En la parte superior del archivo AutoProjectDlg.cpp, agregue la siguiente línea:
- 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);
- Compile y ejecute el proyecto.
- 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. - 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.
Para obtener más información acerca de cómo automatizar Microsoft Excel mediante MFC, vea los artículos siguientes en Microsoft Knowledge Base:
186122
(http://support.microsoft.com/kb/186122/EN-US/
)
Cómo usar MFC para automatizar Excel y obtener una matriz desde un rango
184663
(http://support.microsoft.com/kb/184663/EN-US/
)
Cómo incrustar y automatizar una hoja de cálculo Microsoft Excel con MFC
179706
(http://support.microsoft.com/kb/179706/EN-US/
)
Usar MFC para automatizar Excel y crear o formato de un libro nuevo
178781
(http://support.microsoft.com/kb/178781/EN-US/
)
Cómo automatizar Excel con MFC y funciones de hoja de cálculo
178783
(http://support.microsoft.com/kb/178783/EN-US/
)
Cómo usar MFC para crear un gráfico de Microsoft Excel
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
| kbmt kbautomation kbcode kbhowto kbinterop KB186120 KbMtes |
Traducción automáticaIMPORTANTE: 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
(http://support.microsoft.com/kb/186120/en-us/
)