VBScript не может открыть гиперссылки на лист excel (не всю книгу) из тела электронной почты outlook напрямую
Предыстория:
Предполагается, что я создам панель мониторинга (в excel) с помощью vbscript и отправлю ее по электронной почте(outlook) кому-то. У меня уже есть шаблон для панели мониторинга(excel). Мой скрипт открывает этот шаблон excel, обновляет Excel с сегодняшними результатами и некоторыми гиперссылками на некоторые новые файлы, создает почтовый конверт excel и отправляет его кому-то.
Выпуск:
Мой скрипт добавляет 2 гиперссылки в панель мониторинга excel. 1-я ссылка указывает на a файл mht и 2-я ссылка указывают на другой файл excel. Я отправил письмо самому себе и вскрыл его. После открытия письма, когда я нажимаю на 1-ю ссылку(на файл mht), он работает нормально и открывает IE для отображения содержимого файла mht. Проблема заключается во второй гиперссылке, которая указывает на файл excel. Это не открытие файла excel(я убедился, что ссылка верна).
Есть ли что-то, что мне нужно изменить в моем коде, или есть какие-либо настройки outlook, которые позволят мне открыть ссылку непосредственно в файл excel?
Код:
Option Explicit
Dim objXL, objXb, objXs, strXlPath, strMHTLink, strExcelLink
'Dashboard Excel template
strXlPath = "C:UsersGurmanWorkMiscExcel Hyperlink in Outlooktest.xlsx"
'Link to MHT file
strMHTLink = "C:UsersGurmanWorkMiscExcel Hyperlink in OutlookMHTFile.mht"
'Link to another Excel File
strExcelLink = "C:UsersGurmanWorkMiscExcel Hyperlink in OutlookEXLFile.xlsx"
'Opening an excel(strXlPath) and updating it's Sheet1. In Sheet1, I will be adding 2 hyperlinks.
'1st link for the MHT file(strMHTLink)
'2nd link for another Excel File(strExcelLink)
set objXl = CreateObject("excel.application")
objXl.visible = true
objXl.displayAlerts = false
set objXb = objXl.Workbooks.Open(strXlPath)
set objXs = objXb.Sheets("Sheet1")
objXs.Cells(2,1) = "=HYPERLINK("""&strMHTLink&""",""MHTLINK"")" 'When clicked, it should open IE to display mht file contents
objXs.Cells(2,2) = "=HYPERLINK(""["&strExcelLink&"]Sheet1!A1"",""EXLLINK"")" 'When clicked, it should open Sheet1 of EXLFile.xlsx
'Saving the Workbook
objXb.save
'Mailing this excels contents using Mail Envelope
objXb.EnvelopeVisible = true
With objXs.MailEnvelope.Item
.to = "[email protected]" 'contains an email address
.subject = "Today's Hyperlinks"
.attachments.add strXlPath 'attaches the saved dashboard in email
.send
End With
objXb.Close
objXl.Quit
set objXs = Nothing
set objXb = Nothing
set objXl = Nothing
Скриншоты:
Это письмо, которое я получаю. Вы можете видеть, что он имеет 2 ссылки и файл excel в качестве вложения(этот прикрепленный excel-моя панель мониторинга (тест.XLSX-файл). Его содержание совпадает с содержанием этого тела электронной почты)
В теле электронной почты, когда я нажимаю на ссылку mht, он открывает IE, как и ожидалось:
Но когда я нажимаю по ссылке Excel ничего не открывается. Даже цвет ссылки не меняется при нажатии:
Как я убедился, что гиперссылка excel верна?
Это письмо имеет приложение excel, которое имеет то же содержание, что и тело письма. Я открыл этот excel и нажал на гиперссылку. Обе гиперссылки работают, как показано ниже. Но я хочу открыть обе ссылки из тела электронной почты outlook напрямую(не это путь).
Я постарался предоставить как можно больше информации, как я мог. Пожалуйста, дайте мне знать, если потребуется какая-либо другая информация.
Обновление 1:
Вот исходный код тела электронной почты, запрошенный @garbb
<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=ProgId content=Excel.Sheet>
<meta name=Generator content="Microsoft Excel 14">
<link rel=File-List href="cid:[email protected]">
<link rel=OLE-Object-Data href="cid:oledata.mso">
<style>
<!--table
{mso-displayed-decimal-separator:".";
mso-displayed-thousand-separator:",";}
.xl15
{padding-top:1px;
padding-right:1px;
padding-left:1px;
mso-ignore:padding;
color:black;
font-size:11.0pt;
font-weight:400;
font-style:normal;
text-decoration:none;
font-family:Calibri, sans-serif;
mso-font-charset:0;
mso-number-format:General;
text-align:general;
vertical-align:bottom;
mso-background-source:auto;
mso-pattern:auto;
white-space:nowrap;}
.xl65
{padding-top:1px;
padding-right:1px;
padding-left:1px;
mso-ignore:padding;
color:blue;
font-size:11.0pt;
font-weight:400;
font-style:normal;
text-decoration:underline;
text-underline-style:single;
font-family:Calibri, sans-serif;
mso-font-charset:0;
mso-number-format:General;
text-align:general;
vertical-align:bottom;
mso-background-source:auto;
mso-pattern:auto;
white-space:nowrap;}
-->
</style>
<!--[if gte mso 9]><xml>
<x:ExcelWorkbook>
<x:ExcelWorksheets>
<x:ExcelWorksheet>
<x:Name>Sheet1</x:Name>
<x:WorksheetOptions>
<x:DefaultRowHeight>300</x:DefaultRowHeight>
<x:Selected/>
<x:Panes>
<x:Pane>
<x:Number>3</x:Number>
<x:ActiveRow>8</x:ActiveRow>
<x:ActiveCol>4</x:ActiveCol>
</x:Pane>
</x:Panes>
<x:ProtectContents>False</x:ProtectContents>
<x:ProtectObjects>False</x:ProtectObjects>
<x:ProtectScenarios>False</x:ProtectScenarios>
</x:WorksheetOptions>
</x:ExcelWorksheet>
</x:ExcelWorksheets>
<x:WindowHeight>8010</x:WindowHeight>
<x:WindowWidth>14805</x:WindowWidth>
<x:WindowTopX>240</x:WindowTopX>
<x:WindowTopY>105</x:WindowTopY>
<x:HasEnvelope/>
<x:ProtectStructure>False</x:ProtectStructure>
<x:ProtectWindows>False</x:ProtectWindows>
</x:ExcelWorkbook>
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="3073" />
</xml><![endif]-->
</head>
<body link=blue vlink=purple>
<table border=0 cellpadding=0 cellspacing=0 width=183 style='border-collapse:
collapse;table-layout:fixed;width:138pt'>
<col width=89 style='mso-width-source:userset;mso-width-alt:3254;width:67pt'>
<col width=94 style='mso-width-source:userset;mso-width-alt:3437;width:71pt'>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl15 width=89 style='height:15.0pt;width:67pt'>Link_To_MHT</td>
<td class=xl15 width=94 style='width:71pt'>Link_To_Excel</td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl65 style='height:15.0pt'><a
href="file:///C:UsersGurmanWorkMiscExcel%20Hyperlink%20in%20OutlookMHTFile.mht">MHTLINK</a></td>
<td class=xl65><a
href="%5bC:/Users/Gurman/Work/Misc/Excel%20Hyperlink%20in%20Outlook/EXLFile.xlsx%5dSheet1!A1">EXLLINK</a></td>
</tr>
<![if supportMisalignedColumns]>
<tr height=0 style='display:none'>
<td width=89 style='width:67pt'></td>
<td width=94 style='width:71pt'></td>
</tr>
<![endif]>
</table>
</body>
</html>
Обновление 2
Таким образом обе формулы гиперссылки отображаются в панели мониторинга
Ячейки Excel:
MHTLINK (работа изнутри приборной панели excel):
=HYPERLINK("C:UsersGurmanWorkMiscExcel Hyperlink in OutlookMHTFile.mht","MHTLINK")
EXLLINK (работа из панели мониторинга excel):
=HYPERLINK("[C:UsersGurmanWorkMiscExcel Hyperlink in OutlookEXLFile.xlsx]Sheet1!A1","EXLLINK")
В Outlook, как показано в источнике электронной почты в обновлении 1, ссылки:
MHTLINK (работа с телом электронной почты):
<a href="file:///C:UsersGurmanWorkMiscExcel%20Hyperlink%20in%20OutlookMHTFile.mht">MHTLINK</a>
EXLLINK(не работает с телом электронной почты):
<a href="%5bC:/Users/Gurman/Work/Misc/Excel%20Hyperlink%20in%20Outlook/EXLFile.xlsx%5dSheet1!A1">EXLLINK</a>
ОБНОВЛЕНИЕ 3 (ПЕРВОПРИЧИНА ПРОБЛЕМЫ)
В моем коде vbscript есть строка:
objXs.Cells(2,2) = "=HYPERLINK(""["&strExcelLink&"]Sheet1!A1"",""EXLLINK"")"
Это фактически создает гиперссылка на Лист1 книги Excel. Формула, которая записывается в этой ячейке, также является правильной, которая является =HYPERLINK("[C:UsersGurmanWorkMiscExcel Hyperlink in OutlookEXLFile.xlsx]Sheet1!A1","EXLLINK"). Мне важно добавить Sheet1!A1 в эту формулу, так как я хочу, чтобы гиперссылка указывала на конкретный лист (в данном случае Лист1) книги
Проблема возникает, когда эта формула EXCEL преобразуется в ссылку в почте OUTLOOK, ее значение становится:
<a href="%5bC:/Users/Gurman/Work/Misc/Excel%20Hyperlink%20in%20Outlook/EXLFile.xlsx%5dSheet1!A1">EXLLINK</a>
Приведенная выше ссылка кажется неправильной, так как она имеет некоторые шестнадцатеричные значения, такие как %5b, %5d и т.д. Следовательно, он не работает непосредственно.
Если я изменю свой код VBScript, чтобы создать гиперссылку только на книгу Excel, а не создавать гиперссылку на ее "лист 1", он будет работать нормально, и я также могу открыть ссылку на книгу excel непосредственно из электронной почты.
Обновленная строка в VBscript:
objXs.Cells(2,2) = "=HYPERLINK("""&strExcelLink&""",""EXLLINK"")"
В источнике электронной почты он был преобразован в:
<a href="file:///C:UsersGurmanWorkMiscExcel%20Hyperlink%20in%20OutlookEXLFile.xlsx">EXLLINK</a>
Я могу открыть книгу excel, используя эту ссылку непосредственно из электронной почты. Но недостатком такого подхода является что он может или не может открыть Лист1 в этом случае. Как только кто-то нажимает на гиперссылку, может быть, вместо Sheet1 открывается Sheet2. Поэтому я хотел разобраться с этой вещью в моем коде сам.
Итак, мой вопрос / проблема все еще остается нерешенным:
Можно ли иметь гиперссылку в теле электронной почты Outlook, которая открывает определенный лист книги excel?
2 ответов:
Вместо того, чтобы использовать
HYPERLINK, который на самом деле является формулой, просто добавьте реальную гиперссылку на ячейку:objXs.Cells(2,2).Hyperlinks.Add objXs.cells(2,2), strExcelLink, "Sheet1!A1", "My Screentip", "EXLLINK"
Гиперссылка на определенный лист Excel:
Файл: / / / c:\yourPath\yourFileName.xlsm#yourSheetName!A1
Это можно использовать в электронной почте Outlook. Щелчок по ссылке откроет
c:\yourPath\yourFileName.xlsmна листеyourSheetNameи выделит ячейкуA1.(Источник)
Гиперссылка на UNC (сетевой) путь:
(я не могу проверить их, но один или оба из этих методов должны работать.)
File: / / / / / server / path / to / file.txt
(это пять косых черт!)
Или
File: / / server / path / to / file.txt
(Источник)
Гиперссылка в HTML почте:
Другая возможность, если письмо находится в формате HTML, была бы примерно такой (которая могла бы включать более причудливое форматирование, такое как подсказка , и т.д.):
<style> a.tooltips {position: relative; display: inline;} a.tooltips span { position: absolute; width:240px; color: #FFFFFF; background: #000000; height: 30px; line-height: 30px; text-align: center; visibility: hidden; border-radius: 6px; } a.tooltips span:after { content: ''; position: absolute; top: 100%; left: 50%; margin-left: -8px; width: 0; height: 0; border-top: 8px solid #000000; border-right: 8px solid transparent; border-left: 8px solid transparent; } a:hover.tooltips span { visibility: visible; opacity: 0.8; bottom: 30px; left: 50%; margin-left: -76px; z-index: 999; } </style> <br><br> <a class="tooltips" href="#">\\server\share\docs<span>This is a ToolTip!</span></a>(Источник)
Правка:
ладно, вы сделали хорошую работу по сбору информации до сих пор, так я надеялась, что через пару дней вы могли бы сделать некоторые дополнительные исследования и выяснить это... :)
Честно говоря, я не уверен в точном правильном методе выполнения шагов, которые вам нужно сделать, но я знаю шаги, которые я предпринял бы , чтобы узнать - и, основываясь на моем опыте, это трудно предсказать, сколько времени займет процесс, независимо от того, простой или сложной кажется проблема. Таким образом, основываясь на принципе переполнения стека "помочь вам с конкретными проблемами; не делать работу за вас", я поделюсь шагами, которые я бы предпринял далее, предоставлю нам обновления о том, что вы узнаете, задам конкретные вопросы о том, с чем вы сталкиваетесь, и обязательно опубликую рабочее решение, как только все это выяснится, чтобы помочь другим, кто сталкивается с той же конкретной проблемой. :- )Любые советы или код, предоставленные другими (включая меня) на таком сайте, будут основаны на предположениях, которые мы, возможно, даже не осознаем, что делаем, поскольку никто не знает "всю ситуацию" лучше, чем вы. (аскеры & ответчики часто не осознают разъединения, вызванного XY проблема.)Прекрасная вещь с кодированием (особенно с офисом) заключается в том, что есть почти всегда несколько (совершенно разных) способов достижения цели. тот же конечный результат. Некоторые из способов будут лучше подходить для конкретные задачи, чем другие, другие могут быть полностью сменный.
На решение о том, какой метод использовать, может повлиять множество факторов. (некоторые очевидные, некоторые непредвиденные) , такие как масштаб проекта, Безопасность требования, уровень знаний обоих разработчиков & конечный пользователь, сроки, как часто он будет использоваться и / или потребуется фундаментальный изменения, и так далее. Поэтому лучший человек, чтобы решить, это вы, разработчик.
моя точка зрения: обычный шаг при разработке раздела кода для выполнения задачи-выбросить то, что у вас есть, и начать все сначала. (конечно, я не единственный, кто так поступает, верно?!)
Отправка статической ежедневный отчет на нескольких адресатов как вложения 'ооочень 1997'!
...и есть много причин, по которым это плохая практика. Для начала, это пустая трата полосы пропускания и место для хранения (немного похоже на создание отдельных копий VHS Home Alone 3 для каждого телевизора в вашем доме), но вы, вероятно, можете подумать и о других причинах (большая из которых заключается в том, что это не работает.)
Если я правильно понял, вы открываете файл, помещаете две ссылки в ячейки этого файла, закрываете его, помещаете те же ссылки в тело письма и отправляете его кучке людей?
Основной целью кодирования является удаление повторяющиеся / избыточные задачи или "вещи" полностью , а не только для автоматизациивашего обращения с ними .
О боже, скажите мне, что никто не сохраняет каждый из них в папке с датой в качестве имени файла, для исторических записей. И omg, я надеюсь, что каждый пользователь не делает это отдельно. И некоторые люди печатают каждый день отчет тоже? Конечно, нет... (я вспоминаю свою прежнюю правительственную работу!)
Основываясь на том, что я подумайте ваша конечная цель состоит в том, что вы должнызабыть об электронной почте вообще , разместить файл(Ы) В общем месте и поделиться ссылкой. Это может быть общее расположение во внутренней сети, или если у всех нет доступа к сети, то общедоступное расположение общего доступа к файлам (OneDrive-один из многих бесплатных вариантов).
Таким образом:
Вы только должны поделиться ссылка (только один раз!) с тем, кто нуждается доступ.
Вы точно знаете, что все смотрят на одну и ту же версию.
Вы можете обновлять файл так часто или так мало, как это необходимо, даже нерегулярно, или при необходимости мгновенно удалить его. ("ой, там была большая ошибка на том, который мы послали сегодня утром! Все прекратите смотреть на него сейчас же!")
При необходимости вы можете добавлять и удалять разрешения. Возможно, некоторые пользователи могли бы извлечь выгоду из возможности изменять файл, в то время как другим нельзя этого позволять. (Склоняйтесь ко 2-му варианту, если 1-й не является выгодным.)
Если кто-то печатает файл, остановите его! Есть причины, по которым общество в целом близко к безбумажности. Помимо сохранения деревьев, применяются некоторые из тех же причин, почему не иметь несколько копий одного и того же файла, только хуже, так как неправильные бумажные копии еще труднее удалить.
Есть много других преимуществ... но это только один из вариантов. Вы дали вашей идее метода распределения хороший выстрел и попытались заставить ее работать (как и другие для вас), но иногда правильный ответ на другой вопрос.
Получите еще несколько идей, потратив некоторое время на поиск вариантов:
Как поделиться диаграммой с другими
Безопасность общих файлов
Как подобная компания xyz распространяет отчеты?
Совместное использование конфиденциальных данных Excel в публичных сетях
Почему плохо отправлять ежедневные отчеты по электронной почте
Этикет деловой электронной почты
Как избежать перегрузки получателей
Создание и распространение отчетов люди будут хотеть читать
...и т.д...
.
или, я мог бы быть на совершенно неправильном пути с почему/когда/как/где / кто, но это все, что у меня есть с тем, что я понял о вашем вопрос.




Comments