查找列中更改的所有单元格并将其放入变量中

时间:2014-09-16 08:31:30

标签: excel vba excel-vba

我在Sheet2中有一个用宏(“新项目”)更改的列。每次运行该宏时,C列中的单元格都会更改其内容。

我希望使用“new item”宏(从C列中的单元格)添加所有字符串,并将所有字符串放在变量中。我需要将该变量(包含更改的单元格内容)发送到电子邮件中。

我想我必须使用下面的功能,但我不知道如何做我需要的。下面的代码不起作用。

 Private Sub Worksheet_Change(ByVal Target As Range)
     'if column C changes
     If Target.Address = Sheet(2).Range("C15:C"&lastRow) Then 
         dim var as string

         'put the contents of cells changed in the variable "var"
         var=range("?").Value
     End If       
 End Sub

2 个答案:

答案 0 :(得分:2)

我建议采用不同的方法。原因很简单。每次更改单元格时都会触发Worksheet_Change,这会降低代码速度。

当该宏启动时(在Sheet2中更改 Col C 的那个),在{temp}中复制 Col C 在宏结束之前,将 Col C 再次从Sheet2复制到临时表,然后简单地比较两列以检查更改的内容。

例如( UNTESTED

Sheet2

答案 1 :(得分:1)

我看到的直接问题是:

  • 如上所述,如果细胞在中,会发生什么 第14行下面的C列被改变了 除了“新物品”之外宏?
  • 许多宏(可能是' New Item')在他们的期间使用Application.EnableEvents = False 操作,这有效地取消了WorkSheet_Change事件。需要确认“新项目”并非如此。宏。

重写原始回复。这包括将更改通过电子邮件发送为通知的子例程。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("C15:C" & Cells(Rows.Count, 3).End(xlUp).Row)) Is Nothing Then
        On Error GoTo FallThrough
        Application.EnableEvents = False
        Dim c As Range, cs As String
        For Each c In Intersect(Target, Range("C15:C" & Cells(Rows.Count, 3).End(xlUp).Row))
            cs = cs & c.Address(0, 0) & ": " & c.Value & " - " & Format(Now, "dd-mmm-yyyy hh:mm") & Chr(10)
        Next c
        cs = Left(cs, Len(cs) - 1)
        Call mcr_Email_Notification("New Item Notification", cs)
    End If
FallThrough:
    Application.EnableEvents = True
End Sub

Sub mcr_Email_Notification(sSBJ As String, sBDY As String)
    Dim objOL As Outlook.Application, objOLMSG As Outlook.MailItem
    Set objOL = CreateObject("Outlook.Application")
    Set objOLMSG = objOL.CreateItem(olMailItem)
    With objOLMSG
        .To = "some.recipient@null.com"  'change this
        .Subject = sSBJ
        .HTMLBody = "<html><body>" & Replace(sBDY, Chr(10), "<br/>") & "</body></html>"
        .send
    End With
    Set objOLMSG = Nothing
    Set objOL = Nothing
End Sub

电子邮件通知例程需要添加工具,引用,Microsoft Outlook 15.0对象库(或等效项)。我已经测试并收到了电子邮件中第14行下方C栏所做更改/添加的详细信息。

此代码属于工作表代码表,而不是模块代码表。右键单击工作表名称选项卡,然后选择查看代码。当VBE打开时,将其粘贴到标题为 Book1 - Sheet2(Code)的窗格中。