Здравствуйте, morok, Вы писали:
M>Я конечно понимаю, что наверное выгляжу глупо. Но если так, то уж пожалуйста ткните меня еще раз...
M>Вот код, который благодаря вам почти работает.
M>M>Excel::SheetsPtr spSheets = spTheWorkbook->GetSheets();
M>Excel::_WorksheetPtr spWorksheet = spSheets->GetItem(1);
M>//Получаем объединение
M>RangePtr r1 = spWorksheet->GetRange( "A1:C2" );
M>RangePtr r2 = spWorksheet->GetRange( "D3:D8" );
M>RangePtr unionRange = m_spExcelApp->Union( r1, r2 );
M>//Добавляем новое имя , указывающее на созданное объединение, причем адрес получаем External
M>NamePtr name = spTheWorkbook->GetNames()->Add(
M> _variant_t("TestName"),
M> _variant_t(
M> unionRange->GetAddress( _variant_t(true), _variant_t(true),Excel::xlA1, _variant_t(true) )
M> )
M> );
M>//А вот при попытке получить этот объект с которым связано имя программа вылетает
M>//с неизвестным исключением при попытке вызова метода GetRange
M>//ни один из представленных ниже вариантов не работает
M>//NamePtr foundName = spTheWorkbook->GetNames()->Item( _bstr_t("TestName") );
M>//RangePtr foundRange = m_spExcelApp->GetRange( foundName->GetRefersTo() );
M>//or
M>//RangePtr foundRange = m_spExcelApp->GetRange( _variant_t("TestName") );
M>//or
M>RangePtr foundRange = spWorksheet->GetRange( _variant_t("TestName") );
M>//Это для теста
M>foundRange->GetInterior()->ColorIndex = 5;
M>
M>Пробовал указать привязку имени разными способами, то есть
M>был и такой
M>M>unionRange->GetAddress( _variant_t(true), _variant_t(true),Excel::xlA1 )
M>unionRange->GetAddress( _variant_t(false), _variant_t(false),Excel::xlA1 )
M>
M>и т.п.
M>Ну ничего не могу понять, да и в хэлпе по VBA толком про такие вещи ничего не написано.
M>Помогите, чем сможите.
M>Спасибо.
Сам нашел причину.
Дело вот в чем. При вожу код на VBA
Dim newName As Name
Dim foundName As Name
Dim r As range
Dim r1 As range
Dim r2 As range
Dim ur As range
Dim wb As Workbook
Dim str As String
'Create two ranges and then union them
Set r1 = range("a1", "a2")
Set r2 = range("a1", "b2")
Set ur = Union(r1, r2)
'Create new Name object and bind it with the range union
Set newName = Application.Names.Add("TestName", ur.Address(True, True, xlA1, True))
'Get name object from the application
Set foundName = Application.Names.Item("TestName")
str = Replace(foundName.RefersTo, Chr(34), "")
'Get range from name
Set r = Application.range(str)
r.Interior.ColorIndex = 5
Дело в том, что значение строковой переменной ReferTo объекта Name содержит ссылку на адрес в виде, например:
"="[Книга1]Лист1!$A$1""
А для получения Range'a необходиом подставить строку вида
"=[Книга1]Лист1!$A$1"
Заметили различия?
Тот кто назвал язык VBA — языком кухарок был не прав.
Лень — это не врожденное чувство советского человека, а средство борьбы с неуемной, но бестолковой энергией начальника...