2016-07-13 15 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

あなたは 'Target'が単一のセルだけであることを確認するコードを追加する必要があります。 – RGA

+0

もう1つのFYI - ユーザーに既定の署名が既に設定されている場合、[この質問]で承認された回答を使用することができます(http://stackoverflow.com/questions/8994116/how-to-add-default-signature-in-outlook )あなたを助けるかもしれない。 –

答えて

0

使用Worksheet_ChangeイベントとRGAのように、私はもっとして1つのセルは変更されているかどうかをチェックしますコメントしました。

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はRange ** Targetの各ItemInRange 'あなたのコード....次のItemInRange – Sgdva

+0

ありがとう良いアイデア –

+0

これは、ユーザーが複数のデータを削除する可能性があり、条件に該当しない場合でも、ターゲットが "one _celled_" – Sgdva

関連する問題