AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.09.2008, 18:01   #1  
Stainless is offline
Stainless
Участник
MCBMSS
Columbus IT
 
34 / 114 (4) +++++
Регистрация: 26.01.2007
Axapta и Excel
Как добавить в ячейку Excel гиперссылку?

На VBA код выглядит следующим образом:
X++:
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="http://www.axforum.info/"
Range("I21").Select
Старый 30.09.2008, 18:21   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Можно немножко понагляднее переписать VBA:
Код:
 
Sub ExcelMacro()

    Dim myRange As Range 'в Аксапте это будет COM myRange
    Dim myHyperlink As Hyperlink 'в Аксапте это будет COM myHyperlink

    Set myRange = Application.ActiveSheet.Range("A1")
    Set myHyperlink = myRange.Hyperlinks.Add(myRange, "http://www.axforum.info/")
    myHyperlink.TextToDisplay = "Вызов Аксфорума из ячейки"
    
End Sub
И далее портировать на X++:
X++:
{
    ComExcelDocument_RU doc = new ComExcelDocument_RU();

    COM     xlApp;
    COM     wbook;
    COM     activeSheet;
    COM     rng;
    COM     hyperlink;
    ;

    doc.NewFile();
    wbook = doc.getComDocument();

    xlApp = wbook.Parent();
    activeSheet = xlApp.ActiveSheet();

    rng = activeSheet.Range('A1');
    hyperlink = rng.Hyperlinks();
    hyperlink = hyperlink.Add(rng,'http://www.axforum.info/');
    hyperlink.TextToDisplay('Вызов Аксфорума из ячейки');
}
Если хочется непременно через Selection, то как-то так (вместо последних четырех строчек выше):
X++:
...................
    rng = activeSheet.Range('C10');
    rng.Select();

    hyperlink = activeSheet.Hyperlinks();
    hyperlink = hyperlink.Add(xlApp.Selection(),'http://www.axforum.info/');
    hyperlink.TextToDisplay('Вызов Аксфорума из ячейки');
}
За это сообщение автора поблагодарили: Stainless (1).
Старый 01.10.2008, 08:16   #3  
blokva is offline
blokva
Пенсионер
Аватар для blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Регистрация: 04.06.2003
Адрес: Беларусь
Добавте метод в класс ComExcelDocument_RU
X++:
void SetHyperLink(MSOfficeBookMark_RU _bookMark,  str _hyperLink, int _workSheet, str _textToDisplay = "")
{
    COM     activeRange;
    COM     hyperLinks;
    COM     workSheet;
    ;
    activeRange = this.findRange(_bookMark, _worksheet);
    workSheet = this.getWorkSheet(_workSheet);
    hyperLinks  = workSheet.HyperLinks();
    hyperLinks.Add(activeRange,  "#" + _hyperLink, "" , "",_textToDisplay);
}
__________________
Законы природы еще никто не отменял!
А еще у меня растет 2 внучки!!! Кому интересно подробности тут:
http://www.baby-shine.com/
За это сообщение автора поблагодарили: Stainless (1), decoder (1).
Старый 01.10.2008, 11:48   #4  
Stainless is offline
Stainless
Участник
MCBMSS
Columbus IT
 
34 / 114 (4) +++++
Регистрация: 26.01.2007
Спасибо
Старый 01.10.2008, 18:35   #5  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от blokva Посмотреть сообщение
X++:
    hyperLinks.Add(activeRange,  "#" + _hyperLink, "" , "",_textToDisplay);
А что это за диез перед _hyperLink? Зачем он нужен? С ним чего-то не работает, создается инвалидная сцылка...

Кстати, пора, наверное, интенсивно переходить от void-методов к методам, возвращающим COM объекты Excel, пригодные для удобной дальнейшей работы.

Void-методы что-то делают (создают, удаляют, вставляют, бордюрят и т.п.) и далее совершенно не заботятся о том, как мы будем добывать, например, гиперссылку, если она нам потребуется дальше. И от парочки "_bookMark, _worksheet" лучше перейти к нормальному использованию range и передавать его туды-сюды параметром как COM-объект (а не текстовым адресом и номером листа). Range сам несет в себе информацию о worksheet, на котором он находится. A worksheet в свою очередь - о workbook, в состав которого он входит. Не надо постоянно "искать" range при помощи findRange. C COM range, определенным на одном worksheet, можно легко оперировать при активном другом (например, задавать значение или делать фонт жирным).

Создал примерчик. Используемый класс - маленький наследник ComExcelDocument_RU см. в прилагаемом проекте.
X++:
static void Job88(Args _args)
{
    ComExcelDocument_RU_2 doc = new ComExcelDocument_RU_2();
    // класс ..._2 в прилагаемом проекте

    COM range1, range2;
    COM hyperlink;
    ;

    doc.newFile();
    doc.insertSheet();

    range2 = doc.getRange('C10', 2); // range2 - на втором листе и всё он сам прекрасно знает о себе
                                     // и всё это выдаст, когда его спросят

    range1 = doc.getRange('D20', 1); // активировал таким образом первый лист, чтобы показать,
    // что лист, на котором создается гиперссылка (второй), не обязательно должен быть активным

    hyperlink = doc.setHyperLink( range2, 'http://www.axforum.info/', 'Вызов Аксфорума из ячейки');

    // легко совершаем действие, "непрописанное" в setHyperLink
    hyperlink.ScreenTip('Это всплывающая подсказка к гиперссылке');

    // всё! смотрим ссылку на втором (!) листе, наводим на нее мышь, щелкаем по ней
}
Вложения
Тип файла: xpo ComExcelDocument_RU_2.xpo (1.5 Кб, 232 просмотров)
Теги
excel, url

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
Axapta программирует Excel на VBA Gustav DAX: База знаний и проекты 10 13.03.2006 11:42
Печать отчета в Excel. Axapta 3.0 Fedr Kuzmich DAX: Функционал 2 19.05.2004 18:26
Подвисание Excel при выводе из Axapta Ser DAX: Функционал 4 24.07.2003 13:59
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:57.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.