2017-09-27 106 views
-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

不重新編寫所有的代碼,但在本質上,你必須選擇單元格時要做到這一點儲存的值,然後改變後。 Target不需要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鍵,則old_value的值將因Worksheet_SelectionChange事件中的值重置而發生變化。在選擇更改之前,您需要執行比較併發送電子郵件。

此外,您可能會想使用.Value而不是.Text單元格。看到這個職位的差異:What is the difference between .text, .value, and .value2?

+0

非常感謝您的幫助。使用全局變量是使其工作的關鍵。 –