C++ 如何在C++;使用自动化?
我想做以下VBA代码的道德等效:C++ 如何在C++;使用自动化?,c++,excel,automation,C++,Excel,Automation,我想做以下VBA代码的道德等效: For Each col In Worksheets("Sheet1").Columns # do stuff Next col 我已经为Excel类型库生成了MFC包装器,这让我走了这么远(生成的类型都源自COleDispatchDriver: CApplication app; app.CreateDispatch( clsid, e ); CWorkbooks wbks( app.get_Workbooks() ); CWorkbook
For Each col In Worksheets("Sheet1").Columns
# do stuff
Next col
我已经为Excel类型库生成了MFC包装器,这让我走了这么远(生成的类型都源自COleDispatchDriver
:
CApplication app;
app.CreateDispatch( clsid, e );
CWorkbooks wbks( app.get_Workbooks() );
CWorkbook book( wbks.Open( filename, /* optional args */ ) );
CRange cols( app.get_Columns() );
long numCols = cols.get_Count();
从这里开始,我陷入了困境。看起来我可以使用Range::get_Item(rowid,colid)
在单元格上进行迭代,然后从单元格中获取列,但我一直在寻找上述循环的更直接的翻译
(编辑)澄清:我实际上并不关心单个单元格。我的目标是确定哪些列的宽度为0(隐藏),并将其从工作表中删除。我假设您正在尝试遍历电子表格中的所有单元格。您可以获得活动工作表的“所有单元格”范围,并在其行和列之间循环:
CSheets sheets = book.get_WorkSheets();
CWorkSheet sheet = sheets.get_ActiveSheet();
Range cells = sheet.get_Cells();
int nRows = cells.get_Rows().get_Count();
int nCols = cells.get_Columns().get_Count();
for (int i = 0; i <= nRows; i++)
{
for (int j = 0; j <= nCols; j++)
{
Range cell = cells.get_Item(i+1,j+1);
//Do stuff with individual cell
}
}
多亏了,我基本上做到了这一点。事实证明,尽管有Excel VBA文档,但Range::Item根据创建范围的方式具有不同的行为;因此:
COleVariant OPTIONAL( (long)DISP_E_PARAMNOTFOUND, VT_ERROR );
Range cols = sheet.get_Columns();
for ( long i = cols.get_Count(); i > 0; --i )
{
Range col = cols.get_Item( COleVariant( i ), OPTIONAL ) ;
// ...
}
将遍历表示列的范围,以及
Range rows = sheet.get_Rows();
for ( long i = rows.get_Count(); i > 0; --i )
{
Range row = cols.get_Item( COleVariant( i ), OPTIONAL );
// ...
}
将遍历表示行的范围。这在VBA示例中是隐式的,但在文档中没有实际说明
Range rows = sheet.get_Rows();
for ( long i = rows.get_Count(); i > 0; --i )
{
Range row = cols.get_Item( COleVariant( i ), OPTIONAL );
// ...
}