2016-07-13 81 views
0

有些古怪我在這裏不理解。這裏的小例程啓動一個電子郵件組成窗口。 Target.Row在單擊時返回正確的行,並在作爲單獨變量完成時正確連接(請參閱中部的章節)。當我在'With MItem'塊中直接使用它時,它會從電子表格的下一行中取出值,而不是由Target.Row值指示的行。例如:第3行被點擊,並加載第4行的值。當我使用預串聯變量時,它會拉出正確的單元格值。有任何想法嗎??預先感謝您的幫助。Target.Row無法在VBA中正常工作

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    ' checking to see if update number cell is picked 
    If Not Intersect(Target, Range("B3:B50")) Is Nothing Then 
     ' testing for blank subject box 
     If (Worksheets("Email").Range("C" & Target.Row).Value <> "") Then 
      ' initialize variables 
      Dim OutlookApp As Outlook.Application 
      Dim MItem As Outlook.MailItem 
      Dim sBlock As String 


      ' ???? 
      Dim nTest As Integer 
      Dim sRange As String 
      nTest = Target.Row 
      sRange = "C" & Target.Row     

      ' creating html signature block 
      sBlock = "<br><br><font size=4>Name Here</font><br>" 
      sBlock = sBlock & "<font size=2><b>Title</b><br>" 
      sBlock = sBlock & "<b>phone 1</b><br>" 
      sBlock = sBlock & "<b>phone 2</b></font><br>" 

      'Create Outlook object 
      Set OutlookApp = New Outlook.Application 

      'Create Mail Item and view before sending 
      Set MItem = OutlookApp.CreateItem(olMailItem) 
      With MItem 
       .To = Worksheets("Emails").Range("D" & Target.Row).Value 
       .Subject = Worksheets("Emails").Range("C" & Target.Row).Value 
       .HTMLBody = Worksheets("Emails").Range("E" & Target.Row).Value & sBlock 
       .Display 
      End With 
     End If 
    End If 
End Sub 
+2

如果它是一致的,如果您沒有聽到有關爲什麼更好的答案,可以使用(「D」和Target.Row -1)。 ...另外,我不認爲你有一個名爲電子郵件和另一個命名的電子郵件的工作表,他們是不同的一行被抵消?您的第5行引用了「電子郵件」,並且您的屏蔽使用了「電子郵件」 – Rodger

+1

僅供參考,您應該添加代碼以確認「目標」僅爲單個單元格,否則如果要選擇多個單元格,則可能會引發錯誤 – RGA

+0

另一個FYI - 如果用戶已經設置了默認簽名,您可以在[這個問題]中使用接受的答案(http://stackoverflow.com/questions/8994116/how-to-add-default-signature-in-outlook )這可能會幫助你。 –

回答

0

使用Worksheet_Change事件和類似RGA評論我會檢查,看看是否多於一個小區正在被改變。

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Cells.Count > 1 Then Exit Sub 

       ... Your Code..... 

End Sub 
+0

**使用Worksheet_change時總是**並且目標考慮循環,因爲用戶可以這樣做 - 無論您保護工作表 - _Private Sub Worksheet_Change(作爲範圍的ByVal目標)_ ** Dim ItemInRange作爲範圍**對於目標中的每個ItemInRange '您的代碼.... Next ItemInRange – Sgdva

+0

謝謝你的想法 –

+0

這是因爲用戶可能會刪除多個數據,甚至它不會落入您的狀況,它會設置一個錯誤異常,因爲目標只是「一個_celled_」 – Sgdva