enhzflep
Вместо того чтобы индексировать коллекцию листов, необходимо предоставить функции допустимые объекты листа.
Запустив новый экземпляр excel и записав 2 макроса, мы получим следующий код:
1. Лист между &амп Лист2; Лист3 (Правой Кнопкой Мыши лист 3, Добавить новый лист)
Sheets("Sheet3").Select
Sheets.Add
2. Лист добавляется в конце, после всех листов
Sheets.Add After:=Sheets(Sheets.Count)
Фрагмент кода c++, который я только что собрал вместе, достигает #2:
(помня, что мы должны передавать args в обратном порядке для COM-вызовов)
// Get Workbooks collection
IDispatch *pXlBooks;
pXlBooks = getIDispatchVal(pXlApp, L"WorkBooks");
// Call Workbooks.Add() to get a new workbook...
IDispatch *pXlBook;
pXlBook = getIDispatchVal(pXlBooks, L"Add");
IDispatch *pXlSheets;
pXlSheets = getIDispatchVal(pXlBook, L"Worksheets");
int curBookSheetCount = getCount(pXlSheets);
IDispatch *aftrSheet = getItem(pXlSheets, curBookSheetCount);
IDispatch *pNewSheet;
{
VARIANT result, var1,var2;
VariantInit(&result);
var1.pdispVal = NULL;
var1.vt = VT_NULL;
var2.pdispVal = aftrSheet;
var2.vt = VT_DISPATCH;
AutoWrap(DISPATCH_METHOD, &result, pXlSheets, L"Add", 2, var2, var1);
pNewSheet = result.pdispVal;
}
Пара моих вспомогательных функций:
int getCount(IDispatch *pCollection)
{
VARIANT result;
VariantInit(&result);
result.pdispVal = NULL;
AutoWrap(DISPATCH_PROPERTYGET, &result, pCollection, L"Count", 0);
return result.lVal;
}
IDispatch *getItem(IDispatch *pCollection, int index)
{
VARIANT result, param1;
VariantInit(&result);
result.pdispVal = NULL;
param1.vt = VT_I4;
param1.lVal = index;
AutoWrap(DISPATCH_PROPERTYGET, &result, pCollection, L"Item", 1, param1);
return(result.pdispVal);
}
// EDIT: I forgot this one.
IDispatch *getIDispatchVal(IDispatch *pObject, wchar_t *valName)
{
VARIANT result;
VariantInit(&result);
AutoWrap(DISPATCH_PROPERTYGET, &result, pObject, valName, 0);
return result.pdispVal;
}