Re[5]: Уж извините за назойливость
От: morok Россия  
Дата: 31.03.05 12:11
Оценка:
Здравствуйте, 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 — языком кухарок был не прав.
Лень — это не врожденное чувство советского человека, а средство борьбы с неуемной, но бестолковой энергией начальника...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.