我想做以下 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 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
}
}
编辑:响应 OP 澄清:
这可能会满足您的需求:
CSheets sheets = book.get_WorkSheets();
CWorkSheet sheet = sheets.get_ActiveSheet();
Range cols= sheet.get_Columns();
int nCols = cols.get_Count();
for (int i = nCols; i > 0; i--)
{
Range topCellOfCol = cells.get_Item(1, i);
Range entireCol = topCellOfCol.get_EntireColumn();
if (entireCol.get_Hidden())
entireCol.Delete( xlShiftToLeft );
}
关于c++ - 如何使用自动化在 C++ 中迭代 Excel 列的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/593037/