[英]Get value of cell on click and store as variable in worksheet_selectionChange sub and then pass variable to worksheet_Change sub?
[英]Private Sub Worksheet_SelectionChange/Worksheet_Change
美好的一天,我需要在一個工作簿中創建 2 個私有宏 - 一個在單擊它后存儲單元格的內容,第二個將存儲單元格的新值並發送和電子郵件與單元格中的舊文本和新文本的正文細胞。
說實話,我不確定這是否是正確的方法(或者甚至可能),但我不經常使用私有宏,所以我將不勝感激。 非常感謝!
這就是我到目前為止所得到的:
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
不是重新編寫所有代碼,但本質上您必須這樣做才能在選擇單元格時存儲值,然后在更改后存儲值。 您不需要 newcellvalue 變量,因為 Target 會捕獲它。
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
我認為你在正確的軌道上。 我將使用全局變量來跟蹤當前/舊值,以便您可以在 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?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.