2015-09-18 120 views
1

我試圖讓我的用戶輕鬆地從他們的Excel電子表格中發送電子郵件,他們喜歡用它作爲數據輸入和操作的前端。我的意圖是編寫一個函數:從HYPERLINK運行VBA()

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和M2我需要注入到將生成的電子郵件中的值。用戶也將獲得H3,I3,M3,H4,I4,M4等數據。

這實際上可以正常工作,但是當我在電子表格中顯示超鏈接時,只要Excel檢測到鏈接上的鼠標懸停,就會觸發事件。我希望這樣做,所以鏈接是可點擊的,並且只有在用戶點擊了之後才能激活功能

有沒有辦法做到這一點?

我的搜索已經空了,基本上建議人們從VBA本身手動創建每個單元的鏈接。由於我的用戶存儲的數據集將隨着時間的推移而增長,因此每次用戶添加記錄時都需要創建新的「發送電子郵件」鏈接。

+0

嘿傢伙!感謝您提供了令人敬畏的建議,目前我一直處於其他項目的中間,但我很快就會標記出首選答案!抱歉抱歉,這件事對我來說還是很有意義的! –

回答

2

只在一個點擊,你可以嘗試輸入的子地址運行功能此方法不會在主vba線程上執行,因此爲了測試您可以在代碼中插入語句而不是逐步執行,例如:

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

不錯!比我的答案簡單得多... –

+0

運行udfs的超鏈接的這種特性似乎鮮爲人知,但對於避免事件代碼可能非常有用。使用''#generateEmail(「&CELL(」address「,(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/

這種超鏈接只會在點擊時觸發。

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

,然後在代碼中添加一個額外的行返回當前地址:

Function generateEmail(name, manager, cc) 

Set generateEmail = Selection 
'Paste Outlook Code Here 

End Function 

+0

這是不可能的,可悲的是,我試圖超鏈接到mailto其他時間,我碰到了HYPERLINK()的長度限制... ... –