2017-09-27 6 views
-1

良い一日に、1つのブックに2つのプライベートマクロを作成する必要があります.1つはセルの内容を保存し、もう1つはセルの新しい値を保存し、セル内の古いテキストとセル内の新しいテキスト。Private Sub Worksheet_SelectionChange/Worksheet_Change

これは正しい方法(またはそれが可能なのかどうか)はわかりませんが、プライベートマクロでは頻繁には動作しませんので、助けていただければ幸いです。どうもありがとう!私はこれまで得たものである

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
If Target.Cells.Count > 1 Then Exit Sub 
OldCellValue = ActiveCell.text 
old_value = OldCellValue 
End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 

Dim Area As Range 
Dim OutlApp As Object 
Dim IsCreated As Boolean 
Dim cell As String 
Dim old_value As String 
Dim new_value As String 

Set Area = Range("A1:E20") 

If Target.Cells.Count > 1 Then Exit Sub 

If Not Intersect(Target, Area) Is Nothing Then 

cell = ActiveCell.Address 
new_value = ActiveCell.text 

On Error Resume Next 
Set OutlApp = GetObject(, "Outlook.Application") 
If Err Then 
    Set OutlApp = CreateObject("Outlook.Application") 
    IsCreated = True 
End If 
OutlApp.Visible = True 
On Error GoTo 0 

With OutlApp.CreateItem(0) 

    .Subject = "Change in table" 
    .to = "someones email" 
    .HTMLBody = "Change in cell " & "<B>" & cell & "</B><br>" _ 
       & "Old value: " & old_value & "New value: " & new_value 

    On Error Resume Next 
    .Send 
    Application.Visible = True 
    On Error GoTo 0 

End With 

If IsCreated Then OutlApp.Quit 

Set OutlApp = Nothing 

End With 

End If 

End Sub 
+0

あなたの問題は何ですか - コードがうまくいかず、あなたがしたいことはありません.... – SJR

+0

このコードは機能しません。クリックするとセルからテキストが読み込まれますが、変更を加えてEnterキーを押すと、old_valueの変数が変更される次の行に移動します。時には、セルにテキストがあり、その下にセルがある場合でも、old_valueに空のセルが表示されることさえありました。 –

答えて

0

ないすべてのコードを書いて、再しかし、本質的に、あなたは、セルが選択されたときに値を格納するためにこれをしなければならないし、それが変更された後、 。ターゲットがそれをキャプチャするので、newcellvalue変数は必要ありません。

Dim OldCellValue 

Private Sub Worksheet_Change(ByVal Target As Range) 

Dim newcellvalue 

newcellvalue = Target.Value 

MsgBox "Old " & OldCellValue & ", New " & newcellvalue 

End Sub 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

OldCellValue = Target.Value 

End Sub 
+1

それは働いた!グローバル変数とターゲットは、そうでないと鉱山コードが同じであったため、うまく機能しました。ありがとうございました。この問題で助けが必要な人のためのあなたの投稿を回答としてマークしてください。 –

+0

ありがとうございます。はい、私はそれをグローバル変数にすることが主なことだと言及すべきでした。 – SJR

0

あなたは正しい方向にいると思います。グローバル変数を使用して現在/古い値を追跡し、Worksheet_Changeイベントで比較することができます。

このような何か:

Private old_value As String 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

    If Target.Cells.Count > 1 Then Exit Sub 

    old_value = Target.Text 

    'Debug to check the old_value 
    'Debug.Print "old_value = " + old_value 
End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim Area As Range 
    Dim OutlApp As Object 
    Dim IsCreated As Boolean 
    Dim cell As String 
    Dim new_value As String 

    Set Area = Range("A1:E20") 

    If Target.Cells.Count > 1 Then Exit Sub 

    If Not Intersect(Target, Area) Is Nothing Then 
     new_value = Target.Text 

     'Debug to compare values 
     'Debug.Print "new_value = " + new_value 
     'Debug.Print "old_value = " + old_value 

     If new_value <> old_value Then 
      'Debug to compare 
      'Debug.Print "new_value and old_value are different" 
     End If 
    End If 
End Sub 

はWorksheet_SelectionChangeイベントはあなたがセル間を移動するたびを発射しようとしていることに注意してください。したがって、セルの値を変更してEnterキーを押すと、Worksheet_SelectionChangeイベントの値をリセットするため、old_valueの値が変更されます。選択を変更する前に、比較を実行して電子メールを送信する必要があります。

また、おそらく、.Textの代わりにセルに.Valueを使用したいと思うでしょう。相違点については、次の記事を参照してください。What is the difference between .text, .value, and .value2?

+0

ありがとうございました。グローバル変数を使用することが有効にする鍵でした。 –