Благодаря Стиву , я получил большую часть пути туда. Оказывается, что, несмотря на документацию 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, но фактически не указано в документации.