30.09.2008, 18:01 | #1 |
Участник
|
Axapta и Excel
Как добавить в ячейку Excel гиперссылку?
На VBA код выглядит следующим образом: X++: ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="http://www.axforum.info/" Range("I21").Select |
|
30.09.2008, 18:21 | #2 |
Moderator
|
Можно немножко понагляднее переписать 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++: { 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('Вызов Аксфорума из ячейки'); } 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 |
Пенсионер
|
Добавте метод в класс 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 |
Участник
|
Спасибо
|
|
01.10.2008, 18:35 | #5 |
Moderator
|
Цитата:
Кстати, пора, наверное, интенсивно переходить от 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('Это всплывающая подсказка к гиперссылке'); // всё! смотрим ссылку на втором (!) листе, наводим на нее мышь, щелкаем по ней } |
|