Vba 专用子工作表\选择更改/工作表\更改

Vba 专用子工作表\选择更改/工作表\更改,vba,excel,worksheet-function,Vba,Excel,Worksheet Function,您好,我需要在一个工作簿中创建两个专用宏-一个用于在单击单元格后存储单元格内容,另一个用于存储单元格的新值,并发送和发送电子邮件,其中单元格中包含旧文本正文,单元格中包含新文本 说实话,我不确定这是不是正确的方法(或者是否可能),但我不经常使用私有宏,所以我会感谢任何帮助。非常感谢 这就是我到目前为止得到的: Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Cells.Count > 1 Then

您好,我需要在一个工作簿中创建两个专用宏-一个用于在单击单元格后存储单元格内容,另一个用于存储单元格的新值,并发送和发送电子邮件,其中单元格中包含旧文本正文,单元格中包含新文本

说实话,我不确定这是不是正确的方法(或者是否可能),但我不经常使用私有宏,所以我会感谢任何帮助。非常感谢

这就是我到目前为止得到的:

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
Private子工作表\u selection更改(ByVal目标作为范围)
如果Target.Cells.Count>1,则退出Sub
OldCellValue=ActiveCell.text
old_值=OldCellValue
端接头
私有子工作表_更改(ByVal目标作为范围)
模糊区域作为范围
作为对象的对象
Dim被创建为布尔值
将单元格变暗为字符串
将旧值设置为字符串
将新值设置为字符串
设置区域=范围(“A1:E20”)
如果Target.Cells.Count>1,则退出Sub
如果不相交(目标、面积)则为零
cell=ActiveCell.Address
新值=ActiveCell.text
出错时继续下一步
Set extlapp=GetObject(,“Outlook.Application”)
如果有错误,那么
设置extlapp=CreateObject(“Outlook.Application”)
IsCreated=True
如果结束
extlapp.Visible=True
错误转到0
使用extlapp.CreateItem(0)
.Subject=“表中的更改”
.to=“某人的电子邮件”
.HTMLBody=“单元格中的更改”&“&cell&”
”_ &“旧值:”&旧值和“新值:”&新值 出错时继续下一步 .发送 Application.Visible=True 错误转到0 以 如果已创建,则取缔。退出 设置为“无” 以 如果结束 端接头
不必重新编写所有代码,但本质上您必须这样做,以便在选择单元格时以及更改单元格后存储值。您不需要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

我认为你的思路是对的。我将使用一个全局变量来跟踪当前/旧值,以便您可以在工作表\u更改事件中对其进行比较

大概是这样的:

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
Private old_值作为字符串
专用子工作表\u选择更改(ByVal目标作为范围)
如果Target.Cells.Count>1,则退出Sub
旧值=Target.Text
'调试以检查旧的_值
'Debug.Print“old_value=“+old_value
端接头
私有子工作表_更改(ByVal目标作为范围)
模糊区域作为范围
作为对象的对象
Dim被创建为布尔值
将单元格变暗为字符串
将新值设置为字符串
设置区域=范围(“A1:E20”)
如果Target.Cells.Count>1,则退出Sub
如果不相交(目标、面积)则为零
新值=Target.Text
'调试以比较值
'Debug.Print“new_value=“+new_value
'Debug.Print“old_value=“+old_value
如果新值为旧值,则
'调试以进行比较
'Debug.Print“新值和旧值不同”
如果结束
如果结束
端接头
请记住,每次在单元格之间导航时,都会触发工作表\u SelectionChange事件。因此,如果您更改单元格的值并按Enter键,则旧值的值将更改,因为您正在工作表\u SelectionChange事件中重置该值。在选择更改之前,您需要执行比较并发送电子邮件


此外,您可能希望在单元格中使用.Value而不是.Text。有关差异,请参阅本文:

您的问题是什么-代码不起作用,不是做您想做的事….?此代码不起作用。当我单击时,它将从单元格中加载文本,但当我进行更改并按Enter键时,它将移动到下一行,该行将根据旧的_值更改变量。有时它甚至会在旧的_值中显示空单元格,即使单元格中及其下的单元格中都有文本。它工作了!Probably全局变量和目标使其工作,因为除此之外,我的代码是相同的。非常感谢你的帮助。将您的帖子标记为在这件事上需要帮助的人的答案。谢谢。是的,我应该提到把它变成一个全局变量是最重要的。谢谢你的帮助。使用全局变量是使其工作的关键。