2015-09-18 16 views
1

Я пытаюсь, чтобы мои пользователи могли легко отправлять электронную почту из своих электронных таблиц Excel, которые они хотели бы использовать в качестве интерфейсов для ввода и обработки данных. Мое намерение состоит в том, чтобы написать функцию:Запуск VBA от HYPERLINK()

generateEmail(name, manager, cc) 

и сделать так, чтобы функция могла быть вызвана как-довольная пользователем.

В этом случае Excel вызывает Outlook, создает новое письмо и выгружает текст, содержащий отформатированное электронное письмо для отправки, которое будет содержать некоторые значения, изменяющиеся динамически в строке из таблицы, в которой они в настоящее время работают. Это функция VBA:

Function generateEmail(name, manager, cc) 
    Dim OutApp As Object 
    Dim OutMail As Object 
    Dim strbody As String 

    Set OutApp = CreateObject("Outlook.Application") 
    Set OutMail = OutApp.CreateItem(0) 

    strbody = "To Service Desk:" & vbNewLine & vbNewLine & _ 
       "Please open a ticket for CS/oe/ns/telecom/dal to request a new extension. Please find the details attached:" & vbNewLine & vbNewLine & _ 
       "Name: " & name & vbNewLine & _ 
       "Manager: " & manager & vbNewLine & _ 
       "CC: " & cc 

    On Error Resume Next 
    With OutMail 
     .To = "[email protected]" 
     .cc = "" 
     .BCC = "" 
     .Subject = "New Extension Request" 
     .Body = strbody 
     .Display 
    End With 
    On Error GoTo 0 

    Set OutMail = Nothing 
    Set OutApp = Nothing 

End Function 

Затем в крайнем правом столбце таблицы, я добавляю это, я сделать столбец ссылок:

=HYPERLINK(generateEmail(H2, I2, M2), "Generate Email") 

Где H2, I2 и М2 значения, которые мне нужно ввести в электронное письмо, которое будет создано. Пользователи также будут иметь данные по H3, I3, M3, H4, I4, M4 ... и так далее.

Это действительно работает так, как ожидалось, однако, когда я создаю гиперссылку, отображаемую в электронной таблице, она запускает событие, как только Excel обнаруживает наводку по ссылке. Я хотел бы сделать так, чтобы ссылки были кликабельными и запускали функцию только после того, как пользователь нажал.

Есть ли способ сделать это?

Мои поиски опустели, в основном, советуя людям создавать ссылки вручную на ячейку от самого VBA. Поскольку набор данных, хранящийся моими пользователями, со временем будет расти, мне нужен способ создать новую ссылку «Отправить электронную почту» каждый раз, когда пользователь добавит запись.

+0

Эй, ребята! Спасибо за ваши замечательные предложения, я был в центре других проектов на данный момент, но скоро буду отмечать предпочтительный ответ! Извините за задержку, этот вопрос по-прежнему очень важен для меня! –

ответ

2

Чтобы запустить функцию только на один клик вы можете попытаться войти в подадресу:

=HYPERLINK("#generateEmail(H2, I2, M2)", "Generate Email") 

, а затем добавить дополнительную строку в код, чтобы вернуть текущий адрес:

Function generateEmail(name, manager, cc) 

Set generateEmail = Selection 
'Paste Outlook Code Here 

End Function 

Примечание этот метод не выполняется на главном потоке vba, поэтому для проверки вы можете вставлять операторы в код вместо того, чтобы проходить через, например:

Range("A10:C10") = Array(name, manager, cc) 
+0

Nice! Гораздо проще, чем мой ответ ... –

+0

Эта функция гиперссылок для запуска udfs кажется малоизвестной, но может быть весьма полезна для предотвращения кода события. Чтобы сделать ссылки динамическими, попробуйте с помощью '' #generateEmail ("& CELL (" адрес ", (H2, I2, M2)) &") "или" "#generateEmail (rc [-6], rc [-5], rc [-1]) "' [относительно 'N2'] или другой udf. –

+0

Я не понимаю, когда я это делаю, он просто говорит, что «Ссылка недействительна». Должна ли функция идти куда-то особенным? Есть ли какая-то другая конфигурация, которую мне не хватает? –

0

Я столкнулся с подобными ограничениями на проект. Мне пришлось отказаться от использования гиперссылки и создать обходное решение, используя событие Worksheet_SelectionChange. Если предположить, что ваша формула должна была быть на N колонке, пожалуйста, рассмотреть вопрос, используя следующий код, вставленный на целевом листе (не в модуле):

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

    If Target.Column = 14 Then 
     Call generateEmail(Target.Offset(0, -6).Value2, Target.Offset(0, -5).Value2, Target.Offset(0, -1).Value2) 
    End If 

End Sub 

Затем вы можете добавить любой текст, который вы хотите в этой колонке (т.е. «Отправить письмо"), и когда кто-то нажимает на эту ячейку ваш код будет срабатывать именно с данными из этой строки Надеюсь, что это помогает Привет

0

Использование гиперссылок для запуска действий немного сложнее:...

  • HYPERLINK() ссылки не вызывают Worksheet_FollowHyperlink обработчики событий
  • При использовании ссылок типа «Вставить гиперссылку» вам нужен действительный адрес цели, и это может привести к тому, что выбор начнется, когда пользователь нажмет на ссылку.

Вот один подход - место этот код в модуль листа:

Option Explicit 

Dim oldAdd As String 

'When a link is clicked, this gets triggered first 
' if the clicked cell has a hyperlink, remember its address 
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    Dim c As Range 

    'only want single-cell selections... 
    If Target.Cells.CountLarge > 1 Then 
     Exit Sub 
    Else 
     'cell has a link? Remember the address... 
     If Target.Hyperlinks.Count > 0 Then 
      oldAdd = Target.Address() 
     End If 
    End If 
End Sub 

'This is called immediately after the SelectionChange event, 
' so we can use the stored address to reset the selection back 
' to the clicked cell, instead of wherever its link was pointing to 
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink) 

    Dim c As Range 

    If oldAdd <> "" Then 
     Set c = Me.Range(oldAdd) 
     c.Select 'undo any navigation 
     'Here you could switch on the link text if you have 
     ' links which need to trigger different actions 
     If c.Value = "Send Mail" Then 
      MsgBox "Sending mail!" 
      'generateEmail [use values from cells relative to c] 
     End If 
    End If 

End Sub 

Предполагает все ссылки указывают на тот же лист, как один ссылки включены.

-1

Тело письма не выглядит слишком длинным для использования с гиперссылкой mailto.Рассмотрим http://www.datapigtechnologies.com/blog/index.php/emailing-from-excel-using-the-hyperlink-function/

Гиперссылка таким образом срабатывала бы только при нажатии.

+0

Это невозможно, к сожалению, я попытался гиперссылку на mailto в другой раз, и я натолкнулся на ограничение длины для HYPERLINK() ... –

Смежные вопросы